@lumeer/pivot 0.0.3 → 0.0.6
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/esm2022/lib/lmr-pivot-table.component.mjs +12 -6
- package/esm2022/lib/lmr-pivot-table.module.mjs +12 -3
- package/esm2022/lib/lmr-simple-pivot-table.component.mjs +98 -0
- package/esm2022/lib/util/lmr-pivot-config.mjs +1 -1
- package/esm2022/lib/util/lmr-pivot-data.mjs +1 -1
- package/esm2022/lib/util/lmr-simple-pivot-config.mjs +2 -0
- package/esm2022/lib/util/pivot-data-converter.mjs +20 -15
- package/esm2022/lib/util/pivot-table-converter.mjs +237 -65
- package/esm2022/public-api.mjs +3 -1
- package/fesm2022/lumeer-pivot.mjs +370 -86
- package/fesm2022/lumeer-pivot.mjs.map +1 -1
- package/lib/lmr-pivot-table.component.d.ts +5 -3
- package/lib/lmr-pivot-table.module.d.ts +8 -6
- package/lib/lmr-simple-pivot-table.component.d.ts +32 -0
- package/lib/util/lmr-pivot-config.d.ts +26 -5
- package/lib/util/lmr-pivot-data.d.ts +23 -7
- package/lib/util/lmr-simple-pivot-config.d.ts +9 -0
- package/lib/util/pivot-data-converter.d.ts +1 -1
- package/lib/util/pivot-table-converter.d.ts +13 -3
- package/lumeer-pivot-0.0.6.tgz +0 -0
- package/package.json +3 -2
- package/public-api.d.ts +2 -0
- package/lumeer-pivot-0.0.3.tgz +0 -0
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
* You should have received a copy of the GNU General Public License
|
|
17
17
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
18
18
|
*/
|
|
19
|
-
import { DataAggregationType, NumberConstraint, PercentageConstraint, UnknownConstraint,
|
|
19
|
+
import { aggregateDataValues, DataAggregationType, isValueAggregation, NumberConstraint, PercentageConstraint, UnknownConstraint, } from '@lumeer/data-filters';
|
|
20
20
|
import { deepObjectCopy, isArray, isNotNullOrUndefined, isNullOrUndefined, isNumeric, shadeColor, toNumber, uniqueValues, } from '@lumeer/utils';
|
|
21
21
|
import { LmrPivotValueType } from './lmr-pivot-config';
|
|
22
22
|
import { COLOR_GRAY100, COLOR_GRAY200, COLOR_GRAY300, COLOR_GRAY400, COLOR_GRAY500 } from './lmr-pivot-constants';
|
|
@@ -26,12 +26,13 @@ export class PivotTableConverter {
|
|
|
26
26
|
static groupDataClass = 'pivot-data-group-cell';
|
|
27
27
|
static rowHeaderClass = 'pivot-row-header-cell';
|
|
28
28
|
static rowGroupHeaderClass = 'pivot-row-group-header-cell';
|
|
29
|
+
static rowAttributeHeaderClass = 'pivot-row-attribute-header-cell';
|
|
29
30
|
static columnHeaderClass = 'pivot-column-header-cell';
|
|
30
31
|
static columnGroupHeaderClass = 'pivot-column-group-header-cell';
|
|
31
32
|
groupColors = [COLOR_GRAY100, COLOR_GRAY200, COLOR_GRAY300, COLOR_GRAY400, COLOR_GRAY500];
|
|
32
33
|
percentageConstraint = new PercentageConstraint({ decimals: 2 });
|
|
33
34
|
data;
|
|
34
|
-
|
|
35
|
+
transform;
|
|
35
36
|
values;
|
|
36
37
|
dataResources;
|
|
37
38
|
constraintData;
|
|
@@ -41,11 +42,12 @@ export class PivotTableConverter {
|
|
|
41
42
|
columnsTransformationArray;
|
|
42
43
|
valueTypeInfo;
|
|
43
44
|
nonStickyRowIndex;
|
|
44
|
-
|
|
45
|
+
nonStickyColumnIndex;
|
|
46
|
+
createTables(pivotData, transform) {
|
|
45
47
|
if (!pivotData) {
|
|
46
48
|
return [{ cells: [] }];
|
|
47
49
|
}
|
|
48
|
-
this.
|
|
50
|
+
this.transform = transform;
|
|
49
51
|
this.constraintData = pivotData.constraintData;
|
|
50
52
|
return (pivotData.data || []).map(d => {
|
|
51
53
|
if (this.dataAreEmpty(d)) {
|
|
@@ -62,11 +64,14 @@ export class PivotTableConverter {
|
|
|
62
64
|
const numberOfSums = Math.max(1, (data.valueTitles || []).length);
|
|
63
65
|
this.valueTypeInfo = getValuesTypeInfo(data.values, data.valueTypes, numberOfSums);
|
|
64
66
|
this.data = preparePivotData(data, this.constraintData, this.valueTypeInfo);
|
|
65
|
-
this.nonStickyRowIndex = this.data.rowSticky?.findIndex(sticky => !sticky) || 0;
|
|
66
67
|
this.values = data.values || [];
|
|
67
68
|
this.dataResources = data.dataResources || [];
|
|
68
|
-
this.rowLevels = (data.
|
|
69
|
-
this.columnLevels = (data.
|
|
69
|
+
this.rowLevels = (data.rowsConfig || []).length;
|
|
70
|
+
this.columnLevels = (data.columnsConfig || []).length + (data.hasAdditionalColumnLevel ? 1 : 0);
|
|
71
|
+
const rowAllSticky = this.data.rowsConfig?.length && this.data.rowsConfig.every(config => !!config?.sticky);
|
|
72
|
+
this.nonStickyRowIndex = Math.max(rowAllSticky ? this.rowLevels : (this.data.rowsConfig?.findIndex(config => !config?.sticky) || 0), 0);
|
|
73
|
+
const columnAllSticky = this.data.columnsConfig?.length && this.data.columnsConfig.every(config => !!config?.sticky);
|
|
74
|
+
this.nonStickyColumnIndex = Math.max(columnAllSticky ? this.columnLevels : (this.data.columnsConfig?.findIndex(config => !config?.sticky) || 0), 0);
|
|
70
75
|
const hasValue = (data.valueTitles || []).length > 0;
|
|
71
76
|
if ((this.data.rowHeaders || []).length > 0) {
|
|
72
77
|
this.rowsTransformationArray = createTransformationMap(this.data.rowHeaders, this.rowShowSums, this.columnLevels, 1);
|
|
@@ -82,10 +87,10 @@ export class PivotTableConverter {
|
|
|
82
87
|
}
|
|
83
88
|
}
|
|
84
89
|
get rowShowSums() {
|
|
85
|
-
return this.data.
|
|
90
|
+
return (this.data.rowsConfig || []).map(config => config.showSums);
|
|
86
91
|
}
|
|
87
92
|
get columnShowSums() {
|
|
88
|
-
return this.data.
|
|
93
|
+
return (this.data.columnsConfig || []).map(config => config.showSums);
|
|
89
94
|
}
|
|
90
95
|
transformData() {
|
|
91
96
|
const cells = this.initCells();
|
|
@@ -104,7 +109,7 @@ export class PivotTableConverter {
|
|
|
104
109
|
for (const header of headers) {
|
|
105
110
|
const rowSpan = getDirectHeaderChildCount(header, level, showSums);
|
|
106
111
|
cells[currentIndex][level] = {
|
|
107
|
-
value: header.title,
|
|
112
|
+
value: this.formatRowHeader(header.title, level),
|
|
108
113
|
cssClass: PivotTableConverter.rowHeaderClass,
|
|
109
114
|
isHeader: true,
|
|
110
115
|
stickyStart: this.isRowLevelSticky(level),
|
|
@@ -121,41 +126,19 @@ export class PivotTableConverter {
|
|
|
121
126
|
this.fillCellsForRow(cells, header.targetIndex);
|
|
122
127
|
}
|
|
123
128
|
currentIndex += getHeaderChildCount(header, level, showSums);
|
|
129
|
+
const expressions = header.expressions || [];
|
|
130
|
+
for (let i = 0; i < expressions.length; i++) {
|
|
131
|
+
const expressionIndex = currentIndex - (expressions.length - i);
|
|
132
|
+
const background = this.getSummaryBackground(level);
|
|
133
|
+
this.splitRowGroupHeader(cells, level, expressionIndex, background, expressions[i].title);
|
|
134
|
+
this.fillCellsForExpressionRow(cells, expressions[i], expressionIndex, background);
|
|
135
|
+
}
|
|
124
136
|
}
|
|
125
137
|
if (showSums[level]) {
|
|
138
|
+
const { title, summary } = this.formatSummaryHeader(parentHeader, level);
|
|
126
139
|
const background = this.getSummaryBackground(level);
|
|
127
|
-
const summary = level === 0 ? this.strings.summaryString : this.strings.headerSummaryString;
|
|
128
140
|
const columnIndex = Math.max(level - 1, 0);
|
|
129
|
-
|
|
130
|
-
const stickyStart = this.isRowLevelSticky(columnIndex);
|
|
131
|
-
// split row group header cell because of correct sticky scroll
|
|
132
|
-
if (stickyStart && this.nonStickyRowIndex > 0 && colSpan > 1) {
|
|
133
|
-
const newColspan = this.nonStickyRowIndex - columnIndex;
|
|
134
|
-
cells[currentIndex][this.nonStickyRowIndex] = {
|
|
135
|
-
value: undefined,
|
|
136
|
-
constraint: undefined,
|
|
137
|
-
label: undefined,
|
|
138
|
-
cssClass: PivotTableConverter.rowGroupHeaderClass,
|
|
139
|
-
isHeader: true,
|
|
140
|
-
rowSpan: 1,
|
|
141
|
-
colSpan: colSpan - newColspan,
|
|
142
|
-
background,
|
|
143
|
-
summary: undefined,
|
|
144
|
-
};
|
|
145
|
-
colSpan = newColspan;
|
|
146
|
-
}
|
|
147
|
-
cells[currentIndex][columnIndex] = {
|
|
148
|
-
value: parentHeader?.title,
|
|
149
|
-
constraint: parentHeader?.constraint,
|
|
150
|
-
label: parentHeader?.attributeName,
|
|
151
|
-
cssClass: PivotTableConverter.rowGroupHeaderClass,
|
|
152
|
-
isHeader: true,
|
|
153
|
-
stickyStart,
|
|
154
|
-
rowSpan: 1,
|
|
155
|
-
colSpan,
|
|
156
|
-
background,
|
|
157
|
-
summary,
|
|
158
|
-
};
|
|
141
|
+
this.splitRowGroupHeader(cells, columnIndex, currentIndex, background, summary, title, parentHeader?.constraint, parentHeader?.attributeName);
|
|
159
142
|
const rowIndexes = getTargetIndexesForHeaders(headers);
|
|
160
143
|
const transformedRowIndexes = rowIndexes
|
|
161
144
|
.map(v => this.rowsTransformationArray[v])
|
|
@@ -164,6 +147,50 @@ export class PivotTableConverter {
|
|
|
164
147
|
this.fillCellsForGroupedRow(cells, rowIndexes, currentIndex, background);
|
|
165
148
|
}
|
|
166
149
|
}
|
|
150
|
+
splitRowGroupHeader(cells, columnIndex, currentIndex, background, summary, title, constraint, label) {
|
|
151
|
+
let colSpan = this.rowLevels - columnIndex;
|
|
152
|
+
const stickyStart = this.isRowLevelSticky(columnIndex);
|
|
153
|
+
// split row group header cell because of correct sticky scroll
|
|
154
|
+
if (stickyStart && this.nonStickyRowIndex > 0 && this.nonStickyRowIndex < this.rowLevels && colSpan > 1) {
|
|
155
|
+
const newColspan = this.nonStickyRowIndex - columnIndex;
|
|
156
|
+
cells[currentIndex][this.nonStickyRowIndex] = {
|
|
157
|
+
value: undefined,
|
|
158
|
+
constraint: undefined,
|
|
159
|
+
label: undefined,
|
|
160
|
+
cssClass: PivotTableConverter.rowGroupHeaderClass,
|
|
161
|
+
isHeader: true,
|
|
162
|
+
rowSpan: 1,
|
|
163
|
+
colSpan: colSpan - newColspan,
|
|
164
|
+
background,
|
|
165
|
+
summary: undefined,
|
|
166
|
+
};
|
|
167
|
+
colSpan = newColspan;
|
|
168
|
+
}
|
|
169
|
+
cells[currentIndex][columnIndex] = {
|
|
170
|
+
value: title,
|
|
171
|
+
constraint,
|
|
172
|
+
label,
|
|
173
|
+
cssClass: PivotTableConverter.rowGroupHeaderClass,
|
|
174
|
+
isHeader: true,
|
|
175
|
+
stickyStart,
|
|
176
|
+
rowSpan: 1,
|
|
177
|
+
colSpan,
|
|
178
|
+
background,
|
|
179
|
+
summary,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
formatSummaryHeader(header, level) {
|
|
183
|
+
return this.transform.formatSummaryHeader?.(header, level) || {
|
|
184
|
+
title: header?.title,
|
|
185
|
+
summary: '',
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
formatRowHeader(title, level) {
|
|
189
|
+
return this.transform?.formatRowHeader?.(title, level) || title;
|
|
190
|
+
}
|
|
191
|
+
formatColumnHeader(title, level) {
|
|
192
|
+
return this.transform?.formatColumnHeader?.(title, level) || title;
|
|
193
|
+
}
|
|
167
194
|
getHeaderBackground(header, level) {
|
|
168
195
|
if (header?.color) {
|
|
169
196
|
return shadeColor(header.color, this.getLevelOpacity(level));
|
|
@@ -174,11 +201,11 @@ export class PivotTableConverter {
|
|
|
174
201
|
return Math.min(80, 50 + level * 5) / 100;
|
|
175
202
|
}
|
|
176
203
|
isRowLevelSticky(level) {
|
|
177
|
-
return this.data?.
|
|
204
|
+
return this.data?.rowsConfig?.[level]?.sticky;
|
|
178
205
|
}
|
|
179
206
|
isColumnLevelSticky(level) {
|
|
180
|
-
const maxLevel = Math.min(level, (this.data?.
|
|
181
|
-
return this.data?.
|
|
207
|
+
const maxLevel = Math.min(level, (this.data?.columnsConfig?.length ?? Number.MAX_SAFE_INTEGER) - 1);
|
|
208
|
+
return this.data?.columnsConfig?.[maxLevel]?.sticky;
|
|
182
209
|
}
|
|
183
210
|
getSummaryBackground(level) {
|
|
184
211
|
const index = Math.min(level, this.groupColors.length - 1);
|
|
@@ -275,6 +302,58 @@ export class PivotTableConverter {
|
|
|
275
302
|
}
|
|
276
303
|
}
|
|
277
304
|
}
|
|
305
|
+
fillCellsForExpressionRow(cells, expression, rowIndexInCells, background) {
|
|
306
|
+
for (let column = 0; column < this.columnsTransformationArray.length; column++) {
|
|
307
|
+
const columnIndexInCells = this.columnsTransformationArray[column];
|
|
308
|
+
if (isNotNullOrUndefined(columnIndexInCells)) {
|
|
309
|
+
const { value, dataResources } = this.evaluateExpression(expression, column);
|
|
310
|
+
const valueIndex = column % this.data.valueTitles.length;
|
|
311
|
+
const formattedValue = this.formatValueByConstraint(value, valueIndex);
|
|
312
|
+
cells[rowIndexInCells][columnIndexInCells] = {
|
|
313
|
+
value: String(formattedValue),
|
|
314
|
+
dataResources,
|
|
315
|
+
colSpan: 1,
|
|
316
|
+
rowSpan: 1,
|
|
317
|
+
cssClass: PivotTableConverter.groupDataClass,
|
|
318
|
+
isHeader: false,
|
|
319
|
+
background,
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
evaluateExpression(expression, column) {
|
|
325
|
+
return (expression.operands || []).reduce((result, operand, index) => {
|
|
326
|
+
const { value, dataResources } = this.evaluateOperand(operand, column);
|
|
327
|
+
result.dataResources.push(...dataResources);
|
|
328
|
+
switch (expression.operation) {
|
|
329
|
+
case "add":
|
|
330
|
+
result.value += value;
|
|
331
|
+
break;
|
|
332
|
+
case "subtract":
|
|
333
|
+
result.value = (index === 0 ? value : result.value - value);
|
|
334
|
+
break;
|
|
335
|
+
case 'multiply':
|
|
336
|
+
result.value = index === 0 ? value : result.value * value;
|
|
337
|
+
break;
|
|
338
|
+
case 'divide':
|
|
339
|
+
result.value = index === 0 ? value : value ? result.value / value : result.value;
|
|
340
|
+
break;
|
|
341
|
+
}
|
|
342
|
+
return result;
|
|
343
|
+
}, { value: 0, dataResources: [] });
|
|
344
|
+
}
|
|
345
|
+
evaluateOperand(operand, column) {
|
|
346
|
+
switch (operand.type) {
|
|
347
|
+
case "expression": return this.evaluateExpression(operand, column);
|
|
348
|
+
case "value": return { value: operand.value, dataResources: [] };
|
|
349
|
+
case "header": {
|
|
350
|
+
const rows = getTargetIndexesForHeaders(operand.headers);
|
|
351
|
+
const { values, dataResources } = this.getGroupedValuesForRowsAndCols(rows, [column]);
|
|
352
|
+
const { value } = this.aggregateDataValues(values, [column]);
|
|
353
|
+
return { value, dataResources };
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
278
357
|
getGroupedValuesForRowsAndCols(rows, columns) {
|
|
279
358
|
const values = [];
|
|
280
359
|
const dataResources = [];
|
|
@@ -303,7 +382,7 @@ export class PivotTableConverter {
|
|
|
303
382
|
for (const header of headers) {
|
|
304
383
|
const colSpan = getDirectHeaderChildCount(header, level, showSums, numberOfSums);
|
|
305
384
|
cells[level][currentIndex] = {
|
|
306
|
-
value: header.title,
|
|
385
|
+
value: this.formatColumnHeader(header.title, level),
|
|
307
386
|
cssClass: PivotTableConverter.columnHeaderClass,
|
|
308
387
|
isHeader: true,
|
|
309
388
|
rowSpan: 1,
|
|
@@ -323,12 +402,12 @@ export class PivotTableConverter {
|
|
|
323
402
|
}
|
|
324
403
|
if (showSums[level]) {
|
|
325
404
|
const background = this.getSummaryBackground(level);
|
|
326
|
-
const
|
|
405
|
+
const { title, summary } = this.formatSummaryHeader(parentHeader, level);
|
|
327
406
|
const numberOfValues = this.data.valueTitles.length;
|
|
328
407
|
const rowIndex = Math.max(level - 1, 0);
|
|
329
408
|
const shouldAddValueHeaders = numberOfValues > 1;
|
|
330
409
|
cells[rowIndex][currentIndex] = {
|
|
331
|
-
value:
|
|
410
|
+
value: title,
|
|
332
411
|
constraint: parentHeader?.constraint,
|
|
333
412
|
label: parentHeader?.attributeName,
|
|
334
413
|
cssClass: PivotTableConverter.columnGroupHeaderClass,
|
|
@@ -387,14 +466,17 @@ export class PivotTableConverter {
|
|
|
387
466
|
}
|
|
388
467
|
}
|
|
389
468
|
aggregateAndFormatDataValues(values, rows, columns) {
|
|
469
|
+
const { value, aggregation } = this.aggregateDataValues(values, columns);
|
|
470
|
+
return aggregation === DataAggregationType.Join ? value : this.formatGroupedValueByValueType(value, rows, columns);
|
|
471
|
+
}
|
|
472
|
+
aggregateDataValues(values, columns) {
|
|
390
473
|
const aggregation = this.aggregationByColumns(columns);
|
|
391
474
|
if (aggregation === DataAggregationType.Join) {
|
|
392
475
|
const valueIndex = this.getValueIndexForColumns(columns);
|
|
393
476
|
const constraint = this.data.valuesConstraints?.[valueIndex] || this.valueTypeInfo[valueIndex]?.defaultConstraint;
|
|
394
|
-
return aggregateDataValues(aggregation, values, constraint, false, this.constraintData);
|
|
477
|
+
return { value: aggregateDataValues(aggregation, values, constraint, false, this.constraintData), aggregation };
|
|
395
478
|
}
|
|
396
|
-
|
|
397
|
-
return this.formatGroupedValueByValueType(aggregatedValue, rows, columns);
|
|
479
|
+
return { value: aggregateDataValues(aggregation, values), aggregation };
|
|
398
480
|
}
|
|
399
481
|
aggregationByColumns(columns) {
|
|
400
482
|
const valueIndex = columns[0] % this.data.valueTitles.length;
|
|
@@ -509,17 +591,44 @@ export class PivotTableConverter {
|
|
|
509
591
|
}
|
|
510
592
|
}
|
|
511
593
|
if (this.rowLevels > 0 && this.columnLevels > 0) {
|
|
512
|
-
for (let
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
594
|
+
for (let j = 0; j < this.rowLevels; j++) {
|
|
595
|
+
const rowHeaderAttribute = this.data.rowHeaderAttributes[j];
|
|
596
|
+
if (rowHeaderAttribute) {
|
|
597
|
+
const titleColSpan = this.nonStickyColumnIndex || this.columnLevels;
|
|
598
|
+
matrix[0][j] = {
|
|
599
|
+
value: rowHeaderAttribute.title,
|
|
600
|
+
cssClass: PivotTableConverter.rowAttributeHeaderClass,
|
|
601
|
+
isHeader: true,
|
|
517
602
|
rowSpan: 1,
|
|
518
|
-
colSpan:
|
|
603
|
+
colSpan: titleColSpan,
|
|
604
|
+
stickyTop: this.isColumnLevelSticky(0),
|
|
519
605
|
stickyStart: this.isRowLevelSticky(j),
|
|
520
|
-
|
|
521
|
-
isHeader: false,
|
|
606
|
+
background: rowHeaderAttribute.color,
|
|
522
607
|
};
|
|
608
|
+
if (this.columnLevels - titleColSpan > 0) {
|
|
609
|
+
matrix[this.nonStickyColumnIndex][j] = {
|
|
610
|
+
value: '',
|
|
611
|
+
cssClass: PivotTableConverter.rowAttributeHeaderClass,
|
|
612
|
+
isHeader: true,
|
|
613
|
+
rowSpan: 1,
|
|
614
|
+
colSpan: this.columnLevels - titleColSpan,
|
|
615
|
+
background: rowHeaderAttribute.color,
|
|
616
|
+
stickyStart: this.isRowLevelSticky(j),
|
|
617
|
+
};
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
else {
|
|
621
|
+
for (let i = 0; i < this.columnLevels; i++) {
|
|
622
|
+
matrix[i][j] = {
|
|
623
|
+
value: '',
|
|
624
|
+
cssClass: PivotTableConverter.emptyClass,
|
|
625
|
+
rowSpan: 1,
|
|
626
|
+
colSpan: 1,
|
|
627
|
+
stickyStart: this.isRowLevelSticky(j),
|
|
628
|
+
stickyTop: this.isColumnLevelSticky(i),
|
|
629
|
+
isHeader: false,
|
|
630
|
+
};
|
|
631
|
+
}
|
|
523
632
|
}
|
|
524
633
|
}
|
|
525
634
|
}
|
|
@@ -542,7 +651,66 @@ export class PivotTableConverter {
|
|
|
542
651
|
function preparePivotData(data, constraintData, valueTypeInfo) {
|
|
543
652
|
const numberOfSums = Math.max(1, (data.valueTitles || []).length);
|
|
544
653
|
const values = computeValuesByValueType(data.values, data.valueTypes, numberOfSums, valueTypeInfo);
|
|
545
|
-
|
|
654
|
+
const sorted = sortPivotData({ ...data, values }, constraintData);
|
|
655
|
+
return fillExpressionsToData(sorted);
|
|
656
|
+
}
|
|
657
|
+
function fillExpressionsToData(data) {
|
|
658
|
+
return {
|
|
659
|
+
...data,
|
|
660
|
+
rowHeaders: fillExpressionsToHeaders(data.rowHeaders, data.rowsConfig, 0),
|
|
661
|
+
columnHeaders: fillExpressionsToHeaders(data.columnHeaders, data.columnsConfig, 0),
|
|
662
|
+
};
|
|
663
|
+
}
|
|
664
|
+
function fillExpressionsToHeaders(headers, configs, index) {
|
|
665
|
+
const expressions = configs?.[index]?.expressions || [];
|
|
666
|
+
const headersCopy = [...(headers || [])];
|
|
667
|
+
for (const expression of expressions) {
|
|
668
|
+
const dataHeaderExpression = extendPivotExpression(expression, headers);
|
|
669
|
+
if (dataHeaderExpression.lastHeaderIndex >= 0) {
|
|
670
|
+
const lastHeaderIndex = dataHeaderExpression.lastHeaderIndex;
|
|
671
|
+
const newHeader = { ...headersCopy[lastHeaderIndex], expressions: [...(headersCopy[lastHeaderIndex].expressions || []), dataHeaderExpression] };
|
|
672
|
+
headersCopy.splice(lastHeaderIndex, 1, newHeader);
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
if (configs?.[index + 1]) {
|
|
676
|
+
for (let i = 0; i < headersCopy.length; i++) {
|
|
677
|
+
headersCopy.splice(i, 1, { ...headersCopy[i], children: fillExpressionsToHeaders(headersCopy[i].children, configs, index + 1) });
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
return headersCopy;
|
|
681
|
+
}
|
|
682
|
+
function extendPivotExpression(expression, headers) {
|
|
683
|
+
const dataHeaderOperands = [];
|
|
684
|
+
let lastHeaderIndex = -1;
|
|
685
|
+
function traverse(operands) {
|
|
686
|
+
for (const operand of operands) {
|
|
687
|
+
if (operand.type === 'header') {
|
|
688
|
+
const indexes = getOperandIndexesInHeaders(operand, headers);
|
|
689
|
+
lastHeaderIndex = Math.max(lastHeaderIndex, ...indexes);
|
|
690
|
+
const operandHeaders = indexes.map(index => headers[index]);
|
|
691
|
+
dataHeaderOperands.push({ ...operand, headers: operandHeaders });
|
|
692
|
+
}
|
|
693
|
+
else if (operand.type === 'expression') {
|
|
694
|
+
traverse(operand.operands);
|
|
695
|
+
}
|
|
696
|
+
else {
|
|
697
|
+
dataHeaderOperands.push(operand);
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
traverse(expression.operands);
|
|
702
|
+
return { ...expression, lastHeaderIndex, operands: dataHeaderOperands };
|
|
703
|
+
}
|
|
704
|
+
function getOperandIndexesInHeaders(operand, headers) {
|
|
705
|
+
return (headers || []).reduce((indexes, header, index) => {
|
|
706
|
+
if (operandContainsHeader(operand, header)) {
|
|
707
|
+
indexes.push(index);
|
|
708
|
+
}
|
|
709
|
+
return indexes;
|
|
710
|
+
}, []);
|
|
711
|
+
}
|
|
712
|
+
function operandContainsHeader(operand, header) {
|
|
713
|
+
return header.title.match(new RegExp(operand.value))?.length > 0;
|
|
546
714
|
}
|
|
547
715
|
function computeValuesByValueType(values, valueTypes, numValues, valueTypeInfo) {
|
|
548
716
|
const rowsIndexes = [...Array(values.length).keys()];
|
|
@@ -644,6 +812,7 @@ function iterateThroughTransformationMap(headers, additionalNum, array, level, s
|
|
|
644
812
|
}
|
|
645
813
|
else if (isNotNullOrUndefined(header.targetIndex)) {
|
|
646
814
|
array[header.targetIndex] = i + additional;
|
|
815
|
+
additional += (header.expressions || []).length;
|
|
647
816
|
}
|
|
648
817
|
}
|
|
649
818
|
}
|
|
@@ -666,11 +835,12 @@ function getTargetIndexesForHeader(pivotDataHeader) {
|
|
|
666
835
|
function getHeadersChildCount(headers, showSums, numberOfSums = 1) {
|
|
667
836
|
return (headers || []).reduce((sum, header) => sum + getHeaderChildCount(header, 0, showSums, numberOfSums), showSums[0] ? numberOfSums : 0);
|
|
668
837
|
}
|
|
669
|
-
function getHeaderChildCount(pivotDataHeader, level, showSums, numberOfSums = 1
|
|
838
|
+
function getHeaderChildCount(pivotDataHeader, level, showSums, numberOfSums = 1) {
|
|
839
|
+
const numExpressions = (pivotDataHeader.expressions || []).length;
|
|
670
840
|
if (pivotDataHeader.children) {
|
|
671
|
-
return pivotDataHeader.children.reduce((sum, header) => sum + getHeaderChildCount(header, level + 1, showSums, numberOfSums
|
|
841
|
+
return pivotDataHeader.children.reduce((sum, header) => sum + getHeaderChildCount(header, level + 1, showSums, numberOfSums), (showSums[level + 1] ? numberOfSums : 0) + numExpressions);
|
|
672
842
|
}
|
|
673
|
-
return
|
|
843
|
+
return 1 + numExpressions;
|
|
674
844
|
}
|
|
675
845
|
function getDirectHeaderChildCount(pivotDataHeader, level, showSums, numberOfSums = 1) {
|
|
676
846
|
if (pivotDataHeader.children) {
|
|
@@ -679,10 +849,12 @@ function getDirectHeaderChildCount(pivotDataHeader, level, showSums, numberOfSum
|
|
|
679
849
|
return 1;
|
|
680
850
|
}
|
|
681
851
|
export function sortPivotData(data, constraintData) {
|
|
852
|
+
const rowSorts = (data.rowsConfig || []).map(config => config.sort);
|
|
853
|
+
const columnSorts = (data.columnsConfig || []).map(config => config.sort);
|
|
682
854
|
return {
|
|
683
855
|
...data,
|
|
684
|
-
rowHeaders: sortPivotRowDataHeaders(data.rowHeaders,
|
|
685
|
-
columnHeaders: sortPivotColumnDataHeaders(data.columnHeaders,
|
|
856
|
+
rowHeaders: sortPivotRowDataHeaders(data.rowHeaders, rowSorts, data, constraintData),
|
|
857
|
+
columnHeaders: sortPivotColumnDataHeaders(data.columnHeaders, columnSorts, data, constraintData),
|
|
686
858
|
};
|
|
687
859
|
}
|
|
688
860
|
function sortPivotRowDataHeaders(rowHeaders, rowSorts, pivotData, constraintData) {
|
|
@@ -800,4 +972,4 @@ function divideValues(value, divider) {
|
|
|
800
972
|
}
|
|
801
973
|
return null;
|
|
802
974
|
}
|
|
803
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGl2b3QtdGFibGUtY29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbG1yLXBpdm90LXRhYmxlL3NyYy9saWIvdXRpbC9waXZvdC10YWJsZS1jb252ZXJ0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsT0FBTyxFQUdMLG1CQUFtQixFQUNuQixnQkFBZ0IsRUFDaEIsb0JBQW9CLEVBQ3BCLGlCQUFpQixFQUNqQixtQkFBbUIsRUFDbkIsa0JBQWtCLEdBQ25CLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLGNBQWMsRUFDZCxPQUFPLEVBQ1Asb0JBQW9CLEVBQ3BCLGlCQUFpQixFQUNqQixTQUFTLEVBQUUsVUFBVSxFQUNyQixRQUFRLEVBQ1IsWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBSXZCLE9BQU8sRUFBZ0MsaUJBQWlCLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRixPQUFPLEVBQUMsYUFBYSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBZWhILE1BQU0sT0FBTyxtQkFBbUI7SUFDdkIsTUFBTSxDQUFVLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQztJQUNoRCxNQUFNLENBQVUsU0FBUyxHQUFHLGlCQUFpQixDQUFDO0lBQzlDLE1BQU0sQ0FBVSxjQUFjLEdBQUcsdUJBQXVCLENBQUM7SUFDekQsTUFBTSxDQUFVLGNBQWMsR0FBRyx1QkFBdUIsQ0FBQztJQUN6RCxNQUFNLENBQVUsbUJBQW1CLEdBQUcsNkJBQTZCLENBQUM7SUFDcEUsTUFBTSxDQUFVLGlCQUFpQixHQUFHLDBCQUEwQixDQUFDO0lBQy9ELE1BQU0sQ0FBVSxzQkFBc0IsR0FBRyxnQ0FBZ0MsQ0FBQztJQUVoRSxXQUFXLEdBQUcsQ0FBQyxhQUFhLEVBQUUsYUFBYSxFQUFFLGFB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LENBQUMsT0FBaUIsRUFBRSxHQUFXLEVBQUUsS0FBYTtJQUN2RSxPQUFPLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssR0FBRyxHQUFHLEtBQUssS0FBSyxDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLEtBQVUsRUFBRSxPQUFZO0lBQzVDLElBQUksaUJBQWlCLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDNUIsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUVELElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUMxQyxJQUFJLE9BQU8sS0FBSyxDQUFDLEVBQUU7WUFDakIsT0FBTyxLQUFLLEdBQUcsT0FBTyxDQUFDO1NBQ3hCO2FBQU07WUFDTCxPQUFPLENBQUMsQ0FBQztTQUNWO0tBQ0Y7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogTHVtZWVyOiBNb2Rlcm4gRGF0YSBEZWZpbml0aW9uIGFuZCBQcm9jZXNzaW5nIFBsYXRmb3JtXG4gKlxuICogQ29weXJpZ2h0IChDKSBzaW5jZSAyMDE3IEx1bWVlci5pbywgcy5yLm8uIGFuZC9vciBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LlxuICovXG5pbXBvcnQge1xuICBDb25zdHJhaW50LFxuICBDb25zdHJhaW50RGF0YSxcbiAgRGF0YUFnZ3JlZ2F0aW9uVHlwZSxcbiAgTnVtYmVyQ29uc3RyYWludCxcbiAgUGVyY2VudGFnZUNvbnN0cmFpbnQsXG4gIFVua25vd25Db25zdHJhaW50LFxuICBhZ2dyZWdhdGVEYXRhVmFsdWVzLFxuICBpc1ZhbHVlQWdncmVnYXRpb24sIERhdGFSZXNvdXJjZSxcbn0gZnJvbSAnQGx1bWVlci9kYXRhLWZpbHRlcnMnO1xuaW1wb3J0IHtcbiAgZGVlcE9iamVjdENvcHksXG4gIGlzQXJyYXksXG4gIGlzTm90TnVsbE9yVW5kZWZpbmVkLFxuICBpc051bGxPclVuZGVmaW5lZCxcbiAgaXNOdW1lcmljLCBzaGFkZUNvbG9yLFxuICB0b051bWJlcixcbiAgdW5pcXVlVmFsdWVzLFxufSBmcm9tICdAbHVtZWVyL3V0aWxzJztcblxuaW1wb3J0IHtMbXJQaXZvdERhdGEsIExtclBpdm90RGF0YUhlYWRlciwgTG1yUGl2b3RTdGVtRGF0YX0gZnJvbSAnLi9sbXItcGl2b3QtZGF0YSc7XG5pbXBvcnQge0xtclBpdm90VGFibGUsIExtclBpdm90VGFibGVDZWxsfSBmcm9tICcuL2xtci1waXZvdC10YWJsZSc7XG5pbXBvcnQge0xtclBpdm90U29ydCwgTG1yUGl2b3RTdHJpbmdzLCBMbXJQaXZvdFZhbHVlVHlwZX0gZnJvbSAnLi9sbXItcGl2b3QtY29uZmlnJztcbmltcG9ydCB7Q09MT1JfR1JBWTEwMCwgQ09MT1JfR1JBWTIwMCwgQ09MT1JfR1JBWTMwMCwgQ09MT1JfR1JBWTQwMCwgQ09MT1JfR1JBWTUwMH0gZnJvbSAnLi9sbXItcGl2b3QtY29uc3RhbnRzJztcblxuaW50ZXJmYWNlIEhlYWRlckdyb3VwSW5mbyB7XG4gIGJhY2tncm91bmQ6IHN0cmluZztcbiAgaW5kZXhlczogbnVtYmVyW107XG4gIGxldmVsOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBWYWx1ZVR5cGVJbmZvIHtcbiAgc3VtPzogbnVtYmVyO1xuICBzdW1zUm93cz86IG51bWJlcltdO1xuICBzdW1zQ29sdW1ucz86IG51bWJlcltdO1xuICBkZWZhdWx0Q29uc3RyYWludD86IENvbnN0cmFpbnQ7XG59XG5cbmV4cG9ydCBjbGFzcyBQaXZvdFRhYmxlQ29udmVydGVyIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBlbXB0eUNsYXNzID0gJ3Bpdm90LWVtcHR5LWNlbGwnO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGRhdGFDbGFzcyA9ICdwaXZvdC1kYXRhLWNlbGwnO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGdyb3VwRGF0YUNsYXNzID0gJ3Bpdm90LWRhdGEtZ3JvdXAtY2VsbCc7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgcm93SGVhZGVyQ2xhc3MgPSAncGl2b3Qtcm93LWhlYWRlci1jZWxsJztcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSByb3dHcm91cEhlYWRlckNsYXNzID0gJ3Bpdm90LXJvdy1ncm91cC1oZWFkZXItY2VsbCc7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgY29sdW1uSGVhZGVyQ2xhc3MgPSAncGl2b3QtY29sdW1uLWhlYWRlci1jZWxsJztcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBjb2x1bW5Hcm91cEhlYWRlckNsYXNzID0gJ3Bpdm90LWNvbHVtbi1ncm91cC1oZWFkZXItY2VsbCc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBncm91cENvbG9ycyA9IFtDT0xPUl9HUkFZMTAwLCBDT0xPUl9HUkFZMjAwLCBDT0xPUl9HUkFZMzAwLCBDT0xPUl9HUkFZNDAwLCBDT0xPUl9HUkFZNTAwXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHBlcmNlbnRhZ2VDb25zdHJhaW50ID0gbmV3IFBlcmNlbnRhZ2VDb25zdHJhaW50KHtkZWNpbWFsczogMn0pO1xuXG4gIHByaXZhdGUgZGF0YTogTG1yUGl2b3RTdGVtRGF0YTtcbiAgcHJpdmF0ZSBzdHJpbmdzOiBMbXJQaXZvdFN0cmluZ3M7XG4gIHByaXZhdGUgdmFsdWVzOiBhbnlbXVtdO1xuICBwcml2YXRlIGRhdGFSZXNvdXJjZXM6IERhdGFSZXNvdXJjZVtdW11bXTtcbiAgcHJpdmF0ZSBjb25zdHJhaW50RGF0YTogQ29uc3RyYWludERhdGE7XG4gIHByaXZhdGUgcm93TGV2ZWxzOiBudW1iZXI7XG4gIHByaXZhdGUgcm93c1RyYW5zZm9ybWF0aW9uQXJyYXk6IG51bWJlcltdO1xuICBwcml2YXRlIGNvbHVtbkxldmVsczogbnVtYmVyO1xuICBwcml2YXRlIGNvbHVtbnNUcmFuc2Zvcm1hdGlvbkFycmF5OiBudW1iZXJbXTtcbiAgcHJpdmF0ZSB2YWx1ZVR5cGVJbmZvOiBWYWx1ZVR5cGVJbmZvW107XG4gIHByaXZhdGUgbm9uU3RpY2t5Um93SW5kZXg6IG51bWJlcjtcblxuICBwdWJsaWMgY3JlYXRlVGFibGVzKHBpdm90RGF0YTogTG1yUGl2b3REYXRhLCBzdHJpbmdzOiBMbXJQaXZvdFN0cmluZ3MpOiBMbXJQaXZvdFRhYmxlW10ge1xuICAgIGlmICghcGl2b3REYXRhKSB7XG4gICAgICByZXR1cm4gW3tjZWxsczogW119XTtcbiAgICB9XG5cbiAgICB0aGlzLnN0cmluZ3MgPSBzdHJpbmdzO1xuICAgIHRoaXMuY29uc3RyYWludERhdGEgPSBwaXZvdERhdGEuY29uc3RyYWludERhdGE7XG5cbiAgICByZXR1cm4gKHBpdm90RGF0YS5kYXRhIHx8IFtdKS5tYXAoZCA9PiB7XG4gICAgICBpZiAodGhpcy5kYXRhQXJlRW1wdHkoZCkpIHtcbiAgICAgICAgcmV0dXJuIHtjZWxsczogW119O1xuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVEYXRhKGQpO1xuICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtRGF0YSgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBkYXRhQXJlRW1wdHkoZGF0YTogTG1yUGl2b3RTdGVtRGF0YSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoZGF0YS5yb3dIZWFkZXJzIHx8IFtdKS5sZW5ndGggPT09IDAgJiYgKGRhdGEuY29sdW1uSGVhZGVycyB8fCBbXSkubGVuZ3RoID09PSAwO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVEYXRhKGRhdGE6IExtclBpdm90U3RlbURhdGEpIHtcbiAgICBjb25zdCBudW1iZXJPZlN1bXMgPSBNYXRoLm1heCgxLCAoZGF0YS52YWx1ZVRpdGxlcyB8fCBbXSkubGVuZ3RoKTtcbiAgICB0aGlzLnZhbHVlVHlwZUluZm8gPSBnZXRWYWx1ZXNUeXBlSW5mbyhkYXRhLnZhbHVlcywgZGF0YS52YWx1ZVR5cGVzLCBudW1iZXJPZlN1bXMpO1xuICAgIHRoaXMuZGF0YSA9IHByZXBhcmVQaXZvdERhdGEoZGF0YSwgdGhpcy5jb25zdHJhaW50RGF0YSwgdGhpcy52YWx1ZVR5cGVJbmZvKTtcbiAgICB0aGlzLm5vblN0aWNreVJvd0luZGV4ID0gdGhpcy5kYXRhLnJvd1N0aWNreT8uZmluZEluZGV4KHN0aWNreSA9PiAhc3RpY2t5KSB8fCAwO1xuICAgIHRoaXMudmFsdWVzID0gZGF0YS52YWx1ZXMgfHwgW107XG4gICAgdGhpcy5kYXRhUmVzb3VyY2VzID0gZGF0YS5kYXRhUmVzb3VyY2VzIHx8IFtdO1xuICAgIHRoaXMucm93TGV2ZWxzID0gKGRhdGEucm93U2hvd1N1bXMgfHwgW10pLmxlbmd0aDtcbiAgICB0aGlzLmNvbHVtbkxldmVscyA9IChkYXRhLmNvbHVtblNob3dTdW1zIHx8IFtdKS5sZW5ndGggKyAoZGF0YS5oYXNBZGRpdGlvbmFsQ29sdW1uTGV2ZWwgPyAxIDogMCk7XG4gICAgY29uc3QgaGFzVmFsdWUgPSAoZGF0YS52YWx1ZVRpdGxlcyB8fCBbXSkubGVuZ3RoID4gMDtcbiAgICBpZiAoKHRoaXMuZGF0YS5yb3dIZWFkZXJzIHx8IFtdKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnJvd3NUcmFuc2Zvcm1hdGlvbkFycmF5ID0gY3JlYXRlVHJhbnNmb3JtYXRpb25NYXAoXG4gICAgICAgIHRoaXMuZGF0YS5yb3dIZWFkZXJzLFxuICAgICAgICB0aGlzLnJvd1Nob3dTdW1zLFxuICAgICAgICB0aGlzLmNvbHVtbkxldmVscyxcbiAgICAgICAgMVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yb3dzVHJhbnNmb3JtYXRpb25BcnJheSA9IGhhc1ZhbHVlID8gW3RoaXMuY29sdW1uTGV2ZWxzXSA6IFtdO1xuICAgIH1cblxuICAgIGlmICgodGhpcy5kYXRhLmNvbHVtbkhlYWRlcnMgfHwgW10pLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuY29sdW1uc1RyYW5zZm9ybWF0aW9uQXJyYXkgPSBjcmVhdGVUcmFuc2Zvcm1hdGlvbk1hcChcbiAgICAgICAgdGhpcy5kYXRhLmNvbHVtbkhlYWRlcnMsXG4gICAgICAgIHRoaXMuY29sdW1uU2hvd1N1bXMsXG4gICAgICAgIHRoaXMucm93TGV2ZWxzLFxuICAgICAgICBudW1iZXJPZlN1bXNcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29sdW1uc1RyYW5zZm9ybWF0aW9uQXJyYXkgPSBoYXNWYWx1ZSA/IFt0aGlzLnJvd0xldmVsc10gOiBbXTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldCByb3dTaG93U3VtcygpOiBib29sZWFuW10ge1xuICAgIHJldHVybiB0aGlzLmRhdGEucm93U2hvd1N1bXM7XG4gIH1cblxuICBwcml2YXRlIGdldCBjb2x1bW5TaG93U3VtcygpOiBib29sZWFuW10ge1xuICAgIHJldHVybiB0aGlzLmRhdGEuY29sdW1uU2hvd1N1bXM7XG4gIH1cblxuICBwcml2YXRlIHRyYW5zZm9ybURhdGEoKTogTG1yUGl2b3RUYWJsZSB7XG4gICAgY29uc3QgY2VsbHMgPSB0aGlzLmluaXRDZWxscygpO1xuICAgIGNvbnN0IHJvd0dyb3VwcyA9IHRoaXMuZmlsbENlbGxzQnlSb3dzKGNlbGxzKTtcbiAgICBjb25zdCBjb2x1bW5Hcm91cHMgPSB0aGlzLmZpbGxDZWxsc0J5Q29sdW1ucyhjZWxscyk7XG4gICAgdGhpcy5maWxsQ2VsbHNCeUdyb3VwSW50ZXJzZWN0aW9uKGNlbGxzLCByb3dHcm91cHMsIGNvbHVtbkdyb3Vwcyk7XG4gICAgcmV0dXJuIHtjZWxsc307XG4gIH1cblxuICBwcml2YXRlIGZpbGxDZWxsc0J5Um93cyhjZWxsczogTG1yUGl2b3RUYWJsZUNlbGxbXVtdKTogSGVhZGVyR3JvdXBJbmZvW10ge1xuICAgIGNvbnN0IHJvd0dyb3VwcyA9IFtdO1xuICAgIHRoaXMuaXRlcmF0ZUFuZEZpbGxDZWxsc0J5Um93cyhjZWxscywgcm93R3JvdXBzLCB0aGlzLmRhdGEucm93SGVhZGVycywgdGhpcy5jb2x1bW5MZXZlbHMsIHRoaXMucm93U2hvd1N1bXMsIDApO1xuICAgIHJldHVybiByb3dHcm91cHM7XG4gIH1cblxuICBwcml2YXRlIGl0ZXJhdGVBbmRGaWxsQ2VsbHNCeVJvd3MoXG4gICAgY2VsbHM6IExtclBpdm90VGFibGVDZWxsW11bXSxcbiAgICByb3dHcm91cHNJbmZvOiBIZWFkZXJHcm91cEluZm9bXSxcbiAgICBoZWFkZXJzOiBMbXJQaXZvdERhdGFIZWFkZXJbXSxcbiAgICBzdGFydEluZGV4OiBudW1iZXIsXG4gICAgc2hvd1N1bXM6IGJvb2xlYW5bXSxcbiAgICBsZXZlbDogbnVtYmVyLFxuICAgIHBhcmVudEhlYWRlcj86IExtclBpdm90RGF0YUhlYWRlclxuICApIHtcbiAgICBsZXQgY3VycmVudEluZGV4ID0gc3RhcnRJbmRleDtcbiAgICBmb3IgKGNvbnN0IGhlYWRlciBvZiBoZWFkZXJzKSB7XG4gICAgICBjb25zdCByb3dTcGFuID0gZ2V0RGlyZWN0SGVhZGVyQ2hpbGRDb3VudChoZWFkZXIsIGxldmVsLCBzaG93U3Vtcyk7XG4gICAgICBjZWxsc1tjdXJyZW50SW5kZXhdW2xldmVsXSA9IHtcbiAgICAgICAgdmFsdWU6IGhlYWRlci50aXRsZSxcbiAgICAgICAgY3NzQ2xhc3M6IFBpdm90VGFibGVDb252ZXJ0ZXIucm93SGVhZGVyQ2xhc3MsXG4gICAgICAgIGlzSGVhZGVyOiB0cnVlLFxuICAgICAgICBzdGlja3lTdGFydDogdGhpcy5pc1Jvd0xldmVsU3RpY2t5KGxldmVsKSxcbiAgICAgICAgcm93U3BhbixcbiAgICAgICAgY29sU3BhbjogMSxcbiAgICAgICAgYmFja2dyb3VuZDogdGhpcy5nZXRIZWFkZXJCYWNrZ3JvdW5kKGhlYWRlciwgbGV2ZWwpLFxuICAgICAgICBjb25zdHJhaW50OiBoZWFkZXIuY29uc3RyYWludCxcbiAgICAgICAgbGFiZWw6IGhlYWRlci5hdHRyaWJ1dGVOYW1lLFxuICAgICAgfTtcblxuICAgICAgaWYgKGhlYWRlci5jaGlsZHJlbikge1xuICAgICAgICB0aGlzLml0ZXJhdGVBbmRGaWxsQ2VsbHNCeVJvd3MoXG4gICAgICAgICAgY2VsbHMsXG4gICAgICAgICAgcm93R3JvdXBzSW5mbyxcbiAgICAgICAgICBoZWFkZXIuY2hpbGRyZW4sXG4gICAgICAgICAgY3VycmVudEluZGV4LFxuICAgICAgICAgIHNob3dTdW1zLFxuICAgICAgICAgIGxldmVsICsgMSxcbiAgICAgICAgICBoZWFkZXJcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNOb3ROdWxsT3JVbmRlZmluZWQoaGVhZGVyLnRhcmdldEluZGV4KSkge1xuICAgICAgICB0aGlzLmZpbGxDZWxsc0ZvclJvdyhjZWxscywgaGVhZGVyLnRhcmdldEluZGV4KTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudEluZGV4ICs9IGdldEhlYWRlckNoaWxkQ291bnQoaGVhZGVyLCBsZXZlbCwgc2hvd1N1bXMpO1xuICAgIH1cblxuICAgIGlmIChzaG93U3Vtc1tsZXZlbF0pIHtcbiAgICAgIGNvbnN0IGJhY2tncm91bmQgPSB0aGlzLmdldFN1bW1hcnlCYWNrZ3JvdW5kKGxldmVsKTtcbiAgICAgIGNvbnN0IHN1bW1hcnkgPSBsZXZlbCA9PT0gMCA/IHRoaXMuc3RyaW5ncy5zdW1tYXJ5U3RyaW5nIDogdGhpcy5zdHJpbmdzLmhlYWRlclN1bW1hcnlTdHJpbmc7XG4gICAgICBjb25zdCBjb2x1bW5JbmRleCA9IE1hdGgubWF4KGxldmVsIC0gMSwgMCk7XG4gICAgICBsZXQgY29sU3BhbiA9IHRoaXMucm93TGV2ZWxzIC0gY29sdW1uSW5kZXg7XG4gICAgICBjb25zdCBzdGlja3lTdGFydCA9IHRoaXMuaXNSb3dMZXZlbFN0aWNreShjb2x1bW5JbmRleCk7XG5cbiAgICAgIC8vIHNwbGl0IHJvdyBncm91cCBoZWFkZXIgY2VsbCBiZWNhdXNlIG9mIGNvcnJlY3Qgc3RpY2t5IHNjcm9sbFxuICAgICAgaWYgKHN0aWNreVN0YXJ0ICYmIHRoaXMubm9uU3RpY2t5Um93SW5kZXggPiAwICYmIGNvbFNwYW4gPiAxKSB7XG4gICAgICAgIGNvbnN0IG5ld0NvbHNwYW4gPSB0aGlzLm5vblN0aWNreVJvd0luZGV4IC0gY29sdW1uSW5kZXg7XG5cbiAgICAgICAgY2VsbHNbY3VycmVudEluZGV4XVt0aGlzLm5vblN0aWNreVJvd0luZGV4XSA9IHtcbiAgICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICAgIGNvbnN0cmFpbnQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICBsYWJlbDogdW5kZWZpbmVkLFxuICAgICAgICAgIGNzc0NsYXNzOiBQaXZvdFRhYmxlQ29udmVydGVyLnJvd0dyb3VwSGVhZGVyQ2xhc3MsXG4gICAgICAgICAgaXNIZWFkZXI6IHRydWUsXG4gICAgICAgICAgcm93U3BhbjogMSxcbiAgICAgICAgICBjb2xTcGFuOiBjb2xTcGFuIC0gbmV3Q29sc3BhbixcbiAgICAgICAgICBiYWNrZ3JvdW5kLFxuICAgICAgICAgIHN1bW1hcnk6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcblxuICAgICAgICBjb2xTcGFuID0gbmV3Q29sc3BhbjtcbiAgICAgIH1cblxuICAgICAgY2VsbHNbY3VycmVudEluZGV4XVtjb2x1bW5JbmRleF0gPSB7XG4gICAgICAgIHZhbHVlOiBwYXJlbnRIZWFkZXI/LnRpdGxlLFxuICAgICAgICBjb25zdHJhaW50OiBwYXJlbnRIZWFkZXI/LmNvbnN0cmFpbnQsXG4gICAgICAgIGxhYmVsOiBwYXJlbnRIZWFkZXI/LmF0dHJpYnV0ZU5hbWUsXG4gICAgICAgIGNzc0NsYXNzOiBQaXZvdFRhYmxlQ29udmVydGVyLnJvd0dyb3VwSGVhZGVyQ2xhc3MsXG4gICAgICAgIGlzSGVhZGVyOiB0cnVlLFxuICAgICAgICBzdGlja3lTdGFydCxcbiAgICAgICAgcm93U3BhbjogMSxcbiAgICAgICAgY29sU3BhbixcbiAgICAgICAgYmFja2dyb3VuZCxcbiAgICAgICAgc3VtbWFyeSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJvd0luZGV4ZXMgPSBnZXRUYXJnZXRJbmRleGVzRm9ySGVhZGVycyhoZWFkZXJzKTtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybWVkUm93SW5kZXhlcyA9IHJvd0luZGV4ZXNcbiAgICAgICAgLm1hcCh2ID0+IHRoaXMucm93c1RyYW5zZm9ybWF0aW9uQXJyYXlbdl0pXG4gICAgICAgIC5maWx0ZXIodiA9PiBpc05vdE51bGxPclVuZGVmaW5lZCh2KSk7XG4gICAgICByb3dHcm91cHNJbmZvW2N1cnJlbnRJbmRleF0gPSB7YmFja2dyb3VuZCwgaW5kZXhlczogdHJhbnNmb3JtZWRSb3dJbmRleGVzLCBsZXZlbH07XG5cbiAgICAgIHRoaXMuZmlsbENlbGxzRm9yR3JvdXBlZFJvdyhjZWxscywgcm93SW5kZXhlcywgY3VycmVudEluZGV4LCBiYWNrZ3JvdW5kKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEhlYWRlckJhY2tncm91bmQoaGVhZGVyOiBMbXJQaXZvdERhdGFIZWFkZXIsIGxldmVsOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmIChoZWFkZXI/LmNvbG9yKSB7XG4gICAgICByZXR1cm4gc2hhZGVDb2xvcihoZWFkZXIuY29sb3IsIHRoaXMuZ2V0TGV2ZWxPcGFjaXR5KGxldmVsKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGV2ZWxPcGFjaXR5KGxldmVsOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1pbig4MCwgNTAgKyBsZXZlbCAqIDUpIC8gMTAwO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1Jvd0xldmVsU3RpY2t5KGxldmVsOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhPy5yb3dTdGlja3k/LltsZXZlbF07XG4gIH1cblxuICBwcml2YXRlIGlzQ29sdW1uTGV2ZWxTdGlja3kobGV2ZWw6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG1heExldmVsID0gTWF0aC5taW4obGV2ZWwsICh0aGlzLmRhdGE/LmNvbHVtblN0aWNreT8ubGVuZ3RoID8/IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSAtIDEpO1xuICAgIHJldHVybiB0aGlzLmRhdGE/LmNvbHVtblN0aWNreT8uW21heExldmVsXTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3VtbWFyeUJhY2tncm91bmQobGV2ZWw6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgaW5kZXggPSBNYXRoLm1pbihsZXZlbCwgdGhpcy5ncm91cENvbG9ycy5sZW5ndGggLSAxKTtcbiAgICByZXR1cm4gdGhpcy5ncm91cENvbG9yc1tpbmRleF07XG4gIH1cblxuICBwcml2YXRlIGZpbGxDZWxsc0ZvclJvdyhjZWxsczogTG1yUGl2b3RUYWJsZUNlbGxbXVtdLCByb3c6IG51bWJlcikge1xuICAgIGNvbnN0IHJvd0luZGV4SW5DZWxscyA9IHRoaXMucm93c1RyYW5zZm9ybWF0aW9uQXJyYXlbcm93XTtcbiAgICBpZiAoaXNOb3ROdWxsT3JVbmRlZmluZWQocm93SW5kZXhJbkNlbGxzKSkge1xuICAgICAgZm9yIChsZXQgY29sdW1uID0gMDsgY29sdW1uIDwgdGhpcy5jb2x1bW5zVHJhbnNmb3JtYXRpb25BcnJheS5sZW5ndGg7IGNvbHVtbisrKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbkluZGV4SW5DZWxscyA9IHRoaXMuY29sdW1uc1RyYW5zZm9ybWF0aW9uQXJyYXlbY29sdW1uXTtcbiAgICAgICAgaWYgKGlzTm90TnVsbE9yVW5kZWZpbmVkKGNvbHVtbkluZGV4SW5DZWxscykpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YS52YWx1ZXNbcm93XVtjb2x1bW5dO1xuICAgICAgICAgIGNvbnN0IGRhdGFSZXNvdXJjZXMgPSB0aGlzLmRhdGFSZXNvdXJjZXM/Lltyb3ddPy5bY29sdW1uXSB8fCBbXTtcbiAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IHRoaXMuYWdncmVnYXRlT3JGb3JtYXRTaW5nbGVWYWx1ZSh2YWx1ZSwgY29sdW1uKTtcbiAgICAgICAgICBjb25zdCBzdHJpbmdWYWx1ZSA9IGlzTm90TnVsbE9yVW5kZWZpbmVkKGZvcm1hdHRlZFZhbHVlKSA/IFN0cmluZyhmb3JtYXR0ZWRWYWx1ZSkgOiAnJztcbiAgICAgICAgICBjZWxsc1tyb3dJbmRleEluQ2VsbHNdW2NvbHVtbkluZGV4SW5DZWxsc10gPSB7XG4gICAgICAgICAgICB2YWx1ZTogc3RyaW5nVmFsdWUsXG4gICAgICAgICAgICBkYXRhUmVzb3VyY2VzLFxuICAgICAgICAgICAgcm93U3BhbjogMSxcbiAgICAgICAgICAgIGNvbFNwYW46IDEsXG4gICAgICAgICAgICBjc3NDbGFzczogUGl2b3RUYWJsZUNvbnZlcnRlci5kYXRhQ2xhc3MsXG4gICAgICAgICAgICBpc0hlYWRlcjogZmFsc2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0VmFsdWVJbmRleEZvckNvbHVtbnMoY29sdW1uczogbnVtYmVyW10pOiBudW1iZXIge1xuICAgIHJldHVybiBjb2x1bW5zWzBdICUgdGhpcy5kYXRhLnZhbHVlVGl0bGVzLmxlbmd0aDtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0VmFsdWVCeVZhbHVlVHlwZSh2YWx1ZTogYW55LCB2YWx1ZUluZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIGNvbnN0IHZhbHVlVHlwZSA9ICh0aGlzLmRhdGEudmFsdWVUeXBlcyB8fCBbXSlbdmFsdWVJbmRleF07XG4gICAgaWYgKCF2YWx1ZVR5cGUgfHwgdmFsdWVUeXBlID09PSBMbXJQaXZvdFZhbHVlVHlwZS5EZWZhdWx0KSB7XG4gICAgICByZXR1cm4gdGhpcy5mb3JtYXRWYWx1ZUJ5Q29uc3RyYWludCh2YWx1ZSwgdmFsdWVJbmRleCk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgW0xtclBpdm90VmFsdWVUeXBlLkFsbFBlcmNlbnRhZ2UsIExtclBpdm90VmFsdWVUeXBlLkNvbHVtblBlcmNlbnRhZ2UsIExtclBpdm90VmFsdWVUeXBlLlJvd1BlcmNlbnRhZ2VdLmluY2x1ZGVzKHZhbHVlVHlwZSlcbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1hdFZhbHVlQnlQZXJjZW50YWdlKHZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5mb3JtYXRWYWx1ZUJ5Q29uc3RyYWludCh2YWx1ZSwgdmFsdWVJbmRleCk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdEdyb3VwZWRWYWx1ZUJ5VmFsdWVUeXBlKHZhbHVlOiBhbnksIHJvd3M6IG51bWJlcltdLCBjb2x1bW5zOiBudW1iZXJbXSk6IGFueSB7XG4gICAgY29uc3QgdmFsdWVJbmRleCA9IGNvbHVtbnNbMF0gJSB0aGlzLmRhdGEudmFsdWVUaXRsZXMubGVuZ3RoO1xuICAgIGNvbnN0IHZhbHVlVHlwZSA9IHRoaXMuZGF0YS52YWx1ZVR5cGVzICYmIHRoaXMuZGF0YS52YWx1ZVR5cGVzW3ZhbHVlSW5kZXhdO1xuICAgIGNvbnN0IHZhbHVlVHlwZUluZm8gPSB0aGlzLnZhbHVlVHlwZUluZm9bdmFsdWVJbmRleF07XG4gICAgaWYgKCF2YWx1ZVR5cGVJbmZvIHx8ICF2YWx1ZVR5cGUgfHwgdmFsdWVUeXBlID09PSBMbXJQaXZvdFZhbHVlVHlwZS5EZWZhdWx0KSB7XG4gICAgICByZXR1cm4gdGhpcy5mb3JtYXRWYWx1ZUJ5Q29uc3RyYWludCh2YWx1ZSwgdmFsdWVJbmRleCk7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlVHlwZSA9PT0gTG1yUGl2b3RWYWx1ZVR5cGUuQWxsUGVyY2VudGFnZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0VmFsdWVCeVBlcmNlbnRhZ2UoZGl2aWRlVmFsdWVzKHZhbHVlLCB2YWx1ZVR5cGVJbmZvLnN1bSkpO1xuICAgIH0gZWxzZSBpZiAodmFsdWVUeXBlID09PSBMbXJQaXZvdFZhbHVlVHlwZS5Db2x1bW5QZXJjZW50YWdlKSB7XG4gICAgICBjb25zdCBjb2x1bW5zRGl2aWRlcnMgPSBjb2x1bW5zLnJlZHVjZSgoZGl2aWRlcnMsIGNvbHVtbikgPT4ge1xuICAgICAgICBkaXZpZGVycy5wdXNoKHZhbHVlVHlwZUluZm8uc3Vtc0NvbHVtbnNbY29sdW1uXSk7XG4gICAgICAgIHJldHVybiBkaXZpZGVycztcbiAgICAgIH0sIFtdKTtcbiAgICAgIGNvbnN0IGNvbHVtbnNEaXZpZGVyID0gYWdncmVnYXRlRGF0YVZhbHVlcyhEYXRhQWdncmVnYXRpb25UeXBlLlN1bSwgY29sdW1uc0RpdmlkZXJzKTtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1hdFZhbHVlQnlQZXJjZW50YWdlKGRpdmlkZVZhbHVlcyh2YWx1ZSwgY29sdW1uc0RpdmlkZXIpKTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PT0gTG1yUGl2b3RWYWx1ZVR5cGUuUm93UGVyY2VudGFnZSkge1xuICAgICAgY29uc3Qgcm93c0RpdmlkZXJzID0gcm93cy5yZWR1Y2UoKGRpdmlkZXJzLCByb3cpID0+IHtcbiAgICAgICAgZGl2aWRlcnMucHVzaCh2YWx1ZVR5cGVJbmZvLnN1bXNSb3dzW3Jvd10pO1xuICAgICAgICByZXR1cm4gZGl2aWRlcnM7XG4gICAgICB9LCBbXSk7XG4gICAgICBjb25zdCByb3dzRGl2aWRlciA9IGFnZ3JlZ2F0ZURhdGFWYWx1ZXMoRGF0YUFnZ3JlZ2F0aW9uVHlwZS5TdW0sIHJvd3NEaXZpZGVycyk7XG4gICAgICByZXR1cm4gdGhpcy5mb3JtYXRWYWx1ZUJ5UGVyY2VudGFnZShkaXZpZGVWYWx1ZXModmFsdWUsIHJvd3NEaXZpZGVyKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0VmFsdWVCeUNvbnN0cmFpbnQodmFsdWUsIHZhbHVlSW5kZXgpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRWYWx1ZUJ5UGVyY2VudGFnZSh2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wZXJjZW50YWdlQ29uc3RyYWludC5jcmVhdGVEYXRhVmFsdWUodmFsdWUpLmZvcm1hdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRWYWx1ZUJ5Q29uc3RyYWludCh2YWx1ZTogYW55LCB2YWx1ZUluZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIGNvbnN0IGNvbnN0cmFpbnQgPSB0aGlzLmRhdGEudmFsdWVzQ29uc3RyYWludHM/Llt2YWx1ZUluZGV4XSB8fCB0aGlzLnZhbHVlVHlwZUluZm9bdmFsdWVJbmRleF0/LmRlZmF1bHRDb25zdHJhaW50O1xuICAgIGlmIChjb25zdHJhaW50KSB7XG4gICAgICByZXR1cm4gY29uc3RyYWludC5jcmVhdGVEYXRhVmFsdWUodmFsdWUsIHRoaXMuY29uc3RyYWludERhdGEpLnByZXZpZXcoKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBmaWxsQ2VsbHNGb3JHcm91cGVkUm93KFxuICAgIGNlbGxzOiBMbXJQaXZvdFRhYmxlQ2VsbFtdW10sXG4gICAgcm93czogbnVtYmVyW10sXG4gICAgcm93SW5kZXhJbkNlbGxzOiBudW1iZXIsXG4gICAgYmFja2dyb3VuZDogc3RyaW5nXG4gICkge1xuICAgIGZvciAobGV0IGNvbHVtbiA9IDA7IGNvbHVtbiA8IHRoaXMuY29sdW1uc1RyYW5zZm9ybWF0aW9uQXJyYXkubGVuZ3RoOyBjb2x1bW4rKykge1xuICAgICAgY29uc3QgY29sdW1uSW5kZXhJbkNlbGxzID0gdGhpcy5jb2x1bW5zVHJhbnNmb3JtYXRpb25BcnJheVtjb2x1bW5dO1xuICAgICAgaWYgKGlzTm90TnVsbE9yVW5kZWZpbmVkKGNvbHVtbkluZGV4SW5DZWxscykpIHtcbiAgICAgICAgY29uc3Qge3ZhbHVlcywgZGF0YVJlc291cmNlc30gPSB0aGlzLmdldEdyb3VwZWRWYWx1ZXNGb3JSb3dzQW5kQ29scyhyb3dzLCBbY29sdW1uXSk7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5hZ2dyZWdhdGVBbmRGb3JtYXREYXRhVmFsdWVzKHZhbHVlcywgcm93cywgW2NvbHVtbl0pO1xuICAgICAgICBjZWxsc1tyb3dJbmRleEluQ2VsbHNdW2NvbHVtbkluZGV4SW5DZWxsc10gPSB7XG4gICAgICAgICAgdmFsdWU6IFN0cmluZyhmb3JtYXR0ZWRWYWx1ZSksXG4gICAgICAgICAgZGF0YVJlc291cmNlcyxcbiAgICAgICAgICBjb2xTcGFuOiAxLFxuICAgICAgICAgIHJvd1NwYW46IDEsXG4gICAgICAgICAgY3NzQ2xhc3M6IFBpdm90VGFibGVDb252ZXJ0ZXIuZ3JvdXBEYXRhQ2xhc3MsXG4gICAgICAgICAgaXNIZWFkZXI6IGZhbHNlLFxuICAgICAgICAgIGJhY2tncm91bmQsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRHcm91cGVkVmFsdWVzRm9yUm93c0FuZENvbHMoXG4gICAgcm93czogbnVtYmVyW10sXG4gICAgY29sdW1uczogbnVtYmVyW11cbiAgKToge3ZhbHVlczogYW55W107IGRhdGFSZXNvdXJjZXM6IERhdGFSZXNvdXJjZVtdfSB7XG4gICAgY29uc3QgdmFsdWVzID0gW107XG4gICAgY29uc3QgZGF0YVJlc291cmNlcyA9IFtdO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcbiAgICAgICAgY29uc3Qgcm93Q29sdW1uVmFsdWUgPSB0aGlzLnZhbHVlc1tyb3ddW2NvbHVtbl07XG4gICAgICAgIGlmIChpc0FycmF5KHJvd0NvbHVtblZhbHVlKSkge1xuICAgICAgICAgIHZhbHVlcy5wdXNoKC4uLnJvd0NvbHVtblZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZXMucHVzaChyb3dDb2x1bW5WYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YVJlc291cmNlcy5wdXNoKC4uLih0aGlzLmRhdGFSZXNvdXJjZXM/Lltyb3ddPy5bY29sdW1uXSB8fCBbXSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge3ZhbHVlcywgZGF0YVJlc291cmNlc307XG4gIH1cblxuICBwcml2YXRlIGZpbGxDZWxsc0J5Q29sdW1ucyhjZWxsczogTG1yUGl2b3RUYWJsZUNlbGxbXVtdKTogSGVhZGVyR3JvdXBJbmZvW10ge1xuICAgIGNvbnN0IGNvbHVtbkdyb3VwcyA9IFtdO1xuICAgIHRoaXMuaXRlcmF0ZUFuZEZpbGxDZWxsc0J5Q29sdW1ucyhcbiAgICAgIGNlbGxzLFxuICAgICAgY29sdW1uR3JvdXBzLFxuICAgICAgdGhpcy5kYXRhLmNvbHVtbkhlYWRlcnMsXG4gICAgICB0aGlzLnJvd0xldmVscyxcbiAgICAgIHRoaXMuY29sdW1uU2hvd1N1bXMsXG4gICAgICAwXG4gICAgKTtcbiAgICByZXR1cm4gY29sdW1uR3JvdXBzO1xuICB9XG5cbiAgcHJpdmF0ZSBpdGVyYXRlQW5kRmlsbENlbGxzQnlDb2x1bW5zKFxuICAgIGNlbGxzOiBMbXJQaXZvdFRhYmxlQ2VsbFtdW10sXG4gICAgY29sdW1uR3JvdXBzSW5mbzogSGVhZGVyR3JvdXBJbmZvW10sXG4gICAgaGVhZGVyczogTG1yUGl2b3REYXRhSGVhZGVyW10sXG4gICAgc3RhcnRJbmRleDogbnVtYmVyLFxuICAgIHNob3dTdW1zOiBib29sZWFuW10sXG4gICAgbGV2ZWw6IG51bWJlcixcbiAgICBwYXJlbnRIZWFkZXI/OiBMbXJQaXZvdERhdGFIZWFkZXJcbiAgKSB7XG4gICAgbGV0IGN1cnJlbnRJbmRleCA9IHN0YXJ0SW5kZXg7XG4gICAgY29uc3QgbnVtYmVyT2ZTdW1zID0gTWF0aC5tYXgoMSwgdGhpcy5kYXRhLnZhbHVlVGl0bGVzLmxlbmd0aCk7XG4gICAgZm9yIChjb25zdCBoZWFkZXIgb2YgaGVhZGVycykge1xuICAgICAgY29uc3QgY29sU3BhbiA9IGdldERpcmVjdEhlYWRlckNoaWxkQ291bnQoaGVhZGVyLCBsZXZlbCwgc2hvd1N1bXMsIG51bWJlck9mU3Vtcyk7XG4gICAgICBjZWxsc1tsZXZlbF1bY3VycmVudEluZGV4XSA9IHtcbiAgICAgICAgdmFsdWU6IGhlYWRlci50aXRsZSxcbiAgICAgICAgY3NzQ2xhc3M6IFBpdm90VGFibGVDb252ZXJ0ZXIuY29sdW1uSGVhZGVyQ2xhc3MsXG4gICAgICAgIGlzSGVhZGVyOiB0cnVlLFxuICAgICAgICByb3dTcGFuOiAxLFxuICAgICAgICBjb2xTcGFuLFxuICAgICAgICBzdGlja3lUb3A6IHRoaXMuaXNDb2x1bW5MZXZlbFN0aWNreShsZXZlbCksXG4gICAgICAgIGJhY2tncm91bmQ6IHRoaXMuZ2V0SGVhZGVyQmFja2dyb3VuZChoZWFkZXIsIGxldmVsKSxcbiAgICAgICAgY29uc3RyYWludDogaGVhZGVyLmNvbnN0cmFpbnQsXG4gICAgICAgIGxhYmVsOiBoZWFkZXIuYXR0cmlidXRlTmFtZSxcbiAgICAgIH07XG5cbiAgICAgIGlmIChoZWFkZXIuY2hpbGRyZW4pIHtcbiAgICAgICAgdGhpcy5pdGVyYXRlQW5kRmlsbENlbGxzQnlDb2x1bW5zKFxuICAgICAgICAgIGNlbGxzLFxuICAgICAgICAgIGNvbHVtbkdyb3Vwc0luZm8sXG4gICAgICAgICAgaGVhZGVyLmNoaWxkcmVuLFxuICAgICAgICAgIGN1cnJlbnRJbmRleCxcbiAgICAgICAgICBzaG93U3VtcyxcbiAgICAgICAgICBsZXZlbCArIDEsXG4gICAgICAgICAgaGVhZGVyXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGlzTm90TnVsbE9yVW5kZWZpbmVkKGhlYWRlci50YXJnZXRJbmRleCkpIHtcbiAgICAgICAgdGhpcy5maWxsQ2VsbHNGb3JDb2x1bW4oY2VsbHMsIGhlYWRlci50YXJnZXRJbmRleCk7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnRJbmRleCArPSBnZXRIZWFkZXJDaGlsZENvdW50KGhlYWRlciwgbGV2ZWwsIHNob3dTdW1zLCBudW1iZXJPZlN1bXMpO1xuICAgIH1cblxuICAgIGlmIChzaG93U3Vtc1tsZXZlbF0pIHtcbiAgICAgIGNvbnN0IGJhY2tncm91bmQgPSB0aGlzLmdldFN1bW1hcnlCYWNrZ3JvdW5kKGxldmVsKTtcbiAgICAgIGNvbnN0IHN1bW1hcnkgPSBsZXZlbCA9PT0gMCA/IHRoaXMuc3RyaW5ncy5zdW1tYXJ5U3RyaW5nIDogdGhpcy5zdHJpbmdzLmhlYWRlclN1bW1hcnlTdHJpbmc7XG4gICAgICBjb25zdCBudW1iZXJPZlZhbHVlcyA9IHRoaXMuZGF0YS52YWx1ZVRpdGxlcy5sZW5ndGg7XG4gICAgICBjb25zdCByb3dJbmRleCA9IE1hdGgubWF4KGxldmVsIC0gMSwgMCk7XG4gICAgICBjb25zdCBzaG91bGRBZGRWYWx1ZUhlYWRlcnMgPSBudW1iZXJPZlZhbHVlcyA+IDE7XG5cbiAgICAgIGNlbGxzW3Jvd0luZGV4XVtjdXJyZW50SW5kZXhdID0ge1xuICAgICAgICB2YWx1ZTogcGFyZW50SGVhZGVyPy50aXRsZSxcbiAgICAgICAgY29uc3RyYWludDogcGFyZW50SGVhZGVyPy5jb25zdHJhaW50LFxuICAgICAgICBsYWJlbDogcGFyZW50SGVhZGVyPy5hdHRyaWJ1dGVOYW1lLFxuICAgICAgICBjc3NDbGFzczogUGl2b3RUYWJsZUNvbnZlcnRlci5jb2x1bW5Hcm91cEhlYWRlckNsYXNzLFxuICAgICAgICBpc0hlYWRlcjogdHJ1ZSxcbiAgICAgICAgc3RpY2t5VG9wOiB0aGlzLmlzQ29sdW1uTGV2ZWxTdGlja3kobGV2ZWwpLFxuICAgICAgICByb3dTcGFuOiB0aGlzLmNvbHVtbkxldmVscyAtIHJvd0luZGV4IC0gKHNob3VsZEFkZFZhbHVlSGVhZGVycyA/IDEgOiAwKSxcbiAgICAgICAgY29sU3BhbjogbnVtYmVyT2ZTdW1zLFxuICAgICAgICBiYWNrZ3JvdW5kLFxuICAgICAgICBzdW1tYXJ5LFxuICAgICAgfTtcblxuICAgICAgaWYgKG51bWJlck9mVmFsdWVzID4gMCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlck9mVmFsdWVzOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBjb2x1bW5JbmRleEluQ2VsbHMgPSBjdXJyZW50SW5kZXggKyBpO1xuICAgICAgICAgIGlmIChzaG91bGRBZGRWYWx1ZUhlYWRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlVGl0bGUgPSB0aGlzLmRhdGEudmFsdWVUaXRsZXNbaV07XG4gICAgICAgICAgICBjZWxsc1t0aGlzLmNvbHVtbkxldmVscyAtIDFdW2NvbHVtbkluZGV4SW5DZWxsc10gPSB7XG4gICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVRpdGxlLFxuICAgICAgICAgICAgICBjc3NDbGFzczogUGl2b3RUYWJsZUNvbnZlcnRlci5jb2x1bW5Hcm91cEhlYWRlckNsYXNzLFxuICAgICAgICAgICAgICBpc0hlYWRlcjogdHJ1ZSxcbiAgICAgICAgICAgICAgc3RpY2t5VG9wOiB0aGlzLmlzQ29sdW1uTGV2ZWxTdGlja3kobGV2ZWwpLFxuICAgICAgICAgICAgICByb3dTcGFuOiAxLFxuICAgICAgICAgICAgICBjb2xTcGFuOiAxLFxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjb2x1bW5zSW5kZXhlcyA9IGdldFRhcmdldEluZGV4ZXNGb3JIZWFkZXJzKGhlYWRlcnMpO1xuICAgICAgICAgIGNvbnN0IHZhbHVlQ29sdW1uc0luZGV4ZXMgPSBjb2x1bW5zSW5kZXhlcy5maWx0ZXIoaW5kZXggPT4gaW5kZXggJSBudW1iZXJPZlZhbHVlcyA9PT0gaSk7XG4gICAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRDb2x1bW5JbmRleGVzID0gdmFsdWVDb2x1bW5zSW5kZXhlc1xuICAgICAgICAgICAgLm1hcCh2ID0+IHRoaXMuY29sdW1uc1RyYW5zZm9ybWF0aW9uQXJyYXlbdl0pXG4gICAgICAgICAgICAuZmlsdGVyKHYgPT4gaXNOb3ROdWxsT3JVbmRlZmluZWQodikpO1xuICAgICAgICAgIGNvbHVtbkdyb3Vwc0luZm9bY29sdW1uSW5kZXhJbkNlbGxzXSA9IHtiYWNrZ3JvdW5kLCBpbmRleGVzOiB0cmFuc2Zvcm1lZENvbHVtbkluZGV4ZXMsIGxldmVsfTtcblxuICAgICAgICAgIHRoaXMuZmlsbENlbGxzRm9yR3JvdXBlZENvbHVtbihjZWxscywgdmFsdWVDb2x1bW5zSW5kZXhlcywgY29sdW1uSW5kZXhJbkNlbGxzLCBiYWNrZ3JvdW5kKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29sdW1uR3JvdXBzSW5mb1tjdXJyZW50SW5kZXhdID0ge2JhY2tncm91bmQsIGluZGV4ZXM6IFtdLCBsZXZlbH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmaWxsQ2VsbHNGb3JHcm91cGVkQ29sdW1uKFxuICAgIGNlbGxzOiBMbXJQaXZvdFRhYmxlQ2VsbFtdW10sXG4gICAgY29sdW1uczogbnVtYmVyW10sXG4gICAgY29sdW1uSW5kZXhJbkNlbGxzOiBudW1iZXIsXG4gICAgYmFja2dyb3VuZDogc3RyaW5nXG4gICkge1xuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IHRoaXMucm93c1RyYW5zZm9ybWF0aW9uQXJyYXkubGVuZ3RoOyByb3crKykge1xuICAgICAgY29uc3Qgcm93SW5kZXhJbkNlbGxzID0gdGhpcy5yb3dzVHJhbnNmb3JtYXRpb25BcnJheVtyb3ddO1xuICAgICAgaWYgKGlzTm90TnVsbE9yVW5kZWZpbmVkKHJvd0luZGV4SW5DZWxscykpIHtcbiAgICAgICAgY29uc3Qge3ZhbHVlcywgZGF0YVJlc291cmNlc30gPSB0aGlzLmdldEdyb3VwZWRWYWx1ZXNGb3JSb3dzQW5kQ29scyhbcm93XSwgY29sdW1ucyk7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5hZ2dyZWdhdGVBbmRGb3JtYXREYXRhVmFsdWVzKHZhbHVlcywgW3Jvd10sIGNvbHVtbnMpO1xuICAgICAgICBjZWxsc1tyb3dJbmRleEluQ2VsbHNdW2NvbHVtbkluZGV4SW5DZWxsc10gPSB7XG4gICAgICAgICAgdmFsdWU6IFN0cmluZyhmb3JtYXR0ZWRWYWx1ZSksXG4gICAgICAgICAgZGF0YVJlc291cmNlcyxcbiAgICAgICAgICBjb2xTcGFuOiAxLFxuICAgICAgICAgIHJvd1NwYW46IDEsXG4gICAgICAgICAgY3NzQ2xhc3M6IFBpdm90VGFibGVDb252ZXJ0ZXIuZ3JvdXBEYXRhQ2xhc3MsXG4gICAgICAgICAgaXNIZWFkZXI6IGZhbHNlLFxuICAgICAgICAgIGJhY2tncm91bmQsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZ2dyZWdhdGVBbmRGb3JtYXREYXRhVmFsdWVzKHZhbHVlczogYW55W10sIHJvd3M6IG51bWJlcltdLCBjb2x1bW5zOiBudW1iZXJbXSk6IGFueSB7XG4gICAgY29uc3QgYWdncmVnYXRpb24gPSB0aGlzLmFnZ3JlZ2F0aW9uQnlDb2x1bW5zKGNvbHVtbnMpO1xuICAgIGlmIChhZ2dyZWdhdGlvbiA9PT0gRGF0YUFnZ3JlZ2F0aW9uVHlwZS5Kb2luKSB7XG4gICAgICBjb25zdCB2YWx1ZUluZGV4ID0gdGhpcy5nZXRWYWx1ZUluZGV4Rm9yQ29sdW1ucyhjb2x1bW5zKTtcbiAgICAgIGNvbnN0IGNvbnN0cmFpbnQgPSB0aGlzLmRhdGEudmFsdWVzQ29uc3RyYWludHM/Llt2YWx1ZUluZGV4XSB8fCB0aGlzLnZhbHVlVHlwZUluZm9bdmFsdWVJbmRleF0/LmRlZmF1bHRDb25zdHJhaW50O1xuICAgICAgcmV0dXJuIGFnZ3JlZ2F0ZURhdGFWYWx1ZXMoYWdncmVnYXRpb24sIHZhbHVlcywgY29uc3RyYWludCwgZmFsc2UsIHRoaXMuY29uc3RyYWludERhdGEpO1xuICAgIH1cbiAgICBjb25zdCBhZ2dyZWdhdGVkVmFsdWUgPSBhZ2dyZWdhdGVEYXRhVmFsdWVzKGFnZ3JlZ2F0aW9uLCB2YWx1ZXMpO1xuICAgIHJldHVybiB0aGlzLmZvcm1hdEdyb3VwZWRWYWx1ZUJ5VmFsdWVUeXBlKGFnZ3JlZ2F0ZWRWYWx1ZSwgcm93cywgY29sdW1ucyk7XG4gIH1cblxuICBwcml2YXRlIGFnZ3JlZ2F0aW9uQnlDb2x1bW5zKGNvbHVtbnM6IG51bWJlcltdKTogRGF0YUFnZ3JlZ2F0aW9uVHlwZSB7XG4gICAgY29uc3QgdmFsdWVJbmRleCA9IGNvbHVtbnNbMF0gJSB0aGlzLmRhdGEudmFsdWVUaXRsZXMubGVuZ3RoO1xuICAgIGNvbnN0IGFnZ3JlZ2F0aW9uID0gdGhpcy5kYXRhLnZhbHVlQWdncmVnYXRpb25zPy5bdmFsdWVJbmRleF07XG4gICAgcmV0dXJuIGlzVmFsdWVBZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbikgPyBhZ2dyZWdhdGlvbiA6IERhdGFBZ2dyZWdhdGlvblR5cGUuU3VtO1xuICB9XG5cbiAgcHJpdmF0ZSBmaWxsQ2VsbHNGb3JDb2x1bW4oY2VsbHM6IExtclBpdm90VGFibGVDZWxsW11bXSwgY29sdW1uOiBudW1iZXIpIHtcbiAgICBjb25zdCBjb2x1bW5JbmRleEluQ2VsbHMgPSB0aGlzLmNvbHVtbnNUcmFuc2Zvcm1hdGlvbkFycmF5W2NvbHVtbl07XG4gICAgaWYgKGlzTm90TnVsbE9yVW5kZWZpbmVkKGNvbHVtbkluZGV4SW5DZWxscykpIHtcbiAgICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IHRoaXMucm93c1RyYW5zZm9ybWF0aW9uQXJyYXkubGVuZ3RoOyByb3crKykge1xuICAgICAgICBjb25zdCByb3dJbmRleEluQ2VsbHMgPSB0aGlzLnJvd3NUcmFuc2Zvcm1hdGlvbkFycmF5W3Jvd107XG4gICAgICAgIGlmIChpc05vdE51bGxPclVuZGVmaW5lZChyb3dJbmRleEluQ2VsbHMpKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGEudmFsdWVzW3Jvd11bY29sdW1uXTtcbiAgICAgICAgICBjb25zdCBkYXRhUmVzb3VyY2VzID0gdGhpcy5kYXRhUmVzb3VyY2VzPy5bcm93XT8uW2NvbHVtbl0gfHwgW107XG4gICAgICAgICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSB0aGlzLmFnZ3JlZ2F0ZU9yRm9ybWF0U2luZ2xlVmFsdWUodmFsdWUsIGNvbHVtbik7XG4gICAgICAgICAgY29uc3Qgc3RyaW5nVmFsdWUgPSBpc05vdE51bGxPclVuZGVmaW5lZChmb3JtYXR0ZWRWYWx1ZSkgPyBTdHJpbmcoZm9ybWF0dGVkVmFsdWUpIDogJyc7XG4gICAgICAgICAgY2VsbHNbcm93SW5kZXhJbkNlbGxzXVtjb2x1bW5JbmRleEluQ2VsbHNdID0ge1xuICAgICAgICAgICAgdmFsdWU6IHN0cmluZ1ZhbHVlLFxuICAgICAgICAgICAgZGF0YVJlc291cmNlcyxcbiAgICAgICAgICAgIHJvd1NwYW46IDEsXG4gICAgICAgICAgICBjb2xTcGFuOiAxLFxuICAgICAgICAgICAgY3NzQ2xhc3M6IFBpdm90VGFibGVDb252ZXJ0ZXIuZGF0YUNsYXNzLFxuICAgICAgICAgICAgaXNIZWFkZXI6IGZhbHNlLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFnZ3JlZ2F0ZU9yRm9ybWF0U2luZ2xlVmFsdWUodmFsdWU6IGFueSwgY29sdW1uOiBudW1iZXIpOiBhbnkge1xuICAgIGNvbnN0IGFnZ3JlZ2F0aW9uID0gdGhpcy5hZ2dyZWdhdGlvbkJ5Q29sdW1ucyhbY29sdW1uXSk7XG4gICAgY29uc3QgdmFsdWVJbmRleCA9IHRoaXMuZ2V0VmFsdWVJbmRleEZvckNvbHVtbnMoW2NvbHVtbl0pO1xuICAgIGlmIChhZ2dyZWdhdGlvbiA9PT0gRGF0YUFnZ3JlZ2F0aW9uVHlwZS5Kb2luKSB7XG4gICAgICBjb25zdCBjb25zdHJhaW50ID0gdGhpcy5kYXRhLnZhbHVlc0NvbnN0cmFpbnRzPy5bdmFsdWVJbmRleF0gfHwgdGhpcy52YWx1ZVR5cGVJbmZvW3ZhbHVlSW5kZXhdPy5kZWZhdWx0Q29uc3RyYWludDtcbiAgICAgIHJldHVybiBhZ2dyZWdhdGVEYXRhVmFsdWVzKGFnZ3JlZ2F0aW9uLCBbdmFsdWVdLCBjb25zdHJhaW50LCBmYWxzZSwgdGhpcy5jb25zdHJhaW50RGF0YSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZvcm1hdFZhbHVlQnlWYWx1ZVR5cGUodmFsdWUsIHZhbHVlSW5kZXgpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaWxsQ2VsbHNCeUdyb3VwSW50ZXJzZWN0aW9uKFxuICAgIGNlbGxzOiBMbXJQaXZvdFRhYmxlQ2VsbFtdW10sXG4gICAgcm93R3JvdXBzSW5mbzogSGVhZGVyR3JvdXBJbmZvW10sXG4gICAgY29sdW1uR3JvdXBzSW5mbzogSGVhZGVyR3JvdXBJbmZvW11cbiAgKSB7XG4gICAgY29uc3Qgcm93c0NvdW50ID0gY2VsbHMubGVuZ3RoO1xuICAgIGNvbnN0IGNvbHVtbnNDb3VudCA9IChjZWxsc1swXSAmJiBjZWxsc1swXS5sZW5ndGgpIHx8IDA7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd0dyb3Vwc0luZm8ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHJvd0dyb3VwSW5mbyA9IHJvd0dyb3Vwc0luZm9baV07XG4gICAgICBpZiAocm93R3JvdXBJbmZvKSB7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY29sdW1uR3JvdXBzSW5mby5sZW5ndGg7IGorKykge1xuICAgICAgICAgIGlmIChjb2x1bW5Hcm91cHNJbmZvW2pdKSB7XG4gICAgICAgICAgICAvLyBpdCdzIGVub3VnaCB0byBmaWxsIGdyb3VwIHZhbHVlcyBvbmx5IGZyb20gcm93IHNpZGVcbiAgICAgICAgICAgIGNvbnN0IHtyb3dzSW5kZXhlcywgY29sdW1uc0luZGV4ZXN9ID0gdGhpcy5nZXRWYWx1ZXNJbmRleGVzRnJvbUNlbGxzSW5kZXhlcyhcbiAgICAgICAgICAgICAgcm93R3JvdXBJbmZvLmluZGV4ZXMsXG4gICAgICAgICAgICAgIGNvbHVtbkdyb3Vwc0luZm9bal0uaW5kZXhlc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHt2YWx1ZXMsIGRhdGFSZXNvdXJjZXN9ID0gdGhpcy5nZXRHcm91cGVkVmFsdWVzRm9yUm93c0FuZENvbHMocm93c0luZGV4ZXMsIGNvbHVtbnNJbmRleGVzKTtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5hZ2dyZWdhdGVBbmRGb3JtYXREYXRhVmFsdWVzKHZhbHVlcywgcm93c0luZGV4ZXMsIGNvbHVtbnNJbmRleGVzKTtcbiAgICAgICAgICAgIGNlbGxzW2ldW2pdID0ge1xuICAgICAgICAgICAgICB2YWx1ZTogU3RyaW5nKGZvcm1hdHRlZFZhbHVlKSxcbiAgICAgICAgICAgICAgZGF0YVJlc291cmNlcyxcbiAgICAgICAgICAgICAgY29sU3BhbjogMSxcbiAgICAgICAgICAgICAgcm93U3BhbjogMSxcbiAgICAgICAgICAgICAgY3NzQ2xhc3M6IFBpdm90VGFibGVDb252ZXJ0ZXIuZ3JvdXBEYXRhQ2xhc3MsXG4gICAgICAgICAgICAgIGlzSGVhZGVyOiBmYWxzZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5maWxsUm93V2l0aENvbG9yKGNlbGxzLCBpLCByb3dHcm91cEluZm8sIGNvbHVtbnNDb3VudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb2x1bW5Hcm91cHNJbmZvLmxlbmd0aDsgaisrKSB7XG4gICAgICBpZiAoY29sdW1uR3JvdXBzSW5mb1tqXSkge1xuICAgICAgICB0aGlzLmZpbGxDb2x1bW5XaXRoQ29sb3IoY2VsbHMsIGosIGNvbHVtbkdyb3Vwc0luZm9bal0sIHJvd0dyb3Vwc0luZm8sIHJvd3NDb3VudCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRWYWx1ZXNJbmRleGVzRnJvbUNlbGxzSW5kZXhlcyhcbiAgICByb3dzOiBudW1iZXJbXSxcbiAgICBjb2x1bW5zOiBudW1iZXJbXVxuICApOiB7cm93c0luZGV4ZXM6IG51bWJlcltdOyBjb2x1bW5zSW5kZXhlczogbnVtYmVyW119IHtcbiAgICBjb25zdCByb3dzSW5kZXhlcyA9IHJvd3NcbiAgICAgIC5tYXAocm93ID0+IHRoaXMucm93c1RyYW5zZm9ybWF0aW9uQXJyYXkuZmluZEluZGV4KHRSb3cgPT4gdFJvdyA9PT0gcm93KSlcbiAgICAgIC5maWx0ZXIoaW5kZXggPT4gaW5kZXggPj0gMCk7XG4gICAgY29uc3QgY29sdW1uc0luZGV4ZXMgPSBjb2x1bW5zXG4gICAgICAubWFwKGNvbHVtbiA9PiB0aGlzLmNvbHVtbnNUcmFuc2Zvcm1hdGlvbkFycmF5LmZpbmRJbmRleCh0Q29sdW1uID0+IHRDb2x1bW4gPT09IGNvbHVtbikpXG4gICAgICAuZmlsdGVyKGluZGV4ID0+IGluZGV4ID49IDApO1xuICAgIHJldHVybiB7cm93c0luZGV4ZXMsIGNvbHVtbnNJbmRleGVzfTtcbiAgfVxuXG4gIHByaXZhdGUgZmlsbFJvd1dpdGhDb2xvcihcbiAgICBjZWxsczogTG1yUGl2b3RUYWJsZUNlbGxbXVtdLFxuICAgIHJvdzogbnVtYmVyLFxuICAgIHJvd0dyb3VwSW5mbzogSGVhZGVyR3JvdXBJbmZvLFxuICAgIGNvbHVtbnNDb3VudDogbnVtYmVyXG4gICkge1xuICAgIGZvciAobGV0IGkgPSB0aGlzLnJvd0xldmVsczsgaSA8IGNvbHVtbnNDb3VudDsgaSsrKSB7XG4gICAgICBjZWxsc1tyb3ddW2ldICYmIChjZWxsc1tyb3ddW2ldLmJhY2tncm91bmQgPSByb3dHcm91cEluZm8uYmFja2dyb3VuZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmaWxsQ29sdW1uV2l0aENvbG9yKFxuICAgIGNlbGxzOiBMbXJQaXZvdFRhYmxlQ2VsbFtdW10sXG4gICAgY29sdW1uOiBudW1iZXIsXG4gICAgY29sdW1uR3JvdXBJbmZvOiBIZWFkZXJHcm91cEluZm8sXG4gICAgcm93R3JvdXBzSW5mbzogSGVhZGVyR3JvdXBJbmZvW10sXG4gICAgcm93Q291bnQ6IG51bWJlclxuICApIHtcbiAgICBmb3IgKGxldCBpID0gdGhpcy5jb2x1bW5MZXZlbHM7IGkgPCByb3dDb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCByb3dHcm91cEluZm8gPSByb3dHcm91cHNJbmZvW2ldO1xuICAgICAgaWYgKCFyb3dHcm91cEluZm8gfHwgcm93R3JvdXBJbmZvLmxldmVsID4gY29sdW1uR3JvdXBJbmZvLmxldmVsKSB7XG4gICAgICAgIGNlbGxzW2ldW2NvbHVtbl0gJiYgKGNlbGxzW2ldW2NvbHVtbl0uYmFja2dyb3VuZCA9IGNvbHVtbkdyb3VwSW5mby5iYWNrZ3JvdW5kKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXRDZWxscygpOiBMbXJQaXZvdFRhYmxlQ2VsbFtdW10ge1xuICAgIGNvbnN0IHJvd3MgPSB0aGlzLmdldFJvd3NDb3VudCgpICsgdGhpcy5jb2x1bW5MZXZlbHM7XG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMuZ2V0Q29sdW1uc0NvdW50KCkgKyB0aGlzLnJvd0xldmVscztcblxuICAgIGNvbnN0IG1hdHJpeDogTG1yUGl2b3RUYWJsZUNlbGxbXVtdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dzOyBpKyspIHtcbiAgICAgIG1hdHJpeFtpXSA9IFtdO1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb2x1bW5zOyBqKyspIHtcbiAgICAgICAgaWYgKGkgPj0gdGhpcy5jb2x1bW5MZXZlbHMgJiYgaiA+PSB0aGlzLnJvd0xldmVscykge1xuICAgICAgICAgIGNvbnN0IGlzRGF0YUNsYXNzID0gdGhpcy5yb3dzVHJhbnNmb3JtYXRpb25BcnJheS5pbmNsdWRlcyhpKSAmJiB0aGlzLmNvbHVtbnNUcmFuc2Zvcm1hdGlvbkFycmF5LmluY2x1ZGVzKGopO1xuICAgICAgICAgIG1hdHJpeFtpXVtqXSA9IHtcbiAgICAgICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgICAgIGRhdGFSZXNvdXJjZXM6IFtdLFxuICAgICAgICAgICAgY3NzQ2xhc3M6IGlzRGF0YUNsYXNzID8gUGl2b3RUYWJsZUNvbnZlcnRlci5kYXRhQ2xhc3MgOiBQaXZvdFRhYmxlQ29udmVydGVyLmdyb3VwRGF0YUNsYXNzLFxuICAgICAgICAgICAgcm93U3BhbjogMSxcbiAgICAgICAgICAgIGNvbFNwYW46IDEsXG4gICAgICAgICAgICBpc0hlYWRlcjogZmFsc2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtYXRyaXhbaV1bal0gPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5yb3dMZXZlbHMgPiAwICYmIHRoaXMuY29sdW1uTGV2ZWxzID4gMCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbkxldmVsczsgaSsrKSB7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5yb3dMZXZlbHM7IGorKykge1xuICAgICAgICAgIG1hdHJpeFtpXVtqXSA9IHtcbiAgICAgICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgICAgIGNzc0NsYXNzOiBQaXZvdFRhYmxlQ29udmVydGVyLmVtcHR5Q2xhc3MsXG4gICAgICAgICAgICByb3dTcGFuOiAxLFxuICAgICAgICAgICAgY29sU3BhbjogMSxcbiAgICAgICAgICAgIHN0aWNreVN0YXJ0OiB0aGlzLmlzUm93TGV2ZWxTdGlja3koaiksXG4gICAgICAgICAgICBzdGlja3lUb3A6IHRoaXMuaXNDb2x1bW5MZXZlbFN0aWNreShpKSxcbiAgICAgICAgICAgIGlzSGVhZGVyOiBmYWxzZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdHJpeDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Um93c0NvdW50KCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuZGF0YS5yb3dIZWFkZXJzLmxlbmd0aCA9PT0gMCAmJiAodGhpcy5kYXRhLnZhbHVlVGl0bGVzIHx8IFtdKS5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgcmV0dXJuIGdldEhlYWRlcnNDaGlsZENvdW50KHRoaXMuZGF0YS5yb3dIZWFkZXJzLCB0aGlzLnJvd1Nob3dTdW1zKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29sdW1uc0NvdW50KCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuZGF0YS5jb2x1bW5IZWFkZXJzLmxlbmd0aCA9PT0gMCAmJiAodGhpcy5kYXRhLnZhbHVlVGl0bGVzIHx8IFtdKS5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgY29uc3QgbnVtYmVyT2ZTdW1zID0gTWF0aC5tYXgoMSwgKHRoaXMuZGF0YS52YWx1ZVRpdGxlcyB8fCBbXSkubGVuZ3RoKTtcbiAgICByZXR1cm4gZ2V0SGVhZGVyc0NoaWxkQ291bnQodGhpcy5kYXRhLmNvbHVtbkhlYWRlcnMsIHRoaXMuY29sdW1uU2hvd1N1bXMsIG51bWJlck9mU3Vtcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJlcGFyZVBpdm90RGF0YShcbiAgZGF0YTogTG1yUGl2b3RTdGVtRGF0YSxcbiAgY29uc3RyYWludERhdGE6IENvbnN0cmFpbnREYXRhLFxuICB2YWx1ZVR5cGVJbmZvOiBWYWx1ZVR5cGVJbmZvW11cbik6IExtclBpdm90U3RlbURhdGEge1xuICBjb25zdCBudW1iZXJPZlN1bXMgPSBNYXRoLm1heCgxLCAoZGF0YS52YWx1ZVRpdGxlcyB8fCBbXSkubGVuZ3RoKTtcbiAgY29uc3QgdmFsdWVzID0gY29tcHV0ZVZhbHVlc0J5VmFsdWVUeXBlKGRhdGEudmFsdWVzLCBkYXRhLnZhbHVlVHlwZXMsIG51bWJlck9mU3VtcywgdmFsdWVUeXBlSW5mbyk7XG4gIHJldHVybiBzb3J0UGl2b3REYXRhKHsuLi5kYXRhLCB2YWx1ZXN9LCBjb25zdHJhaW50RGF0YSk7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVWYWx1ZXNCeVZhbHVlVHlwZShcbiAgdmFsdWVzOiBhbnlbXVtdLFxuICB2YWx1ZVR5cGVzOiBMbXJQaXZvdFZhbHVlVHlwZVtdLFxuICBudW1WYWx1ZXM6IG51bWJlcixcbiAgdmFsdWVUeXBlSW5mbzogVmFsdWVUeXBlSW5mb1tdXG4pOiBhbnlbXVtdIHtcbiAgY29uc3Qgcm93c0luZGV4ZXMgPSBbLi4uQXJyYXkodmFsdWVzLmxlbmd0aCkua2V5cygpXTtcbiAgY29uc3QgbW9kaWZpZWRWYWx1ZXMgPSBkZWVwT2JqZWN0Q29weSh2YWx1ZXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyBpKyspIHtcbiAgICBjb25zdCB2YWx1ZVR5cGUgPSB2YWx1ZVR5cGVzICYmIHZhbHVlVHlwZXNbaV07XG4gICAgaWYgKCF2YWx1ZVR5cGUgfHwgdmFsdWVUeXBlID09PSBMbXJQaXZvdFZhbHVlVHlwZS5EZWZhdWx0KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBjb2x1bW5zQ291bnQgPSAodmFsdWVzWzBdICYmIHZhbHVlc1swXS5sZW5ndGgpIHx8IDA7XG4gICAgY29uc3QgY29sdW1uSW5kZXhlcyA9IFsuLi5BcnJheShjb2x1bW5zQ291bnQpLmtleXMoKV0uZmlsdGVyKGtleSA9PiBrZXkgJSBudW1WYWx1ZXMgPT09IGkpO1xuICAgIGNvbnN0IGluZm8gPSB2YWx1ZVR5cGVJbmZvW2ldO1xuXG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93c0luZGV4ZXMpIHtcbiAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbkluZGV4ZXMpIHtcbiAgICAgICAgaWYgKHZhbHVlVHlwZSA9PT0gTG1yUGl2b3RWYWx1ZVR5cGUuQWxsUGVyY2VudGFnZSkge1xuICAgICAgICAgIG1vZGlmaWVkVmFsdWVzW3Jvd11bY29sdW1uXSA9IGRpdmlkZVZhbHVlcyh2YWx1ZXNbcm93XVtjb2x1bW5dLCBpbmZvLnN1bSk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWVUeXBlID09PSBMbXJQaXZvdFZhbHVlVHlwZS5Sb3dQZXJjZW50YWdlKSB7XG4gICAgICAgICAgbW9kaWZpZWRWYWx1ZXNbcm93XVtjb2x1bW5dID0gZGl2aWRlVmFsdWVzKHZhbHVlc1tyb3ddW2NvbHVtbl0sIGluZm8uc3Vtc1Jvd3Nbcm93XSk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWVUeXBlID09PSBMbXJQaXZvdFZhbHVlVHlwZS5Db2x1bW5QZXJjZW50YWdlKSB7XG4gICAgICAgICAgbW9kaWZpZWRWYWx1ZXNbcm93XVtjb2x1bW5dID0gZGl2aWRlVmFsdWVzKHZhbHVlc1tyb3ddW2NvbHVtbl0sIGluZm8uc3Vtc0NvbHVtbnNbY29sdW1uXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbW9kaWZpZWRWYWx1ZXM7XG59XG5cbmZ1bmN0aW9uIGdldFZhbHVlc1R5cGVJbmZvKHZhbHVlczogYW55W11bXSwgdmFsdWVUeXBlczogTG1yUGl2b3RWYWx1ZVR5cGVbXSwgbnVtVmFsdWVzOiBudW1iZXIpOiBWYWx1ZVR5cGVJbmZvW10ge1xuICBjb25zdCB2YWx1ZVR5cGVJbmZvID0gW107XG4gIGNvbnN0IHJvd3NJbmRleGVzID0gWy4uLkFycmF5KHZhbHVlcy5sZW5ndGgpLmtleXMoKV07XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1WYWx1ZXM7IGkrKykge1xuICAgIGNvbnN0IHZhbHVlVHlwZSA9IHZhbHVlVHlwZXMgJiYgdmFsdWVUeXBlc1tpXTtcbiAgICBjb25zdCBjb2x1bW5zQ291bnQgPSAodmFsdWVzWzBdICYmIHZhbHVlc1swXS5sZW5ndGgpIHx8IDA7XG4gICAgY29uc3QgY29sdW1uSW5kZXhlcyA9IFsuLi5BcnJheShjb2x1bW5zQ291bnQpLmtleXMoKV0uZmlsdGVyKGtleSA9PiBrZXkgJSBudW1WYWx1ZXMgPT09IGkpO1xuXG4gICAgdmFsdWVUeXBlSW5mb1tpXSA9IGdldFZhbHVlVHlwZUluZm8odmFsdWVzLCB2YWx1ZVR5cGUsIHJvd3NJbmRleGVzLCBjb2x1bW5JbmRleGVzKTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZVR5cGVJbmZvO1xufVxuXG5mdW5jdGlvbiBnZXRWYWx1ZVR5cGVJbmZvKHZhbHVlczogYW55W11bXSwgdHlwZTogTG1yUGl2b3RWYWx1ZVR5cGUsIHJvd3M6IG51bWJlcltdLCBjb2x1bW5zOiBudW1iZXJbXSk6IFZhbHVlVHlwZUluZm8ge1xuICBjb25zdCBjb250YWluc0RlY2ltYWwgPSBjb250YWluc0RlY2ltYWxWYWx1ZSh2YWx1ZXMsIHJvd3MsIGNvbHVtbnMpO1xuICBjb25zdCB2YWx1ZVR5cGVJbmZvOiBWYWx1ZVR5cGVJbmZvID0ge1xuICAgIGRlZmF1bHRDb25zdHJhaW50OiBjb250YWluc0RlY2ltYWwgPyBuZXcgTnVtYmVyQ29uc3RyYWludCh7ZGVjaW1hbHM6IDJ9KSA6IG51bGwsXG4gIH07XG5cbiAgaWYgKHR5cGUgPT09IExtclBpdm90VmFsdWVUeXBlLkFsbFBlcmNlbnRhZ2UpIHtcbiAgICByZXR1cm4gey4uLnZhbHVlVHlwZUluZm8sIHN1bTogZ2V0TnVtZXJpY1ZhbHVlc1N1bW1hcnkodmFsdWVzLCByb3dzLCBjb2x1bW5zKX07XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTG1yUGl2b3RWYWx1ZVR5cGUuUm93UGVyY2VudGFnZSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi52YWx1ZVR5cGVJbmZvLFxuICAgICAgc3Vtc1Jvd3M6IHJvd3MucmVkdWNlKChhcnIsIHJvdykgPT4ge1xuICAgICAgICBhcnJbcm93XSA9IGdldE51bWVyaWNWYWx1ZXNTdW1tYXJ5KHZhbHVlcywgW3Jvd10sIGNvbHVtbnMpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgICAgfSwgW10pLFxuICAgIH07XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTG1yUGl2b3RWYWx1ZVR5cGUuQ29sdW1uUGVyY2VudGFnZSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi52YWx1ZVR5cGVJbmZvLFxuICAgICAgc3Vtc0NvbHVtbnM6IGNvbHVtbnMucmVkdWNlKChhcnIsIGNvbHVtbikgPT4ge1xuICAgICAgICBhcnJbY29sdW1uXSA9IGdldE51bWVyaWNWYWx1ZXNTdW1tYXJ5KHZhbHVlcywgcm93cywgW2NvbHVtbl0pO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgICAgfSwgW10pLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gey4uLnZhbHVlVHlwZUluZm99O1xufVxuXG5mdW5jdGlvbiBjb250YWluc0RlY2ltYWxWYWx1ZSh2YWx1ZXM6IGFueVtdW10sIHJvd3M6IG51bWJlcltdLCBjb2x1bW5zOiBudW1iZXJbXSk6IGJvb2xlYW4ge1xuICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgZm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuICAgICAgaWYgKGlzVmFsdWVEZWNpbWFsKHZhbHVlc1tyb3ddW2NvbHVtbl0pKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzVmFsdWVEZWNpbWFsKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChpc051bWVyaWModmFsdWUpKSB7XG4gICAgcmV0dXJuIHRvTnVtYmVyKHZhbHVlKSAlIDEgIT09IDA7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVUcmFuc2Zvcm1hdGlvbk1hcChcbiAgaGVhZGVyczogTG1yUGl2b3REYXRhSGVhZGVyW10sXG4gIHNob3dTdW1zOiBib29sZWFuW10sXG4gIGFkZGl0aW9uYWxOdW06IG51bWJlcixcbiAgbnVtYmVyT2ZTdW1zOiBudW1iZXJcbik6IG51bWJlcltdIHtcbiAgY29uc3QgYXJyYXkgPSBbXTtcbiAgaXRlcmF0ZVRocm91Z2hUcmFuc2Zvcm1hdGlvbk1hcChoZWFkZXJzLCBhZGRpdGlvbmFsTnVtLCBhcnJheSwgMCwgc2hvd1N1bXMsIG51bWJlck9mU3Vtcyk7XG4gIHJldHVybiBhcnJheTtcbn1cblxuZnVuY3Rpb24gaXRlcmF0ZVRocm91Z2hUcmFuc2Zvcm1hdGlvbk1hcChcbiAgaGVhZGVyczogTG1yUGl2b3REYXRhSGVhZGVyW10sXG4gIGFkZGl0aW9uYWxOdW06IG51bWJlcixcbiAgYXJyYXk6IG51bWJlcltdLFxuICBsZXZlbDogbnVtYmVyLFxuICBzaG93U3VtczogYm9vbGVhbltdLFxuICBudW1iZXJPZlN1bXM6IG51bWJlclxuKSB7XG4gIGxldCBhZGRpdGlvbmFsID0gYWRkaXRpb25hbE51bTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgaGVhZGVyID0gaGVhZGVyc1tpXTtcbiAgICBpZiAoaGVhZGVyLmNoaWxkcmVuKSB7XG4gICAgICBpdGVyYXRlVGhyb3VnaFRyYW5zZm9ybWF0aW9uTWFwKGhlYWRlci5jaGlsZHJlbiwgYWRkaXRpb25hbCwgYXJyYXksIGxldmVsICsgMSwgc2hvd1N1bXMsIG51bWJlck9mU3Vtcyk7XG4gICAgICBhZGRpdGlvbmFsICs9IGdldEhlYWRlckNoaWxkQ291bnQoaGVhZGVyLCBsZXZlbCwgc2hvd1N1bXMsIG51bWJlck9mU3Vtcyk7XG4gICAgfSBlbHNlIGlmIChpc05vdE51bGxPclVuZGVmaW5lZChoZWFkZXIudGFyZ2V0SW5kZXgpKSB7XG4gICAgICBhcnJheVtoZWFkZXIudGFyZ2V0SW5kZXhdID0gaSArIGFkZGl0aW9uYWw7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldEluZGV4ZXNGb3JIZWFkZXJzKGhlYWRlcnM6IExtclBpdm90RGF0YUhlYWRlcltdKTogbnVtYmVyW10ge1xuICBjb25zdCBhbGxSb3dzID0gKGhlYWRlcnMgfHwgW10pLnJlZHVjZSgocm93cywgaGVhZGVyKSA9PiB7XG4gICAgcm93cy5wdXNoKC4uLmdldFRhcmdldEluZGV4ZXNGb3JIZWFkZXIoaGVhZGVyKSk7XG4gICAgcmV0dXJuIHJvd3M7XG4gIH0sIFtdKTtcbiAgcmV0dXJuIHVuaXF1ZVZhbHVlczxudW1iZXI+KGFsbFJvd3MpO1xufVxuXG5mdW5jdGlvbiBnZXRUYXJnZXRJbmRleGVzRm9ySGVhZGVyKHBpdm90RGF0YUhlYWRlcjogTG1yUGl2b3REYXRhSGVhZGVyKTogbnVtYmVyW10ge1xuICBpZiAocGl2b3REYXRhSGVhZGVyLmNoaWxkcmVuKSB7XG4gICAgcmV0dXJuIHBpdm90RGF0YUhlYWRlci5jaGlsZHJlbi5yZWR1Y2UoKHJvd3MsIGhlYWRlcikgPT4ge1xuICAgICAgcm93cy5wdXNoKC4uLmdldFRhcmdldEluZGV4ZXNGb3JIZWFkZXIoaGVhZGVyKSk7XG4gICAgICByZXR1cm4gcm93cztcbiAgICB9LCBbXSk7XG4gIH1cbiAgcmV0dXJuIFtwaXZvdERhdGFIZWFkZXIudGFyZ2V0SW5kZXhdO1xufVxuXG5mdW5jdGlvbiBnZXRIZWFkZXJzQ2hpbGRDb3VudChoZWFkZXJzOiBMbXJQaXZvdERhdGFIZWFkZXJbXSwgc2hvd1N1bXM6IGJvb2xlYW5bXSwgbnVtYmVyT2ZTdW1zID0gMSk6IG51bWJlciB7XG4gIHJldHVybiAoaGVhZGVycyB8fCBbXSkucmVkdWNlKFxuICAgIChzdW0sIGhlYWRlcikgPT4gc3VtICsgZ2V0SGVhZGVyQ2hpbGRDb3VudChoZWFkZXIsIDAsIHNob3dTdW1zLCBudW1iZXJPZlN1bXMpLFxuICAgIHNob3dTdW1zWzBdID8gbnVtYmVyT2ZTdW1zIDogMFxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRIZWFkZXJDaGlsZENvdW50KFxuICBwaXZvdERhdGFIZWFkZXI6IExtclBpdm90RGF0YUhlYWRlcixcbiAgbGV2ZWw6IG51bWJlcixcbiAgc2hvd1N1bXM6IGJvb2xlYW5bXSxcbiAgbnVtYmVyT2ZTdW1zID0gMSxcbiAgaW5jbHVkZUNoaWxkID0gdHJ1ZVxuKTogbnVtYmVyIHtcbiAgaWYgKHBpdm90RGF0YUhlYWRlci5jaGlsZHJlbikge1xuICAgIHJldHVybiBwaXZvdERhdGFIZWFkZXIuY2hpbGRyZW4ucmVkdWNlKFxuICAgICAgKHN1bSwgaGVhZGVyKSA9PiBzdW0gKyBnZXRIZWFkZXJDaGlsZENvdW50KGhlYWRlciwgbGV2ZWwgKyAxLCBzaG93U3VtcywgbnVtYmVyT2ZTdW1zLCBpbmNsdWRlQ2hpbGQpLFxuICAgICAgc2hvd1N1bXNbbGV2ZWwgKyAxXSA/IG51bWJlck9mU3VtcyA6IDBcbiAgICApO1xuICB9XG4gIHJldHVybiBpbmNsdWRlQ2hpbGQgPyAxIDogMDtcbn1cblxuZnVuY3Rpb24gZ2V0RGlyZWN0SGVhZGVyQ2hpbGRDb3VudChcbiAgcGl2b3REYXRhSGVhZGVyOiBMbXJQaXZvdERhdGFIZWFkZXIsXG4gIGxldmVsOiBudW1iZXIsXG4gIHNob3dTdW1zOiBib29sZWFuW10sXG4gIG51bWJlck9mU3VtcyA9IDFcbik6IG51bWJlciB7XG4gIGlmIChwaXZvdERhdGFIZWFkZXIuY2hpbGRyZW4pIHtcbiAgICByZXR1cm4gcGl2b3REYXRhSGVhZGVyLmNoaWxkcmVuLnJlZHVjZShcbiAgICAgIChzdW0sIGhlYWRlcikgPT4gc3VtICsgZ2V0SGVhZGVyQ2hpbGRDb3VudChoZWFkZXIsIGxldmVsICsgMSwgc2hvd1N1bXMsIG51bWJlck9mU3VtcyksXG4gICAgICAwXG4gICAgKTtcbiAgfVxuICByZXR1cm4gMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvcnRQaXZvdERhdGEoZGF0YTogTG1yUGl2b3RTdGVtRGF0YSwgY29uc3RyYWludERhdGE6IENvbnN0cmFpbnREYXRhKTogTG1yUGl2b3RTdGVtRGF0YSB7XG4gIHJldHVybiB7XG4gICAgLi4uZGF0YSxcbiAgICByb3dIZWFkZXJzOiBzb3J0UGl2b3RSb3dEYXRhSGVhZGVycyhkYXRhLnJvd0hlYWRlcnMsIGRhdGEucm93U29ydHMsIGRhdGEsIGNvbnN0cmFpbnREYXRhKSxcbiAgICBjb2x1bW5IZWFkZXJzOiBzb3J0UGl2b3RDb2x1bW5EYXRhSGVhZGVycyhkYXRhLmNvbHVtbkhlYWRlcnMsIGRhdGEuY29sdW1uU29ydHMsIGRhdGEsIGNvbnN0cmFpbnREYXRhKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gc29ydFBpdm90Um93RGF0YUhlYWRlcnMoXG4gIHJvd0hlYWRlcnM6IExtclBpdm90RGF0YUhlYWRlcltdLFxuICByb3dTb3J0czogTG1yUGl2b3RTb3J0W10sXG4gIHBpdm90RGF0YTogTG1yUGl2b3RTdGVtRGF0YSxcbiAgY29uc3RyYWludERhdGE6IENvbnN0cmFpbnREYXRhXG4pOiBMbXJQaXZvdERhdGFIZWFkZXJbXSB7XG4gIHJldHVybiBzb3J0UGl2b3REYXRhSGVhZGVyc1JlY3Vyc2l2ZShcbiAgICByb3dIZWFkZXJzLFxuICAgIDAsXG4gICAgcm93U29ydHMsXG4gICAgcGl2b3REYXRhLmNvbHVtbkhlYWRlcnMsXG4gICAgcGl2b3REYXRhLnZhbHVlcyxcbiAgICBwaXZvdERhdGEudmFsdWVUaXRsZXMgfHwgW10sXG4gICAgdHJ1ZSxcbiAgICBjb25zdHJhaW50RGF0YVxuICApO1xufVxuXG5mdW5jdGlvbiBzb3J0UGl2b3RDb2x1bW5EYXRhSGVhZGVycyhcbiAgY29sdW1uSGVhZGVyczogTG1yUGl2b3REYXRhSGVhZGVyW10sXG4gIGNvbHVtblNvcnRzOiBMbXJQaXZvdFNvcnRbXSxcbiAgcGl2b3REYXRhOiBMbXJQaXZvdFN0ZW1EYXRhLFxuICBjb25zdHJhaW50RGF0YTogQ29uc3RyYWludERhdGFcbik6IExtclBpdm90RGF0YUhlYWRlcltdIHtcbiAgcmV0dXJuIHNvcnRQaXZvdERhdGFIZWFkZXJzUmVjdXJzaXZlKFxuICAgIGNvbHVtbkhlYWRlcnMsXG4gICAgMCxcbiAgICBjb2x1bW5Tb3J0cyxcbiAgICBwaXZvdERhdGEucm93SGVhZGVycyxcbiAgICBwaXZvdERhdGEudmFsdWVzLFxuICAgIHBpdm90RGF0YS52YWx1ZVRpdGxlcyB8fCBbXSxcbiAgICBmYWxzZSxcbiAgICBjb25zdHJhaW50RGF0YVxuICApO1xufVxuXG5mdW5jdGlvbiBzb3J0UGl2b3REYXRhSGVhZGVyc1JlY3Vyc2l2ZShcbiAgaGVhZGVyczogTG1yUGl2b3REYXRhSGVhZGVyW10sXG4gIGluZGV4OiBudW1iZXIsXG4gIHNvcnRzOiBMbXJQaXZvdFNvcnRbXSxcbiAgb3RoZXJTaWRlSGVhZGVyczogTG1yUGl2b3REYXRhSGVhZGVyW10sXG4gIHZhbHVlczogYW55W11bXSxcbiAgdmFsdWVUaXRsZXM6IHN0cmluZ1tdLFxuICBpc1Jvd3M6IGJvb2xlYW4sXG4gIGNvbnN0cmFpbnREYXRhOiBDb25zdHJhaW50RGF0YVxuKTogTG1yUGl2b3REYXRhSGVhZGVyW10ge1xuICAvLyB3ZSBkb24ndCB3YW50IHRvIHNvcnQgdmFsdWVzIGhlYWRlcnNcbiAgaWYgKCFpc1Jvd3MgJiYgaXNWYWx1ZXNIZWFkZXJzKGhlYWRlcnMsIHZhbHVlVGl0bGVzKSkge1xuICAgIHJldHVybiBoZWFkZXJzO1xuICB9XG4gIGNvbnN0IHNvcnQgPSBzb3J0cyAmJiBzb3J0c1tpbmRleF07XG4gIGNvbnN0IGNvbnN0cmFpbnQgPSBnZXRDb25zdHJhaW50Rm9yU29ydChzb3J0LCBoZWFkZXJzKTtcbiAgY29uc3QgdmFsdWVzTWFwID0gY3JlYXRlSGVhZGVyc1ZhbHVlc01hcChoZWFkZXJzLCBzb3J0LCBvdGhlclNpZGVIZWFkZXJzLCB2YWx1ZXMsIHZhbHVlVGl0bGVzLCBpc1Jvd3MpO1xuICByZXR1cm4gaGVhZGVyc1xuICAgIC5tYXAoaGVhZGVyID0+ICh7XG4gICAgICAuLi5oZWFkZXIsXG4gICAgICBjaGlsZHJlbjpcbiAgICAgICAgaGVhZGVyLmNoaWxkcmVuICYmXG4gICAgICAgIHNvcnRQaXZvdERhdGFIZWFkZXJzUmVjdXJzaXZlKFxuICAgICAgICAgIGhlYWRlci5jaGlsZHJlbixcbiAgICAgICAgICBpbmRleCArIDEsXG4gICAgICAgICAgc29ydHMsXG4gICAgICAgICAgb3RoZXJTaWRlSGVhZGVycyxcbiAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgdmFsdWVUaXRsZXMsXG4gICAgICAgICAgaXNSb3dzLFxuICAgICAgICAgIGNvbnN0cmFpbnREYXRhXG4gICAgICAgICksXG4gICAgfSkpXG4gICAgLnNvcnQoKHIxLCByMikgPT4ge1xuICAgICAgY29uc3QgcjFWYWx1ZSA9IGNvbnN0cmFpbnQuY3JlYXRlRGF0YVZhbHVlKHZhbHVlc01hcFtyMS50aXRsZV0sIGNvbnN0cmFpbnREYXRhKTtcbiAgICAgIGNvbnN0IHIyVmFsdWUgPSBjb25zdHJhaW50LmNyZWF0ZURhdGFWYWx1ZSh2YWx1ZXNNYXBbcjIudGl0bGVdLCBjb25zdHJhaW50RGF0YSk7XG4gICAgICBjb25zdCBtdWx0aXBsaWVyID0gIXNvcnQgfHwgc29ydC5hc2MgPyAxIDogLTE7XG4gICAgICByZXR1cm4gcjFWYWx1ZS5jb21wYXJlVG8ocjJWYWx1ZSkgKiBtdWx0aXBsaWVyO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRDb25zdHJhaW50Rm9yU29ydChzb3J0OiBMbXJQaXZvdFNvcnQsIGhlYWRlcnM6IExtclBpdm90RGF0YUhlYWRlcltdKTogQ29uc3RyYWludCB7XG4gIGlmICgoc29ydD8ubGlzdD8udmFsdWVzIHx8IFtdKS5sZW5ndGggPiAwKSB7XG4gICAgLy8gc29ydCBpcyBkb25lIGJ5IHZhbHVlcyBpbiBjb2x1bW5zXG4gICAgcmV0dXJuIG5ldyBOdW1iZXJDb25zdHJhaW50KHt9KTtcbiAgfVxuICByZXR1cm4gKChoZWFkZXJzIHx8IFtdKVswXSAmJiAoaGVhZGVycyB8fCBbXSlbMF0uY29uc3RyYWludCkgfHwgbmV3IFVua25vd25Db25zdHJhaW50KCk7XG59XG5cbmZ1bmN0aW9uIGlzVmFsdWVzSGVhZGVycyhoZWFkZXJzOiBMbXJQaXZvdERhdGFIZWFkZXJbXSwgdmFsdWVUaXRsZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgdmFsdWVUaXRsZXMubGVuZ3RoID4gMSAmJlxuICAgIChoZWFkZXJzIHx8IFtdKS5ldmVyeShcbiAgICAgIChoZWFkZXIsIGluZGV4KSA9PiBpc05vdE51bGxPclVuZGVmaW5lZChoZWFkZXIudGFyZ2V0SW5kZXgpICYmIGhlYWRlci50aXRsZSA9PT0gdmFsdWVUaXRsZXNbaW5kZXhdXG4gICAgKVxuICApO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVIZWFkZXJzVmFsdWVzTWFwKFxuICBoZWFkZXJzOiBMbXJQaXZvdERhdGFIZWFkZXJbXSxcbiAgc29ydDogTG1yUGl2b3RTb3J0LFxuICBvdGhlclNpZGVIZWFkZXJzOiBMbXJQaXZvdERhdGFIZWFkZXJbXSxcbiAgdmFsdWVzOiBhbnlbXVtdLFxuICB2YWx1ZVRpdGxlczogc3RyaW5nW10sXG4gIGlzUm93czogYm9vbGVhblxuKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gIGNvbnN0IHNvcnRUYXJnZXRJbmRleGVzID0gc29ydFZhbHVlVGFyZ2V0SW5kZXhlcyhzb3J0LCBvdGhlclNpZGVIZWFkZXJzLCB2YWx1ZVRpdGxlcyk7XG4gIGlmICghc29ydFRhcmdldEluZGV4ZXMpIHtcbiAgICByZXR1cm4gKGhlYWRlcnMgfHwgW10pLnJlZHVjZSgodmFsdWVzTWFwLCBoZWFkZXIpID0+IHtcbiAgICAgIHZhbHVlc01hcFtoZWFkZXIudGl0bGVdID0gaGVhZGVyLnRpdGxlO1xuICAgICAgcmV0dXJuIHZhbHVlc01hcDtcbiAgICB9LCB7fSk7XG4gIH1cblxuICByZXR1cm4gKGhlYWRlcnMgfHwgW10pLnJlZHVjZSgodmFsdWVzTWFwLCBoZWFkZXIpID0+IHtcbiAgICBjb25zdCByb3dzID0gaXNSb3dzID8gZ2V0VGFyZ2V0SW5kZXhlc0ZvckhlYWRlcihoZWFkZXIpIDogc29ydFRhcmdldEluZGV4ZXM7XG4gICAgY29uc3QgY29sdW1ucyA9IGlzUm93cyA/IHNvcnRUYXJnZXRJbmRleGVzIDogZ2V0VGFyZ2V0SW5kZXhlc0ZvckhlYWRlcihoZWFkZXIpO1xuICAgIHZhbHVlc01hcFtoZWFkZXIudGl0bGVdID0gZ2V0TnVtZXJpY1ZhbHVlc1N1bW1hcnkodmFsdWVzLCByb3dzLCBjb2x1bW5zKTtcbiAgICByZXR1cm4gdmFsdWVzTWFwO1xuICB9LCB7fSk7XG59XG5cbmZ1bmN0aW9uIGdldE51bWVyaWNWYWx1ZXNTdW1tYXJ5KHZhbHVlczogYW55W11bXSwgcm93czogbnVtYmVyW10sIGNvbHVtbnM6IG51bWJlcltdKTogbnVtYmVyIHtcbiAgbGV0IHN1bSA9IDA7XG4gIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHZhbHVlc1tyb3ddW2NvbHVtbl07XG4gICAgICBpZiAoaXNOb3ROdWxsT3JVbmRlZmluZWQodmFsdWUpICYmIGlzTnVtZXJpYyh2YWx1ZSkpIHtcbiAgICAgICAgc3VtICs9IHRvTnVtYmVyKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN1bTtcbn1cblxuZnVuY3Rpb24gc29ydFZhbHVlVGFyZ2V0SW5kZXhlcyhcbiAgc29ydDogTG1yUGl2b3RTb3J0LFxuICBvdGhlclNpZGVIZWFkZXJzOiBMbXJQaXZvdERhdGFIZWFkZXJbXSxcbiAgdmFsdWVUaXRsZXM6IHN0cmluZ1tdXG4pOiBudW1iZXJbXSB8IG51bGwge1xuICBpZiAoc29ydCAmJiBzb3J0Lmxpc3QpIHtcbiAgICBsZXQgdmFsdWVJbmRleCA9IHZhbHVlVGl0bGVzLmZpbmRJbmRleCh0aXRsZSA9PiB0aXRsZSA9PT0gc29ydC5saXN0LnZhbHVlVGl0bGUpO1xuICAgIGlmICh2YWx1ZUluZGV4ID09PSAtMSkge1xuICAgICAgaWYgKHZhbHVlVGl0bGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICB2YWx1ZUluZGV4ID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBwaXZvdEhlYWRlcjogTG1yUGl2b3REYXRhSGVhZGVyID0gbnVsbDtcbiAgICBsZXQgY3VycmVudE90aGVyU2lkZUhlYWRlcnMgPSBvdGhlclNpZGVIZWFkZXJzO1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygc29ydC5saXN0LnZhbHVlcyB8fCBbXSkge1xuICAgICAgaWYgKHZhbHVlLmlzU3VtbWFyeSkge1xuICAgICAgICBjb25zdCBpbmRleGVzID0gZ2V0VGFyZ2V0SW5kZXhlc0ZvckhlYWRlcnMoY3VycmVudE90aGVyU2lkZUhlYWRlcnMgfHwgW10pIHx8IFtdO1xuICAgICAgICByZXR1cm4gZmlsdGVySW5kZXhlc0J5TW9kKGluZGV4ZXMsIHZhbHVlVGl0bGVzLmxlbmd0aCwgdmFsdWVJbmRleCk7XG4gICAgICB9XG5cbiAgICAgIHBpdm90SGVhZGVyID0gKGN1cnJlbnRPdGhlclNpZGVIZWFkZXJzIHx8IFtdKS5maW5kKGhlYWRlciA9PiBoZWFkZXIudGl0bGUgPT09IHZhbHVlLnRpdGxlKTtcbiAgICAgIGlmICghcGl2b3RIZWFkZXIpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnRPdGhlclNpZGVIZWFkZXJzID0gcGl2b3RIZWFkZXIuY2hpbGRyZW4gfHwgW107XG4gICAgfVxuXG4gICAgaWYgKHBpdm90SGVhZGVyKSB7XG4gICAgICBjb25zdCB0YXJnZXRJbmRleGVzID0gaXNOb3ROdWxsT3JVbmRlZmluZWQocGl2b3RIZWFkZXIudGFyZ2V0SW5kZXgpXG4gICAgICAgID8gW3Bpdm90SGVhZGVyLnRhcmdldEluZGV4XVxuICAgICAgICA6IGdldFRhcmdldEluZGV4ZXNGb3JIZWFkZXJzKGN1cnJlbnRPdGhlclNpZGVIZWFkZXJzKTtcbiAgICAgIHJldHVybiBmaWx0ZXJJbmRleGVzQnlNb2QodGFyZ2V0SW5kZXhlcywgdmFsdWVUaXRsZXMubGVuZ3RoLCB2YWx1ZUluZGV4KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZmlsdGVySW5kZXhlc0J5TW9kKGluZGV4ZXM6IG51bWJlcltdLCBtb2Q6IG51bWJlciwgdmFsdWU6IG51bWJlcik6IG51bWJlcltdIHtcbiAgcmV0dXJuIChpbmRleGVzIHx8IFtdKS5maWx0ZXIoaW5kZXggPT4gaW5kZXggJSBtb2QgPT09IHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gZGl2aWRlVmFsdWVzKHZhbHVlOiBhbnksIGRpdmlkZXI6IGFueSk6IG51bWJlciB7XG4gIGlmIChpc051bGxPclVuZGVmaW5lZCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChpc051bWVyaWModmFsdWUpICYmIGlzTnVtZXJpYyhkaXZpZGVyKSkge1xuICAgIGlmIChkaXZpZGVyICE9PSAwKSB7XG4gICAgICByZXR1cm4gdmFsdWUgLyBkaXZpZGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiJdfQ==
|
|
975
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGl2b3QtdGFibGUtY29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbG1yLXBpdm90LXRhYmxlL3NyYy9saWIvdXRpbC9waXZvdC10YWJsZS1jb252ZXJ0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsT0FBTyxFQUFDLG1CQUFtQixFQUE4QixtQkFBbUIsRUFBZ0Isa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsb0JBQW9CLEVBQUUsaUJBQWlCLEdBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4TSxPQUFPLEVBQUMsY0FBYyxFQUFFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxZQUFZLEdBQUUsTUFBTSxlQUFlLENBQUM7QUFJL0ksT0FBTyxFQUE4RixpQkFBaUIsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQ2xKLE9BQU8sRUFBQyxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFlaEgsTUFBTSxPQUFPLG1CQUFtQjtJQUN2QixNQUFNLENBQVUsVUFBVSxHQUFHLGtCQUFrQixDQUFDO0lBQ2hELE1BQU0sQ0FBVSxTQUFTLEdBQUcsaUJBQWlCLENBQUM7SUFDOUMsTUFBTSxDQUFVLGNBQWMsR0FBRyx1QkFBdUIsQ0FBQztJQUN6RCxNQUFNLENBQVUsY0FBYyxHQUFHLHVCQUF1QixDQUFDO0lBQ3pELE1BQU0sQ0FBVSxtQkFBbUIsR0FBRyw2QkFBNkIsQ0FBQztJQUNwRSxNQUFNLENBQVUsdUJBQXVCLEdBQUcsaUNBQWlDLENBQUM7SUFDNUUsTUFBTSxDQUFVLGlCQUFpQixHQUFHLDBCQUEwQixDQUFDO0lBQy9ELE1BQU0sQ0FBVSxzQkFBc0IsR0FBRyxnQ0FBZ0MsQ0FBQztJQUVoRSxXQUFX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QyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxHQUFHLEdBQUcsS0FBSyxLQUFLLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsS0FBVSxFQUFFLE9BQVk7SUFDNUMsSUFBSSxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUM1QixPQUFPLElBQUksQ0FBQztLQUNiO0lBRUQsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQzFDLElBQUksT0FBTyxLQUFLLENBQUMsRUFBRTtZQUNqQixPQUFPLEtBQUssR0FBRyxPQUFPLENBQUM7U0FDeEI7YUFBTTtZQUNMLE9BQU8sQ0FBQyxDQUFDO1NBQ1Y7S0FDRjtJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBMdW1lZXI6IE1vZGVybiBEYXRhIERlZmluaXRpb24gYW5kIFByb2Nlc3NpbmcgUGxhdGZvcm1cbiAqXG4gKiBDb3B5cmlnaHQgKEMpIHNpbmNlIDIwMTcgTHVtZWVyLmlvLCBzLnIuby4gYW5kL29yIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uXG4gKi9cbmltcG9ydCB7YWdncmVnYXRlRGF0YVZhbHVlcywgQ29uc3RyYWludCwgQ29uc3RyYWludERhdGEsIERhdGFBZ2dyZWdhdGlvblR5cGUsIERhdGFSZXNvdXJjZSwgaXNWYWx1ZUFnZ3JlZ2F0aW9uLCBOdW1iZXJDb25zdHJhaW50LCBQZXJjZW50YWdlQ29uc3RyYWludCwgVW5rbm93bkNvbnN0cmFpbnQsfSBmcm9tICdAbHVtZWVyL2RhdGEtZmlsdGVycyc7XG5pbXBvcnQge2RlZXBPYmplY3RDb3B5LCBpc0FycmF5LCBpc05vdE51bGxPclVuZGVmaW5lZCwgaXNOdWxsT3JVbmRlZmluZWQsIGlzTnVtZXJpYywgc2hhZGVDb2xvciwgdG9OdW1iZXIsIHVuaXF1ZVZhbHVlcyx9IGZyb20gJ0BsdW1lZXIvdXRpbHMnO1xuXG5pbXBvcnQge0xtclBpdm90RGF0YSwgTG1yUGl2b3REYXRhSGVhZGVyLCBMbXJQaXZvdERhdGFIZWFkZXJFeHByZXNzaW9uLCBMbXJQaXZvdERhdGFIZWFkZXJPcGVyYW5kLCBMbXJQaXZvdERpbWVuc2lvbkNvbmZpZywgTG1yUGl2b3RTdGVtRGF0YX0gZnJvbSAnLi9sbXItcGl2b3QtZGF0YSc7XG5pbXBvcnQge0xtclBpdm90VGFibGUsIExtclBpdm90VGFibGVDZWxsfSBmcm9tICcuL2xtci1waXZvdC10YWJsZSc7XG5pbXBvcnQge0xtclBpdm90RXhwcmVzc2lvbiwgTG1yUGl2b3RIZWFkZXJPcGVyYW5kLCBMbXJQaXZvdE9wZXJhbmQsIExtclBpdm90U29ydCwgTG1yUGl2b3RUcmFuc2Zvcm0sIExtclBpdm90VmFsdWVUeXBlfSBmcm9tICcuL2xtci1waXZvdC1jb25maWcnO1xuaW1wb3J0IHtDT0xPUl9HUkFZMTAwLCBDT0xPUl9HUkFZMjAwLCBDT0xPUl9HUkFZMzAwLCBDT0xPUl9HUkFZNDAwLCBDT0xPUl9HUkFZNTAwfSBmcm9tICcuL2xtci1waXZvdC1jb25zdGFudHMnO1xuXG5pbnRlcmZhY2UgSGVhZGVyR3JvdXBJbmZvIHtcbiAgYmFja2dyb3VuZDogc3RyaW5nO1xuICBpbmRleGVzOiBudW1iZXJbXTtcbiAgbGV2ZWw6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFZhbHVlVHlwZUluZm8ge1xuICBzdW0/OiBudW1iZXI7XG4gIHN1bXNSb3dzPzogbnVtYmVyW107XG4gIHN1bXNDb2x1bW5zPzogbnVtYmVyW107XG4gIGRlZmF1bHRDb25zdHJhaW50PzogQ29uc3RyYWludDtcbn1cblxuZXhwb3J0IGNsYXNzIFBpdm90VGFibGVDb252ZXJ0ZXIge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGVtcHR5Q2xhc3MgPSAncGl2b3QtZW1wdHktY2VsbCc7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZGF0YUNsYXNzID0gJ3Bpdm90LWRhdGEtY2VsbCc7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZ3JvdXBEYXRhQ2xhc3MgPSAncGl2b3QtZGF0YS1ncm91cC1jZWxsJztcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSByb3dIZWFkZXJDbGFzcyA9ICdwaXZvdC1yb3ctaGVhZGVyLWNlbGwnO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHJvd0dyb3VwSGVhZGVyQ2xhc3MgPSAncGl2b3Qtcm93LWdyb3VwLWhlYWRlci1jZWxsJztcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSByb3dBdHRyaWJ1dGVIZWFkZXJDbGFzcyA9ICdwaXZvdC1yb3ctYXR0cmlidXRlLWhlYWRlci1jZWxsJztcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBjb2x1bW5IZWFkZXJDbGFzcyA9ICdwaXZvdC1jb2x1bW4taGVhZGVyLWNlbGwnO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGNvbHVtbkdyb3VwSGVhZGVyQ2xhc3MgPSAncGl2b3QtY29sdW1uLWdyb3VwLWhlYWRlci1jZWxsJztcblxuICBwcml2YXRlIHJlYWRvbmx5IGdyb3VwQ29sb3JzID0gW0NPTE9SX0dSQVkxMDAsIENPTE9SX0dSQVkyMDAsIENPTE9SX0dSQVkzMDAsIENPTE9SX0dSQVk0MDAsIENPTE9SX0dSQVk1MDBdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcGVyY2VudGFnZUNvbnN0cmFpbnQgPSBuZXcgUGVyY2VudGFnZUNvbnN0cmFpbnQoe2RlY2ltYWxzOiAyfSk7XG5cbiAgcHJpdmF0ZSBkYXRhOiBMbXJQaXZvdFN0ZW1EYXRhO1xuICBwcml2YXRlIHRyYW5zZm9ybTogTG1yUGl2b3RUcmFuc2Zvcm07XG4gIHByaXZhdGUgdmFsdWVzOiBhbnlbXVtdO1xuICBwcml2YXRlIGRhdGFSZXNvdXJjZXM6IERhdGFSZXNvdXJjZVtdW11bXTtcbiAgcHJpdmF0ZSBjb25zdHJhaW50RGF0YTogQ29uc3RyYWludERhdGE7XG4gIHByaXZhdGUgcm93TGV2ZWxzOiBudW1iZXI7XG4gIHByaXZhdGUgcm93c1RyYW5zZm9ybWF0aW9uQXJyYXk6IG51bWJlcltdO1xuICBwcml2YXRlIGNvbHVtbkxldmVsczogbnVtYmVyO1xuICBwcml2YXRlIGNvbHVtbnNUcmFuc2Zvcm1hdGlvbkFycmF5OiBudW1iZXJbXTtcbiAgcHJpdmF0ZSB2YWx1ZVR5cGVJbmZvOiBWYWx1ZVR5cGVJbmZvW107XG4gIHByaXZhdGUgbm9uU3RpY2t5Um93SW5kZXg6IG51bWJlcjtcbiAgcHJpdmF0ZSBub25TdGlja3lDb2x1bW5JbmRleDogbnVtYmVyO1xuXG4gIHB1YmxpYyBjcmVhdGVUYWJsZXMocGl2b3REYXRhOiBMbXJQaXZvdERhdGEsIHRyYW5zZm9ybTogTG1yUGl2b3RUcmFuc2Zvcm0pOiBMbXJQaXZvdFRhYmxlW10ge1xuICAgIGlmICghcGl2b3REYXRhKSB7XG4gICAgICByZXR1cm4gW3tjZWxsczogW119XTtcbiAgICB9XG5cbiAgICB0aGlzLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTtcbiAgICB0aGlzLmNvbnN0cmFpbnREYXRhID0gcGl2b3REYXRhLmNvbnN0cmFpbnREYXRhO1xuXG4gICAgcmV0dXJuIChwaXZvdERhdGEuZGF0YSB8fCBbXSkubWFwKGQgPT4ge1xuICAgICAgaWYgKHRoaXMuZGF0YUFyZUVtcHR5KGQpKSB7XG4gICAgICAgIHJldHVybiB7Y2VsbHM6IFtdfTtcbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlRGF0YShkKTtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybURhdGEoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZGF0YUFyZUVtcHR5KGRhdGE6IExtclBpdm90U3RlbURhdGEpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKGRhdGEucm93SGVhZGVycyB8fCBbXSkubGVuZ3RoID09PSAwICYmIChkYXRhLmNvbHVtbkhlYWRlcnMgfHwgW10pLmxlbmd0aCA9PT0gMDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRGF0YShkYXRhOiBMbXJQaXZvdFN0ZW1EYXRhKSB7XG4gICAgY29uc3QgbnVtYmVyT2ZTdW1zID0gTWF0aC5tYXgoMSwgKGRhdGEudmFsdWVUaXRsZXMgfHwgW10pLmxlbmd0aCk7XG4gICAgdGhpcy52YWx1ZVR5cGVJbmZvID0gZ2V0VmFsdWVzVHlwZUluZm8oZGF0YS52YWx1ZXMsIGRhdGEudmFsdWVUeXBlcywgbnVtYmVyT2ZTdW1zKTtcbiAgICB0aGlzLmRhdGEgPSBwcmVwYXJlUGl2b3REYXRhKGRhdGEsIHRoaXMuY29uc3RyYWludERhdGEsIHRoaXMudmFsdWVUeXBlSW5mbyk7XG4gICAgdGhpcy52YWx1ZXMgPSBkYXRhLnZhbHVlcyB8fCBbXTtcbiAgICB0aGlzLmRhdGFSZXNvdXJjZXMgPSBkYXRhLmRhdGFSZXNvdXJjZXMgfHwgW107XG4gICAgdGhpcy5yb3dMZXZlbHMgPSAoZGF0YS5yb3dzQ29uZmlnIHx8IFtdKS5sZW5ndGg7XG4gICAgdGhpcy5jb2x1bW5MZXZlbHMgPSAoZGF0YS5jb2x1bW5zQ29uZmlnIHx8IFtdKS5sZW5ndGggKyAoZGF0YS5oYXNBZGRpdGlvbmFsQ29sdW1uTGV2ZWwgPyAxIDogMCk7XG4gICAgY29uc3Qgcm93QWxsU3RpY2t5ID0gdGhpcy5kYXRhLnJvd3NDb25maWc/Lmxlbmd0aCAmJiB0aGlzLmRhdGEucm93c0NvbmZpZy5ldmVyeShjb25maWcgPT4gISFjb25maWc/LnN0aWNreSlcbiAgICB0aGlzLm5vblN0aWNreVJvd0luZGV4ID0gTWF0aC5tYXgocm93QWxsU3RpY2t5ID8gdGhpcy5yb3dMZXZlbHMgOiAodGhpcy5kYXRhLnJvd3NDb25maWc/LmZpbmRJbmRleChjb25maWcgPT4gIWNvbmZpZz8uc3RpY2t5KSB8fCAwKSwgMCk7XG4gICAgY29uc3QgY29sdW1uQWxsU3RpY2t5ID0gdGhpcy5kYXRhLmNvbHVtbnNDb25maWc/Lmxlbmd0aCAmJiB0aGlzLmRhdGEuY29sdW1uc0NvbmZpZy5ldmVyeShjb25maWcgPT4gISFjb25maWc/LnN0aWNreSlcbiAgICB0aGlzLm5vblN0aWNreUNvbHVtbkluZGV4ID0gTWF0aC5tYXgoY29sdW1uQWxsU3RpY2t5ID8gdGhpcy5jb2x1bW5MZXZlbHMgOiAodGhpcy5kYXRhLmNvbHVtbnNDb25maWc/LmZpbmRJbmRleChjb25maWcgPT4gIWNvbmZpZz8uc3RpY2t5KSB8fCAwKSwgMCk7XG4gICAgY29uc3QgaGFzVmFsdWUgPSAoZGF0YS52YWx1ZVRpdGxlcyB8fCBbXSkubGVuZ3RoID4gMDtcbiAgICBpZiAoKHRoaXMuZGF0YS5yb3dIZWFkZXJzIHx8IFtdKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnJvd3NUcmFuc2Zvcm1hdGlvbkFycmF5ID0gY3JlYXRlVHJhbnNmb3JtYXRpb25NYXAoXG4gICAgICAgIHRoaXMuZGF0YS5yb3dIZWFkZXJzLFxuICAgICAgICB0aGlzLnJvd1Nob3dTdW1zLFxuICAgICAgICB0aGlzLmNvbHVtbkxldmVscyxcbiAgICAgICAgMVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yb3dzVHJhbnNmb3JtYXRpb25BcnJheSA9IGhhc1ZhbHVlID8gW3RoaXMuY29sdW1uTGV2ZWxzXSA6IFtdO1xuICAgIH1cblxuICAgIGlmICgodGhpcy5kYXRhLmNvbHVtbkhlYWRlcnMgfHwgW10pLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuY29sdW1uc1RyYW5zZm9ybWF0aW9uQXJyYXkgPSBjcmVhdGVUcmFuc2Zvcm1hdGlvbk1hcChcbiAgICAgICAgdGhpcy5kYXRhLmNvbHVtbkhlYWRlcnMsXG4gICAgICAgIHRoaXMuY29sdW1uU2hvd1N1bXMsXG4gICAgICAgIHRoaXMucm93TGV2ZWxzLFxuICAgICAgICBudW1iZXJPZlN1bXNcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29sdW1uc1RyYW5zZm9ybWF0aW9uQXJyYXkgPSBoYXNWYWx1ZSA/IFt0aGlzLnJvd0xldmVsc10gOiBbXTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldCByb3dTaG93U3VtcygpOiBib29sZWFuW10ge1xuICAgIHJldHVybiAodGhpcy5kYXRhLnJvd3NDb25maWcgfHwgW10pLm1hcChjb25maWcgPT4gY29uZmlnLnNob3dTdW1zKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGNvbHVtblNob3dTdW1zKCk6IGJvb2xlYW5bXSB7XG4gICAgcmV0dXJuICh0aGlzLmRhdGEuY29sdW1uc0NvbmZpZyB8fCBbXSkubWFwKGNvbmZpZyA9PiBjb25maWcuc2hvd1N1bXMpO1xuICB9XG5cbiAgcHJpdmF0ZSB0cmFuc2Zvcm1EYXRhKCk6IExtclBpdm90VGFibGUge1xuICAgIGNvbnN0IGNlbGxzID0gdGhpcy5pbml0Q2VsbHMoKTtcbiAgICBjb25zdCByb3dHcm91cHMgPSB0aGlzLmZpbGxDZWxsc0J5Um93cyhjZWxscyk7XG4gICAgY29uc3QgY29sdW1uR3JvdXBzID0gdGhpcy5maWxsQ2VsbHNCeUNvbHVtbnMoY2VsbHMpO1xuICAgIHRoaXMuZmlsbENlbGxzQnlHcm91cEludGVyc2VjdGlvbihjZWxscywgcm93R3JvdXBzLCBjb2x1bW5Hcm91cHMpO1xuICAgIHJldHVybiB7Y2VsbHN9O1xuICB9XG5cbiAgcHJpdmF0ZSBmaWxsQ2VsbHNCeVJvd3MoY2VsbHM6IExtclBpdm90VGFibGVDZWxsW11bXSk6IEhlYWRlckdyb3VwSW5mb1tdIHtcbiAgICBjb25zdCByb3dHcm91cHMgPSBbXTtcbiAgICB0aGlzLml0ZXJhdGVBbmRGaWxsQ2VsbHNCeVJvd3MoY2VsbHMsIHJvd0dyb3VwcywgdGhpcy5kYXRhLnJvd0hlYWRlcnMsIHRoaXMuY29sdW1uTGV2ZWxzLCB0aGlzLnJvd1Nob3dTdW1zLCAwKTtcbiAgICByZXR1cm4gcm93R3JvdXBzO1xuICB9XG5cbiAgcHJpdmF0ZSBpdGVyYXRlQW5kRmlsbENlbGxzQnlSb3dzKFxuICAgIGNlbGxzOiBMbXJQaXZvdFRhYmxlQ2VsbFtdW10sXG4gICAgcm93R3JvdXBzSW5mbzogSGVhZGVyR3JvdXBJbmZvW10sXG4gICAgaGVhZGVyczogTG1yUGl2b3REYXRhSGVhZGVyW10sXG4gICAgc3RhcnRJbmRleDogbnVtYmVyLFxuICAgIHNob3dTdW1zOiBib29sZWFuW10sXG4gICAgbGV2ZWw6IG51bWJlcixcbiAgICBwYXJlbnRIZWFkZXI/OiBMbXJQaXZvdERhdGFIZWFkZXJcbiAgKSB7XG4gICAgbGV0IGN1cnJlbnRJbmRleCA9IHN0YXJ0SW5kZXg7XG4gICAgZm9yIChjb25zdCBoZWFkZXIgb2YgaGVhZGVycykge1xuICAgICAgY29uc3Qgcm93U3BhbiA9IGdldERpcmVjdEhlYWRlckNoaWxkQ291bnQoaGVhZGVyLCBsZXZlbCwgc2hvd1N1bXMpO1xuICAgICAgY2VsbHNbY3VycmVudEluZGV4XVtsZXZlbF0gPSB7XG4gICAgICAgIHZhbHVlOiB0aGlzLmZvcm1hdFJvd0hlYWRlcihoZWFkZXIudGl0bGUsIGxldmVsKSxcbiAgICAgICAgY3NzQ2xhc3M6IFBpdm90VGFibGVDb252ZXJ0ZXIucm93SGVhZGVyQ2xhc3MsXG4gICAgICAgIGlzSGVhZGVyOiB0cnVlLFxuICAgICAgICBzdGlja3lTdGFydDogdGhpcy5pc1Jvd0xldmVsU3RpY2t5KGxldmVsKSxcbiAgICAgICAgcm93U3BhbixcbiAgICAgICAgY29sU3BhbjogMSxcbiAgICAgICAgYmFja2dyb3VuZDogdGhpcy5nZXRIZWFkZXJCYWNrZ3JvdW5kKGhlYWRlciwgbGV2ZWwpLFxuICAgICAgICBjb25zdHJhaW50OiBoZWFkZXIuY29uc3RyYWludCxcbiAgICAgICAgbGFiZWw6IGhlYWRlci5hdHRyaWJ1dGVOYW1lLFxuICAgICAgfTtcblxuICAgICAgaWYgKGhlYWRlci5jaGlsZHJlbikge1xuICAgICAgICB0aGlzLml0ZXJhdGVBbmRGaWxsQ2VsbHNCeVJvd3MoXG4gICAgICAgICAgY2VsbHMsXG4gICAgICAgICAgcm93R3JvdXBzSW5mbyxcbiAgICAgICAgICBoZWFkZXIuY2hpbGRyZW4sXG4gICAgICAgICAgY3VycmVudEluZGV4LFxuICAgICAgICAgIHNob3dTdW1zLFxuICAgICAgICAgIGxldmVsICsgMSxcbiAgICAgICAgICBoZWFkZXJcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNOb3ROdWxsT3JVbmRlZmluZWQoaGVhZGVyLnRhcmdldEluZGV4KSkge1xuICAgICAgICB0aGlzLmZpbGxDZWxsc0ZvclJvdyhjZWxscywgaGVhZGVyLnRhcmdldEluZGV4KTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudEluZGV4ICs9IGdldEhlYWRlckNoaWxkQ291bnQoaGVhZGVyLCBsZXZlbCwgc2hvd1N1bXMpO1xuXG4gICAgICBjb25zdCBleHByZXNzaW9ucyA9IGhlYWRlci5leHByZXNzaW9ucyB8fCBbXVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHByZXNzaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBleHByZXNzaW9uSW5kZXggPSBjdXJyZW50SW5kZXggLSAoZXhwcmVzc2lvbnMubGVuZ3RoIC0gaSlcbiAgICAgICAgY29uc3QgYmFja2dyb3VuZCA9IHRoaXMuZ2V0U3VtbWFyeUJhY2tncm91bmQobGV2ZWwpO1xuICAgICAgICB0aGlzLnNwbGl0Um93R3JvdXBIZWFkZXIoY2VsbHMsIGxldmVsLCBleHByZXNzaW9uSW5kZXgsIGJhY2tncm91bmQsIGV4cHJlc3Npb25zW2ldLnRpdGxlKVxuICAgICAgICB0aGlzLmZpbGxDZWxsc0ZvckV4cHJlc3Npb25Sb3coY2VsbHMsIGV4cHJlc3Npb25zW2ldLCBleHByZXNzaW9uSW5kZXgsIGJhY2tncm91bmQpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3dTdW1zW2xldmVsXSkge1xuICAgICAgY29uc3QgeyB0aXRsZSwgc3VtbWFyeSB9ID0gdGhpcy5mb3JtYXRTdW1tYXJ5SGVhZGVyKHBhcmVudEhlYWRlciwgbGV2ZWwpXG4gICAgICBjb25zdCBiYWNrZ3JvdW5kID0gdGhpcy5nZXRTdW1tYXJ5QmFja2dyb3VuZChsZXZlbCk7XG4gICAgICBjb25zdCBjb2x1bW5JbmRleCA9IE1hdGgubWF4KGxldmVsIC0gMSwgMCk7XG4gICAgICB0aGlzLnNwbGl0Um93R3JvdXBIZWFkZXIoY2VsbHMsIGNvbHVtbkluZGV4LCBjdXJyZW50SW5kZXgsIGJhY2tncm91bmQsIHN1bW1hcnksIHRpdGxlLCBwYXJlbnRIZWFkZXI/LmNvbnN0cmFpbnQsIHBhcmVudEhlYWRlcj8uYXR0cmlidXRlTmFtZSlcblxuICAgICAgY29uc3Qgcm93SW5kZXhlcyA9IGdldFRhcmdldEluZGV4ZXNGb3JIZWFkZXJzKGhlYWRlcnMpO1xuICAgICAgY29uc3QgdHJhbnNmb3JtZWRSb3dJbmRleGVzID0gcm93SW5kZXhlc1xuICAgICAgICAubWFwKHYgPT4gdGhpcy5yb3dzVHJhbnNmb3JtYXRpb25BcnJheVt2XSlcbiAgICAgICAgLmZpbHRlcih2ID0+IGlzTm90TnVsbE9yVW5kZWZpbmVkKHYpKTtcblxuICAgICAgcm93R3JvdXBzSW5mb1tjdXJyZW50SW5kZXhdID0ge2JhY2tncm91bmQsIGluZGV4ZXM6IHRyYW5zZm9ybWVkUm93SW5kZXhlcywgbGV2ZWx9O1xuXG4gICAgICB0aGlzLmZpbGxDZWxsc0Zvckdyb3VwZWRSb3coY2VsbHMsIHJvd0luZGV4ZXMsIGN1cnJlbnRJbmRleCwgYmFja2dyb3VuZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzcGxpdFJvd0dyb3VwSGVhZGVyKGNlbGxzOiBMbXJQaXZvdFRhYmxlQ2VsbFtdW10sIGNvbHVtbkluZGV4OiBudW1iZXIsIGN1cnJlbnRJbmRleDogbnVtYmVyLCBiYWNrZ3JvdW5kOiBzdHJpbmcsIHN1bW1hcnk6IHN0cmluZywgdGl0bGU/OiBzdHJpbmcsIGNvbnN0cmFpbnQ/OiBDb25zdHJhaW50LCBsYWJlbD86IHN0cmluZykge1xuICAgIGxldCBjb2xTcGFuID0gdGhpcy5yb3dMZXZlbHMgLSBjb2x1bW5JbmRleDtcbiAgICBjb25zdCBzdGlja3lTdGFydCA9IHRoaXMuaXNSb3dMZXZlbFN0aWNreShjb2x1bW5JbmRleCk7XG5cbiAgICAvLyBzcGxpdCByb3cgZ3JvdXAgaGVhZGVyIGNlbGwgYmVjYXVzZSBvZiBjb3JyZWN0IHN0aWNreSBzY3JvbGxcbiAgICBpZiAoc3RpY2t5U3RhcnQgJiYgdGhpcy5ub25TdGlja3lSb3dJbmRleCA+IDAgJiYgdGhpcy5ub25TdGlja3lSb3dJbmRleCA8IHRoaXMucm93TGV2ZWxzICYmIGNvbFNwYW4gPiAxKSB7XG4gICAgICBjb25zdCBuZXdDb2xzcGFuID0gdGhpcy5ub25TdGlja3lSb3dJbmRleCAtIGNvbHVtbkluZGV4O1xuXG4gICAgICBjZWxsc1tjdXJyZW50SW5kZXhdW3RoaXMubm9uU3RpY2t5Um93SW5kZXhdID0ge1xuICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICBjb25zdHJhaW50OiB1bmRlZmluZWQsXG4gICAgICAgIGxhYmVsOiB1bmRlZmluZWQsXG4gICAgICAgIGNzc0NsYXNzOiBQaXZvdFRhYmxlQ29udmVydGVyLnJvd0dyb3VwSGVhZGVyQ2xhc3MsXG4gICAgICAgIGlzSGVhZGVyOiB0cnVlLFxuICAgICAgICByb3dTcGFuOiAxLFxuICAgICAgICBjb2xTcGFuOiBjb2xTcGFuIC0gbmV3Q29sc3BhbixcbiAgICAgICAgYmFja2dyb3VuZCxcbiAgICAgICAgc3VtbWFyeTogdW5kZWZpbmVkLFxuICAgICAgfTtcblxuICAgICAgY29sU3BhbiA9IG5ld0NvbHNwYW47XG4gICAgfVxuXG4gICAgY2VsbHNbY3VycmVudEluZGV4XVtjb2x1bW5JbmRleF0gPSB7XG4gICAgICB2YWx1ZTogdGl0bGUsXG4gICAgICBjb25zdHJhaW50LFxuICAgICAgbGFiZWwsXG4gICAgICBjc3NDbGFzczogUGl2b3RUYWJsZUNvbnZlcnRlci5yb3dHcm91cEhlYWRlckNsYXNzLFxuICAgICAgaXNIZWFkZXI6IHRydWUsXG4gICAgICBzdGlja3lTdGFydCxcbiAgICAgIHJvd1NwYW46IDEsXG4gICAgICBjb2xTcGFuLFxuICAgICAgYmFja2dyb3VuZCxcbiAgICAgIHN1bW1hcnksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0U3VtbWFyeUhlYWRlcihoZWFkZXI6IExtclBpdm90RGF0YUhlYWRlciwgbGV2ZWw6IG51bWJlcik6IHt0aXRsZT86IHN0cmluZzsgc3VtbWFyeTogc3RyaW5nfSB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtLmZvcm1hdFN1bW1hcnlIZWFkZXI/LihoZWFkZXIsIGxldmVsKSB8fCB7XG4gICAgICB0aXRsZTogaGVhZGVyPy50aXRsZSxcbiAgICAgIHN1bW1hcnk6ICcnLFxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0Um93SGVhZGVyKHRpdGxlOiBzdHJpbmcsIGxldmVsOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybT8uZm9ybWF0Um93SGVhZGVyPy4odGl0bGUsIGxldmVsKSB8fCB0aXRsZVxuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRDb2x1bW5IZWFkZXIodGl0bGU6IHN0cmluZywgbGV2ZWw6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtPy5mb3JtYXRDb2x1bW5IZWFkZXI/Lih0aXRsZSwgbGV2ZWwpIHx8IHRpdGxlXG4gIH1cblxuICBwcml2YXRlIGdldEhlYWRlckJhY2tncm91bmQoaGVhZGVyOiB7IGNvbG9yOiBzdHJpbmcgfSwgbGV2ZWw6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKGhlYWRlcj8uY29sb3IpIHtcbiAgICAgIHJldHVybiBzaGFkZUNvbG9yKGhlYWRlci5jb2xvciwgdGhpcy5nZXRMZXZlbE9wYWNpdHkobGV2ZWwpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMZXZlbE9wYWNpdHkobGV2ZWw6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgubWluKDgwLCA1MCArIGxldmVsICogNSkgLyAxMDA7XG4gIH1cblxuICBwcml2YXRlIGlzUm93TGV2ZWxTdGlja3kobGV2ZWw6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRhdGE/LnJvd3NDb25maWc/LltsZXZlbF0/LnN0aWNreTtcbiAgfVxuXG4gIHByaXZhdGUgaXNDb2x1bW5MZXZlbFN0aWNreShsZXZlbDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbWF4TGV2ZWwgPSBNYXRoLm1pbihsZXZlbCwgKHRoaXMuZGF0YT8uY29sdW1uc0NvbmZpZz8ubGVuZ3RoID8/IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSAtIDEpO1xuICAgIHJldHVybiB0aGlzLmRhdGE/LmNvbHVtbnNDb25maWc/LlttYXhMZXZlbF0/LnN0aWNreTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3VtbWFyeUJhY2tncm91bmQobGV2ZWw6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgaW5kZXggPSBNYXRoLm1pbihsZXZlbCwgdGhpcy5ncm91cENvbG9ycy5sZW5ndGggLSAxKTtcbiAgICByZXR1cm4gdGhpcy5ncm91cENvbG9yc1tpbmRleF07XG4gIH1cblxuICBwcml2YXRlIGZpbGxDZWxsc0ZvclJvdyhjZWxsczogTG1yUGl2b3RUYWJsZUNlbGxbXVtdLCByb3c6IG51bWJlcikge1xuICAgIGNvbnN0IHJvd0luZGV4SW5DZWxscyA9IHRoaXMucm93c1RyYW5zZm9ybWF0aW9uQXJyYXlbcm93XTtcbiAgICBpZiAoaXNOb3ROdWxsT3JVbmRlZmluZWQocm93SW5kZXhJbkNlbGxzKSkge1xuICAgICAgZm9yIChsZXQgY29sdW1uID0gMDsgY29sdW1uIDwgdGhpcy5jb2x1bW5zVHJhbnNmb3JtYXRpb25BcnJheS5sZW5ndGg7IGNvbHVtbisrKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbkluZGV4SW5DZWxscyA9IHRoaXMuY29sdW1uc1RyYW5zZm9ybWF0aW9uQXJyYXlbY29sdW1uXTtcbiAgICAgICAgaWYgKGlzTm90TnVsbE9yVW5kZWZpbmVkKGNvbHVtbkluZGV4SW5DZWxscykpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YS52YWx1ZXNbcm93XVtjb2x1bW5dO1xuICAgICAgICAgIGNvbnN0IGRhdGFSZXNvdXJjZXMgPSB0aGlzLmRhdGFSZXNvdXJjZXM/Lltyb3ddPy5bY29sdW1uXSB8fCBbXTtcbiAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IHRoaXMuYWdncmVnYXRlT3JGb3JtYXRTaW5nbGVWYWx1ZSh2YWx1ZSwgY29sdW1uKTtcbiAgICAgICAgICBjb25zdCBzdHJpbmdWYWx1ZSA9IGlzTm90TnVsbE9yVW5kZWZpbmVkKGZvcm1hdHRlZFZhbHVlKSA/IFN0cmluZyhmb3JtYXR0ZWRWYWx1ZSkgOiAnJztcbiAgICAgICAgICBjZWxsc1tyb3dJbmRleEluQ2VsbHNdW2NvbHVtbkluZGV4SW5DZWxsc10gPSB7XG4gICAgICAgICAgICB2YWx1ZTogc3RyaW5nVmFsdWUsXG4gICAgICAgICAgICBkYXRhUmVzb3VyY2VzLFxuICAgICAgICAgICAgcm93U3BhbjogMSxcbiAgICAgICAgICAgIGNvbFNwYW46IDEsXG4gICAgICAgICAgICBjc3NDbGFzczogUGl2b3RUYWJsZUNvbnZlcnRlci5kYXRhQ2xhc3MsXG4gICAgICAgICAgICBpc0hlYWRlcjogZmFsc2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0VmFsdWVJbmRleEZvckNvbHVtbnMoY29sdW1uczogbnVtYmVyW10pOiBudW1iZXIge1xuICAgIHJldHVybiBjb2x1bW5zWzBdICUgdGhpcy5kYXRhLnZhbHVlVGl0bGVzLmxlbmd0aDtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0VmFsdWVCeVZhbHVlVHlwZSh2YWx1ZTogYW55LCB2YWx1ZUluZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIGNvbnN0IHZhbHVlVHlwZSA9ICh0aGlzLmRhdGEudmFsdWVUeXBlcyB8fCBbXSlbdmFsdWVJbmRleF07XG4gICAgaWYgKCF2YWx1ZVR5cGUgfHwgdmFsdWVUeXBlID09PSBMbXJQaXZvdFZhbHVlVHlwZS5EZWZhdWx0KSB7XG4gICAgICByZXR1cm4gdGhpcy5mb3JtYXRWYWx1ZUJ5Q29uc3RyYWludCh2YWx1ZSwgdmFsdWVJbmRleCk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgW0xtclBpdm90VmFsdWVUeXBlLkFsbFBlcmNlbnRhZ2UsIExtclBpdm90VmFsdWVUeXBlLkNvbHVtblBlcmNlbnRhZ2UsIExtclBpdm90VmFsdWVUeXBlLlJvd1BlcmNlbnRhZ2VdLmluY2x1ZGVzKHZhbHVlVHlwZSlcbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1hdFZhbHVlQnlQZXJjZW50YWdlKHZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5mb3JtYXRWYWx1ZUJ5Q29uc3RyYWludCh2YWx1ZSwgdmFsdWVJbmRleCk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdEdyb3VwZWRWYWx1ZUJ5VmFsdWVUeXBlKHZhbHVlOiBhbnksIHJvd3M6IG51bWJlcltdLCBjb2x1bW5zOiBudW1iZXJbXSk6IGFueSB7XG4gICAgY29uc3QgdmFsdWVJbmRleCA9IGNvbHVtbnNbMF0gJSB0aGlzLmRhdGEudmFsdWVUaXRsZXMubGVuZ3RoO1xuICAgIGNvbnN0IHZhbHVlVHlwZSA9IHRoaXMuZGF0YS52YWx1ZVR5cGVzICYmIHRoaXMuZGF0YS52YWx1ZVR5cGVzW3ZhbHVlSW5kZXhdO1xuICAgIGNvbnN0IHZhbHVlVHlwZUluZm8gPSB0aGlzLnZhbHVlVHlwZUluZm9bdmFsdWVJbmRleF07XG4gICAgaWYgKCF2YWx1ZVR5cGVJbmZvIHx8ICF2YWx1ZVR5cGUgfHwgdmFsdWVUeXBlID09PSBMbXJQaXZvdFZhbHVlVHlwZS5EZWZhdWx0KSB7XG4gICAgICByZXR1cm4gdGhpcy5mb3JtYXRWYWx1ZUJ5Q29uc3RyYWludCh2YWx1ZSwgdmFsdWVJbmRleCk7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlVHlwZSA9PT0gTG1yUGl2b3RWYWx1ZVR5cGUuQWxsUGVyY2VudGFnZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0VmFsdWVCeVBlcmNlbnRhZ2UoZGl2aWRlVmFsdWVzKHZhbHVlLCB2YWx1ZVR5cGVJbmZvLnN1bSkpO1xuICAgIH0gZWxzZSBpZiAodmFsdWVUeXBlID09PSBMbXJQaXZvdFZhbHVlVHlwZS5Db2x1bW5QZXJjZW50YWdlKSB7XG4gICAgICBjb25zdCBjb2x1bW5zRGl2aWRlcnMgPSBjb2x1bW5zLnJlZHVjZSgoZGl2aWRlcnMsIGNvbHVtbikgPT4ge1xuICAgICAgICBkaXZpZGVycy5wdXNoKHZhbHVlVHlwZUluZm8uc3Vtc0NvbHVtbnNbY29sdW1uXSk7XG4gICAgICAgIHJldHVybiBkaXZpZGVycztcbiAgICAgIH0sIFtdKTtcbiAgICAgIGNvbnN0IGNvbHVtbnNEaXZpZGVyID0gYWdncmVnYXRlRGF0YVZhbHVlcyhEYXRhQWdncmVnYXRpb25UeXBlLlN1bSwgY29sdW1uc0RpdmlkZXJzKTtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1hdFZhbHVlQnlQZXJjZW50YWdlKGRpdmlkZVZhbHVlcyh2YWx1ZSwgY29sdW1uc0RpdmlkZXIpKTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PT0gTG1yUGl2b3RWYWx1ZVR5cGUuUm93UGVyY2VudGFnZSkge1xuICAgICAgY29uc3Qgcm93c0RpdmlkZXJzID0gcm93cy5yZWR1Y2UoKGRpdmlkZXJzLCByb3cpID0+IHtcbiAgICAgICAgZGl2aWRlcnMucHVzaCh2YWx1ZVR5cGVJbmZvLnN1bXNSb3dzW3Jvd10pO1xuICAgICAgICByZXR1cm4gZGl2aWRlcnM7XG4gICAgICB9LCBbXSk7XG4gICAgICBjb25zdCByb3dzRGl2aWRlciA9IGFnZ3JlZ2F0ZURhdGFWYWx1ZXMoRGF0YUFnZ3JlZ2F0aW9uVHlwZS5TdW0sIHJvd3NEaXZpZGVycyk7XG4gICAgICByZXR1cm4gdGhpcy5mb3JtYXRWYWx1ZUJ5UGVyY2VudGFnZShkaXZpZGVWYWx1ZXModmFsdWUsIHJvd3NEaXZpZGVyKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0VmFsdWVCeUNvbnN0cmFpbnQodmFsdWUsIHZhbHVlSW5kZXgpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRWYWx1ZUJ5UGVyY2VudGFnZSh2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wZXJjZW50YWdlQ29uc3RyYWludC5jcmVhdGVEYXRhVmFsdWUodmFsdWUpLmZvcm1hdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRWYWx1ZUJ5Q29uc3RyYWludCh2YWx1ZTogYW55LCB2YWx1ZUluZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIGNvbnN0IGNvbnN0cmFpbnQgPSB0aGlzLmRhdGEudmFsdWVzQ29uc3RyYWludHM/Llt2YWx1ZUluZGV4XSB8fCB0aGlzLnZhbHVlVHlwZUluZm9bdmFsdWVJbmRleF0/LmRlZmF1bHRDb25zdHJhaW50O1xuICAgIGlmIChjb25zdHJhaW50KSB7XG4gICAgICByZXR1cm4gY29uc3RyYWludC5jcmVhdGVEYXRhVmFsdWUodmFsdWUsIHRoaXMuY29uc3RyYWludERhdGEpLnByZXZpZXcoKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBmaWxsQ2VsbHNGb3JHcm91cGVkUm93KFxuICAgIGNlbGxzOiBMbXJQaXZvdFRhYmxlQ2VsbFtdW10sXG4gICAgcm93czogbnVtYmVyW10sXG4gICAgcm93SW5kZXhJbkNlbGxzOiBudW1iZXIsXG4gICAgYmFja2dyb3VuZDogc3RyaW5nXG4gICkge1xuICAgIGZvciAobGV0IGNvbHVtbiA9IDA7IGNvbHVtbiA8IHRoaXMuY29sdW1uc1RyYW5zZm9ybWF0aW9uQXJyYXkubGVuZ3RoOyBjb2x1bW4rKykge1xuICAgICAgY29uc3QgY29sdW1uSW5kZXhJbkNlbGxzID0gdGhpcy5jb2x1bW5zVHJhbnNmb3JtYXRpb25BcnJheVtjb2x1bW5dO1xuICAgICAgaWYgKGlzTm90TnVsbE9yVW5kZWZpbmVkKGNvbHVtbkluZGV4SW5DZWxscykpIHtcbiAgICAgICAgY29uc3Qge3ZhbHVlcywgZGF0YVJlc291cmNlc30gPSB0aGlzLmdldEdyb3VwZWRWYWx1ZXNGb3JSb3dzQW5kQ29scyhyb3dzLCBbY29sdW1uXSk7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5hZ2dyZWdhdGVBbmRGb3JtYXREYXRhVmFsdWVzKHZhbHVlcywgcm93cywgW2NvbHVtbl0pO1xuICAgICAgICBjZWxsc1tyb3dJbmRleEluQ2VsbHNdW2NvbHVtbkluZGV4SW5DZWxsc10gPSB7XG4gICAgICAgICAgdmFsdWU6IFN0cmluZyhmb3JtYXR0ZWRWYWx1ZSksXG4gICAgICAgICAgZGF0YVJlc291cmNlcyxcbiAgICAgICAgICBjb2xTcGFuOiAxLFxuICAgICAgICAgIHJvd1NwYW46IDEsXG4gICAgICAgICAgY3NzQ2xhc3M6IFBpdm90VGFibGVDb252ZXJ0ZXIuZ3JvdXBEYXRhQ2xhc3MsXG4gICAgICAgICAgaXNIZWFkZXI6IGZhbHNlLFxuICAgICAgICAgIGJhY2tncm91bmQsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmaWxsQ2VsbHNGb3JFeHByZXNzaW9uUm93KFxuICAgIGNlbGxzOiBMbXJQaXZvdFRhYmxlQ2VsbFtdW10sXG4gICAgZXhwcmVzc2lvbjogTG1yUGl2b3REYXRhSGVhZGVyRXhwcmVzc2lvbixcbiAgICByb3dJbmRleEluQ2VsbHM6IG51bWJlcixcbiAgICBiYWNrZ3JvdW5kOiBzdHJpbmdcbiAgKSB7XG4gICAgZm9yIChsZXQgY29sdW1uID0gMDsgY29sdW1uIDwgdGhpcy5jb2x1bW5zVHJhbnNmb3JtYXRpb25BcnJheS5sZW5ndGg7IGNvbHVtbisrKSB7XG4gICAgICBjb25zdCBjb2x1bW5JbmRleEluQ2VsbHMgPSB0aGlzLmNvbHVtbnNUcmFuc2Zvcm1hdGlvbkFycmF5W2NvbHVtbl07XG4gICAgICBpZiAoaXNOb3ROdWxsT3JVbmRlZmluZWQoY29sdW1uSW5kZXhJbkNlbGxzKSkge1xuICAgICAgICBjb25zdCB7dmFsdWUsIGRhdGFSZXNvdXJjZXN9ID0gdGhpcy5ldmFsdWF0ZUV4cHJlc3Npb24oZXhwcmVzc2lvbiwgY29sdW1uKTtcbiAgICAgICAgY29uc3QgdmFsdWVJbmRleCA9IGNvbHVtbiAlIHRoaXMuZGF0YS52YWx1ZVRpdGxlcy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5mb3JtYXRWYWx1ZUJ5Q29uc3RyYWludCh2YWx1ZSwgdmFsdWVJbmRleCk7XG4gICAgICAgIGNlbGxzW3Jvd0luZGV4SW5DZWxsc11bY29sdW1uSW5kZXhJbkNlbGxzXSA9IHtcbiAgICAgICAgICB2YWx1ZTogU3RyaW5nKGZvcm1hdHRlZFZhbHVlKSxcbiAgICAgICAgICBkYXRhUmVzb3VyY2VzLFxuICAgICAgICAgIGNvbFNwYW46IDEsXG4gICAgICAgICAgcm93U3BhbjogMSxcbiAgICAgICAgICBjc3NDbGFzczogUGl2b3RUYWJsZUNvbnZlcnRlci5ncm91cERhdGFDbGFzcyxcbiAgICAgICAgICBpc0hlYWRlcjogZmFsc2UsXG4gICAgICAgICAgYmFja2dyb3VuZCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGV2YWx1YXRlRXhwcmVzc2lvbihleHByZXNzaW9uOiBMbXJQaXZvdERhdGFIZWFkZXJFeHByZXNzaW9uLCBjb2x1bW46IG51bWJlcik6IHt2YWx1ZTogbnVtYmVyOyBkYXRhUmVzb3VyY2VzOiBEYXRhUmVzb3VyY2VbXSB9IHtcbiAgICByZXR1cm4gKGV4cHJlc3Npb24ub3BlcmFuZHMgfHwgW10pLnJlZHVjZSgocmVzdWx0LCBvcGVyYW5kLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3Qge3ZhbHVlLCBkYXRhUmVzb3VyY2VzIH0gPSB0aGlzLmV2YWx1YXRlT3BlcmFuZChvcGVyYW5kLCBjb2x1bW4pXG4gICAgICByZXN1bHQuZGF0YVJlc291cmNlcy5wdXNoKC4uLmRhdGFSZXNvdXJjZXMpXG4gICAgICBzd2l0Y2ggKGV4cHJlc3Npb24ub3BlcmF0aW9uKSB7XG4gICAgICAgIGNhc2UgXCJhZGRcIjpcbiAgICAgICAgICByZXN1bHQudmFsdWUgKz0gdmFsdWVcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInN1YnRyYWN0XCI6XG4gICAgICAgICAgcmVzdWx0LnZhbHVlID0gKGluZGV4ID09PSAwID8gdmFsdWUgOiByZXN1bHQudmFsdWUgLSB2YWx1ZSlcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbXVsdGlwbHknOlxuICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IGluZGV4ID09PSAwID8gdmFsdWUgOiByZXN1bHQudmFsdWUgKiB2YWx1ZVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdkaXZpZGUnOlxuICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IGluZGV4ID09PSAwID8gdmFsdWUgOiB2YWx1ZSA/IHJlc3VsdC52YWx1ZSAvIHZhbHVlIDogcmVzdWx0LnZhbHVlXG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9ICwge3ZhbHVlOiAwLCBkYXRhUmVzb3VyY2VzOiBbXX0pXG4gIH1cblxuICBwcml2YXRlIGV2YWx1YXRlT3BlcmFuZChvcGVyYW5kOiBMbXJQaXZvdERhdGFIZWFkZXJPcGVyYW5kLCBjb2x1bW46IG51bWJlcik6IHt2YWx1ZTogbnVtYmVyOyBkYXRhUmVzb3VyY2VzOiBEYXRhUmVzb3VyY2VbXSB9IHtcbiAgICBzd2l0Y2ggKG9wZXJhbmQudHlwZSkge1xuICAgICAgY2FzZSBcImV4cHJlc3Npb25cIjogcmV0dXJuIHRoaXMuZXZhbHVhdGVFeHByZXNzaW9uKG9wZXJhbmQsIGNvbHVtbilcbiAgICAgIGNhc2UgXCJ2YWx1ZVwiOiByZXR1cm4ge3ZhbHVlOiBvcGVyYW5kLnZhbHVlLCBkYXRhUmVzb3VyY2VzOiBbXX1cbiAgICAgIGNhc2UgXCJoZWFkZXJcIjoge1xuICAgICAgICBjb25zdCByb3dzID0gZ2V0VGFyZ2V0SW5kZXhlc0ZvckhlYWRlcnMob3BlcmFuZC5oZWFkZXJzKTtcbiAgICAgICAgY29uc3Qge3ZhbHVlcywgZGF0YVJlc291cmNlc30gPSB0aGlzLmdldEdyb3VwZWRWYWx1ZXNGb3JSb3dzQW5kQ29scyhyb3dzLCBbY29sdW1uXSk7XG4gICAgICAgIGNvbnN0IHt2YWx1ZX0gPSB0aGlzLmFnZ3JlZ2F0ZURhdGFWYWx1ZXModmFsdWVzLCBbY29sdW1uXSk7XG4gICAgICAgIHJldHVybiB7dmFsdWUsIGRhdGFSZXNvdXJjZXN9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRHcm91cGVkVmFsdWVzRm9yUm93c0FuZENvbHMoXG4gICAgcm93czogbnVtYmVyW10sXG4gICAgY29sdW1uczogbnVtYmVyW11cbiAgKTogeyB2YWx1ZXM6IGFueVtdOyBkYXRhUmVzb3VyY2VzOiBEYXRhUmVzb3VyY2VbXSB9IHtcbiAgICBjb25zdCB2YWx1ZXMgPSBbXTtcbiAgICBjb25zdCBkYXRhUmVzb3VyY2VzID0gW107XG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuICAgICAgICBjb25zdCByb3dDb2x1bW5WYWx1ZSA9IHRoaXMudmFsdWVzW3Jvd11bY29sdW1uXTtcbiAgICAgICAgaWYgKGlzQXJyYXkocm93Q29sdW1uVmFsdWUpKSB7XG4gICAgICAgICAgdmFsdWVzLnB1c2goLi4ucm93Q29sdW1uVmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbHVlcy5wdXNoKHJvd0NvbHVtblZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBkYXRhUmVzb3VyY2VzLnB1c2goLi4uKHRoaXMuZGF0YVJlc291cmNlcz8uW3Jvd10/Lltjb2x1bW5dIHx8IFtdKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7dmFsdWVzLCBkYXRhUmVzb3VyY2VzfTtcbiAgfVxuXG4gIHByaXZhdGUgZmlsbENlbGxzQnlDb2x1bW5zKGNlbGxzOiBMbXJQaXZvdFRhYmxlQ2VsbFtdW10pOiBIZWFkZXJHcm91cEluZm9bXSB7XG4gICAgY29uc3QgY29sdW1uR3JvdXBzID0gW107XG4gICAgdGhpcy5pdGVyYXRlQW5kRmlsbENlbGxzQnlDb2x1bW5zKFxuICAgICAgY2VsbHMsXG4gICAgICBjb2x1bW5Hcm91cHMsXG4gICAgICB0aGlzLmRhdGEuY29sdW1uSGVhZGVycyxcbiAgICAgIHRoaXMucm93TGV2ZWxzLFxuICAgICAgdGhpcy5jb2x1bW5TaG93U3VtcyxcbiAgICAgIDBcbiAgICApO1xuICAgIHJldHVybiBjb2x1bW5Hcm91cHM7XG4gIH1cblxuICBwcml2YXRlIGl0ZXJhdGVBbmRGaWxsQ2VsbHNCeUNvbHVtbnMoXG4gICAgY2VsbHM6IExtclBpdm90VGFibGVDZWxsW11bXSxcbiAgICBjb2x1bW5Hcm91cHNJbmZvOiBIZWFkZXJHcm91cEluZm9bXSxcbiAgICBoZWFkZXJzOiBMbXJQaXZvdERhdGFIZWFkZXJbXSxcbiAgICBzdGFydEluZGV4OiBudW1iZXIsXG4gICAgc2hvd1N1bXM6IGJvb2xlYW5bXSxcbiAgICBsZXZlbDogbnVtYmVyLFxuICAgIHBhcmVudEhlYWRlcj86IExtclBpdm90RGF0YUhlYWRlclxuICApIHtcbiAgICBsZXQgY3VycmVudEluZGV4ID0gc3RhcnRJbmRleDtcbiAgICBjb25zdCBudW1iZXJPZlN1bXMgPSBNYXRoLm1heCgxLCB0aGlzLmRhdGEudmFsdWVUaXRsZXMubGVuZ3RoKTtcbiAgICBmb3IgKGNvbnN0IGhlYWRlciBvZiBoZWFkZXJzKSB7XG4gICAgICBjb25zdCBjb2xTcGFuID0gZ2V0RGlyZWN0SGVhZGVyQ2hpbGRDb3VudChoZWFkZXIsIGxldmVsLCBzaG93U3VtcywgbnVtYmVyT2ZTdW1zKTtcbiAgICAgIGNlbGxzW2xldmVsXVtjdXJyZW50SW5kZXhdID0ge1xuICAgICAgICB2YWx1ZTogdGhpcy5mb3JtYXRDb2x1bW5IZWFkZXIoaGVhZGVyLnRpdGxlLCBsZXZlbCksXG4gICAgICAgIGNzc0NsYXNzOiBQaXZvdFRhYmxlQ29udmVydGVyLmNvbHVtbkhlYWRlckNsYXNzLFxuICAgICAgICBpc0hlYWRlcjogdHJ1ZSxcbiAgICAgICAgcm93U3BhbjogMSxcbiAgICAgICAgY29sU3BhbixcbiAgICAgICAgc3RpY2t5VG9wOiB0aGlzLmlzQ29sdW1uTGV2ZWxTdGlja3kobGV2ZWwpLFxuICAgICAgICBiYWNrZ3JvdW5kOiB0aGlzLmdldEhlYWRlckJhY2tncm91bmQoaGVhZGVyLCBsZXZlbCksXG4gICAgICAgIGNvbnN0cmFpbnQ6IGhlYWRlci5jb25zdHJhaW50LFxuICAgICAgICBsYWJlbDogaGVhZGVyLmF0dHJpYnV0ZU5hbWUsXG4gICAgICB9O1xuXG4gICAgICBpZiAoaGVhZGVyLmNoaWxkcmVuKSB7XG4gICAgICAgIHRoaXMuaXRlcmF0ZUFuZEZpbGxDZWxsc0J5Q29sdW1ucyhcbiAgICAgICAgICBjZWxscyxcbiAgICAgICAgICBjb2x1bW5Hcm91cHNJbmZvLFxuICAgICAgICAgIGhlYWRlci5jaGlsZHJlbixcbiAgICAgICAgICBjdXJyZW50SW5kZXgsXG4gICAgICAgICAgc2hvd1N1bXMsXG4gICAgICAgICAgbGV2ZWwgKyAxLFxuICAgICAgICAgIGhlYWRlclxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChpc05vdE51bGxPclVuZGVmaW5lZChoZWFkZXIudGFyZ2V0SW5kZXgpKSB7XG4gICAgICAgIHRoaXMuZmlsbENlbGxzRm9yQ29sdW1uKGNlbGxzLCBoZWFkZXIudGFyZ2V0SW5kZXgpO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50SW5kZXggKz0gZ2V0SGVhZGVyQ2hpbGRDb3VudChoZWFkZXIsIGxldmVsLCBzaG93U3VtcywgbnVtYmVyT2ZTdW1zKTtcbiAgICB9XG5cbiAgICBpZiAoc2hvd1N1bXNbbGV2ZWxdKSB7XG4gICAgICBjb25zdCBiYWNrZ3JvdW5kID0gdGhpcy5nZXRTdW1tYXJ5QmFja2dyb3VuZChsZXZlbCk7XG4gICAgICBjb25zdCB7IHRpdGxlLCBzdW1tYXJ5IH0gPSB0aGlzLmZvcm1hdFN1bW1hcnlIZWFkZXIocGFyZW50SGVhZGVyLCBsZXZlbClcbiAgICAgIGNvbnN0IG51bWJlck9mVmFsdWVzID0gdGhpcy5kYXRhLnZhbHVlVGl0bGVzLmxlbmd0aDtcbiAgICAgIGNvbnN0IHJvd0luZGV4ID0gTWF0aC5tYXgobGV2ZWwgLSAxLCAwKTtcbiAgICAgIGNvbnN0IHNob3VsZEFkZFZhbHVlSGVhZGVycyA9IG51bWJlck9mVmFsdWVzID4gMTtcblxuICAgICAgY2VsbHNbcm93SW5kZXhdW2N1cnJlbnRJbmRleF0gPSB7XG4gICAgICAgIHZhbHVlOiB0aXRsZSxcbiAgICAgICAgY29uc3RyYWludDogcGFyZW50SGVhZGVyPy5jb25zdHJhaW50LFxuICAgICAgICBsYWJlbDogcGFyZW50SGVhZGVyPy5hdHRyaWJ1dGVOYW1lLFxuICAgICAgICBjc3NDbGFzczogUGl2b3RUYWJsZUNvbnZlcnRlci5jb2x1bW5Hcm91cEhlYWRlckNsYXNzLFxuICAgICAgICBpc0hlYWRlcjogdHJ1ZSxcbiAgICAgICAgc3RpY2t5VG9wOiB0aGlzLmlzQ29sdW1uTGV2ZWxTdGlja3kobGV2ZWwpLFxuICAgICAgICByb3dTcGFuOiB0aGlzLmNvbHVtbkxldmVscyAtIHJvd0luZGV4IC0gKHNob3VsZEFkZFZhbHVlSGVhZGVycyA/IDEgOiAwKSxcbiAgICAgICAgY29sU3BhbjogbnVtYmVyT2ZTdW1zLFxuICAgICAgICBiYWNrZ3JvdW5kLFxuICAgICAgICBzdW1tYXJ5LFxuICAgICAgfTtcblxuICAgICAgaWYgKG51bWJlck9mVmFsdWVzID4gMCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlck9mVmFsdWVzOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBjb2x1bW5JbmRleEluQ2VsbHMgPSBjdXJyZW50SW5kZXggKyBpO1xuICAgICAgICAgIGlmIChzaG91bGRBZGRWYWx1ZUhlYWRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlVGl0bGUgPSB0aGlzLmRhdGEudmFsdWVUaXRsZXNbaV07XG4gICAgICAgICAgICBjZWxsc1t0aGlzLmNvbHVtbkxldmVscyAtIDFdW2NvbHVtbkluZGV4SW5DZWxsc10gPSB7XG4gICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVRpdGxlLFxuICAgICAgICAgICAgICBjc3NDbGFzczogUGl2b3RUYWJsZUNvbnZlcnRlci5jb2x1bW5Hcm91cEhlYWRlckNsYXNzLFxuICAgICAgICAgICAgICBpc0hlYWRlcjogdHJ1ZSxcbiAgICAgICAgICAgICAgc3RpY2t5VG9wOiB0aGlzLmlzQ29sdW1uTGV2ZWxTdGlja3kobGV2ZWwpLFxuICAgICAgICAgICAgICByb3dTcGFuOiAxLFxuICAgICAgICAgICAgICBjb2xTcGFuOiAxLFxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjb2x1bW5zSW5kZXhlcyA9IGdldFRhcmdldEluZGV4ZXNGb3JIZWFkZXJzKGhlYWRlcnMpO1xuICAgICAgICAgIGNvbnN0IHZhbHVlQ29sdW1uc0luZGV4ZXMgPSBjb2x1bW5zSW5kZXhlcy5maWx0ZXIoaW5kZXggPT4gaW5kZXggJSBudW1iZXJPZlZhbHVlcyA9PT0gaSk7XG4gICAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRDb2x1bW5JbmRleGVzID0gdmFsdWVDb2x1bW5zSW5kZXhlc1xuICAgICAgICAgICAgLm1hcCh2ID0+IHRoaXMuY29sdW1uc1RyYW5zZm9ybWF0aW9uQXJyYXlbdl0pXG4gICAgICAgICAgICAuZmlsdGVyKHYgPT4gaXNOb3ROdWxsT3JVbmRlZmluZWQodikpO1xuICAgICAgICAgIGNvbHVtbkdyb3Vwc0luZm9bY29sdW1uSW5kZXhJbkNlbGxzXSA9IHtiYWNrZ3JvdW5kLCBpbmRleGVzOiB0cmFuc2Zvcm1lZENvbHVtbkluZGV4ZXMsIGxldmVsfTtcblxuICAgICAgICAgIHRoaXMuZmlsbENlbGxzRm9yR3JvdXBlZENvbHVtbihjZWxscywgdmFsdWVDb2x1bW5zSW5kZXhlcywgY29sdW1uSW5kZXhJbkNlbGxzLCBiYWNrZ3JvdW5kKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29sdW1uR3JvdXBzSW5mb1tjdXJyZW50SW5kZXhdID0ge2JhY2tncm91bmQsIGluZGV4ZXM6IFtdLCBsZXZlbH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmaWxsQ2VsbHNGb3JHcm91cGVkQ29sdW1uKFxuICAgIGNlbGxzOiBMbXJQaXZvdFRhYmxlQ2VsbFtdW10sXG4gICAgY29sdW1uczogbnVtYmVyW10sXG4gICAgY29sdW1uSW5kZXhJbkNlbGxzOiBudW1iZXIsXG4gICAgYmFja2dyb3VuZDogc3RyaW5nXG4gICkge1xuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IHRoaXMucm93c1RyYW5zZm9ybWF0aW9uQXJyYXkubGVuZ3RoOyByb3crKykge1xuICAgICAgY29uc3Qgcm93SW5kZXhJbkNlbGxzID0gdGhpcy5yb3dzVHJhbnNmb3JtYXRpb25BcnJheVtyb3ddO1xuICAgICAgaWYgKGlzTm90TnVsbE9yVW5kZWZpbmVkKHJvd0luZGV4SW5DZWxscykpIHtcbiAgICAgICAgY29uc3Qge3ZhbHVlcywgZGF0YVJlc291cmNlc30gPSB0aGlzLmdldEdyb3VwZWRWYWx1ZXNGb3JSb3dzQW5kQ29scyhbcm93XSwgY29sdW1ucyk7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5hZ2dyZWdhdGVBbmRGb3JtYXREYXRhVmFsdWVzKHZhbHVlcywgW3Jvd10sIGNvbHVtbnMpO1xuICAgICAgICBjZWxsc1tyb3dJbmRleEluQ2VsbHNdW2NvbHVtbkluZGV4SW5DZWxsc10gPSB7XG4gICAgICAgICAgdmFsdWU6IFN0cmluZyhmb3JtYXR0ZWRWYWx1ZSksXG4gICAgICAgICAgZGF0YVJlc291cmNlcyxcbiAgICAgICAgICBjb2xTcGFuOiAxLFxuICAgICAgICAgIHJvd1NwYW46IDEsXG4gICAgICAgICAgY3NzQ2xhc3M6IFBpdm90VGFibGVDb252ZXJ0ZXIuZ3JvdXBEYXRhQ2xhc3MsXG4gICAgICAgICAgaXNIZWFkZXI6IGZhbHNlLFxuICAgICAgICAgIGJhY2tncm91bmQsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZ2dyZWdhdGVBbmRGb3JtYXREYXRhVmFsdWVzKHZhbHVlczogYW55W10sIHJvd3M6IG51bWJlcltdLCBjb2x1bW5zOiBudW1iZXJbXSk6IGFueSB7XG4gICAgY29uc3Qge3ZhbHVlLCBhZ2dyZWdhdGlvbn0gPSB0aGlzLmFnZ3JlZ2F0ZURhdGFWYWx1ZXModmFsdWVzLCBjb2x1bW5zKTtcbiAgICByZXR1cm4gYWdncmVnYXRpb24gPT09IERhdGFBZ2dyZWdhdGlvblR5cGUuSm9pbiA/IHZhbHVlIDogdGhpcy5mb3JtYXRHcm91cGVkVmFsdWVCeVZhbHVlVHlwZSh2YWx1ZSwgcm93cywgY29sdW1ucylcbiAgfVxuXG4gIHByaXZhdGUgYWdncmVnYXRlRGF0YVZhbHVlcyh2YWx1ZXM6IGFueVtdLCBjb2x1bW5zOiBudW1iZXJbXSk6IHt2YWx1ZTogYW55OyBhZ2dyZWdhdGlvbjogRGF0YUFnZ3JlZ2F0aW9uVHlwZX0ge1xuICAgIGNvbnN0IGFnZ3JlZ2F0aW9uID0gdGhpcy5hZ2dyZWdhdGlvbkJ5Q29sdW1ucyhjb2x1bW5zKTtcbiAgICBpZiAoYWdncmVnYXRpb24gPT09IERhdGFBZ2dyZWdhdGlvblR5cGUuSm9pbikge1xuICAgICAgY29uc3QgdmFsdWVJbmRleCA9IHRoaXMuZ2V0VmFsdWVJbmRleEZvckNvbHVtbnMoY29sdW1ucyk7XG4gICAgICBjb25zdCBjb25zdHJhaW50ID0gdGhpcy5kYXRhLnZhbHVlc0NvbnN0cmFpbnRzPy5bdmFsdWVJbmRleF0gfHwgdGhpcy52YWx1ZVR5cGVJbmZvW3ZhbHVlSW5kZXhdPy5kZWZhdWx0Q29uc3RyYWludDtcbiAgICAgIHJldHVybiB7dmFsdWU6IGFnZ3JlZ2F0ZURhdGFWYWx1ZXMoYWdncmVnYXRpb24sIHZhbHVlcywgY29uc3RyYWludCwgZmFsc2UsIHRoaXMuY29uc3RyYWludERhdGEpLCBhZ2dyZWdhdGlvbn07XG4gICAgfVxuICAgIHJldHVybiB7dmFsdWU6IGFnZ3JlZ2F0ZURhdGFWYWx1ZXMoYWdncmVnYXRpb24sIHZhbHVlcyksIGFnZ3JlZ2F0aW9ufTtcbiAgfVxuXG4gIHByaXZhdGUgYWdncmVnYXRpb25CeUNvbHVtbnMoY29sdW1uczogbnVtYmVyW10pOiBEYXRhQWdncmVnYXRpb25UeXBlIHtcbiAgICBjb25zdCB2YWx1ZUluZGV4ID0gY29sdW1uc1swXSAlIHRoaXMuZGF0YS52YWx1ZVRpdGxlcy5sZW5ndGg7XG4gICAgY29uc3QgYWdncmVnYXRpb24gPSB0aGlzLmRhdGEudmFsdWVBZ2dyZWdhdGlvbnM/Llt2YWx1ZUluZGV4XTtcbiAgICByZXR1cm4gaXNWYWx1ZUFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uKSA/IGFnZ3JlZ2F0aW9uIDogRGF0YUFnZ3JlZ2F0aW9uVHlwZS5TdW07XG4gIH1cblxuICBwcml2YXRlIGZpbGxDZWxsc0ZvckNvbHVtbihjZWxsczogTG1yUGl2b3RUYWJsZUNlbGxbXVtdLCBjb2x1bW46IG51bWJlcikge1xuICAgIGNvbnN0IGNvbHVtbkluZGV4SW5DZWxscyA9IHRoaXMuY29sdW1uc1RyYW5zZm9ybWF0aW9uQXJyYXlbY29sdW1uXTtcbiAgICBpZiAoaXNOb3ROdWxsT3JVbmRlZmluZWQoY29sdW1uSW5kZXhJbkNlbGxzKSkge1xuICAgICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgdGhpcy5yb3dzVHJhbnNmb3JtYXRpb25BcnJheS5sZW5ndGg7IHJvdysrKSB7XG4gICAgICAgIGNvbnN0IHJvd0luZGV4SW5DZWxscyA9IHRoaXMucm93c1RyYW5zZm9ybWF0aW9uQXJyYXlbcm93XTtcbiAgICAgICAgaWYgKGlzTm90TnVsbE9yVW5kZWZpbmVkKHJvd0luZGV4SW5DZWxscykpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YS52YWx1ZXNbcm93XVtjb2x1bW5dO1xuICAgICAgICAgIGNvbnN0IGRhdGFSZXNvdXJjZXMgPSB0aGlzLmRhdGFSZXNvdXJjZXM/Lltyb3ddPy5bY29sdW1uXSB8fCBbXTtcbiAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IHRoaXMuYWdncmVnYXRlT3JGb3JtYXRTaW5nbGVWYWx1ZSh2YWx1ZSwgY29sdW1uKTtcbiAgICAgICAgICBjb25zdCBzdHJpbmdWYWx1ZSA9IGlzTm90TnVsbE9yVW5kZWZpbmVkKGZvcm1hdHRlZFZhbHVlKSA/IFN0cmluZyhmb3JtYXR0ZWRWYWx1ZSkgOiAnJztcbiAgICAgICAgICBjZWxsc1tyb3dJbmRleEluQ2VsbHNdW2NvbHVtbkluZGV4SW5DZWxsc10gPSB7XG4gICAgICAgICAgICB2YWx1ZTogc3RyaW5nVmFsdWUsXG4gICAgICAgICAgICBkYXRhUmVzb3VyY2VzLFxuICAgICAgICAgICAgcm93U3BhbjogMSxcbiAgICAgICAgICAgIGNvbFNwYW46IDEsXG4gICAgICAgICAgICBjc3NDbGFzczogUGl2b3RUYWJsZUNvbnZlcnRlci5kYXRhQ2xhc3MsXG4gICAgICAgICAgICBpc0hlYWRlcjogZmFsc2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWdncmVnYXRlT3JGb3JtYXRTaW5nbGVWYWx1ZSh2YWx1ZTogYW55LCBjb2x1bW46IG51bWJlcik6IGFueSB7XG4gICAgY29uc3QgYWdncmVnYXRpb24gPSB0aGlzLmFnZ3JlZ2F0aW9uQnlDb2x1bW5zKFtjb2x1bW5dKTtcbiAgICBjb25zdCB2YWx1ZUluZGV4ID0gdGhpcy5nZXRWYWx1ZUluZGV4Rm9yQ29sdW1ucyhbY29sdW1uXSk7XG4gICAgaWYgKGFnZ3JlZ2F0aW9uID09PSBEYXRhQWdncmVnYXRpb25UeXBlLkpvaW4pIHtcbiAgICAgIGNvbnN0IGNvbnN0cmFpbnQgPSB0aGlzLmRhdGEudmFsdWVzQ29uc3RyYWludHM/Llt2YWx1ZUluZGV4XSB8fCB0aGlzLnZhbHVlVHlwZUluZm9bdmFsdWVJbmRleF0/LmRlZmF1bHRDb25zdHJhaW50O1xuICAgICAgcmV0dXJuIGFnZ3JlZ2F0ZURhdGFWYWx1ZXMoYWdncmVnYXRpb24sIFt2YWx1ZV0sIGNvbnN0cmFpbnQsIGZhbHNlLCB0aGlzLmNvbnN0cmFpbnREYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0VmFsdWVCeVZhbHVlVHlwZSh2YWx1ZSwgdmFsdWVJbmRleCk7XG4gIH1cblxuICBwcml2YXRlIGZpbGxDZWxsc0J5R3JvdXBJbnRlcnNlY3Rpb24oXG4gICAgY2VsbHM6IExtclBpdm90VGFibGVDZWxsW11bXSxcbiAgICByb3dHcm91cHNJbmZvOiBIZWFkZXJHcm91cEluZm9bXSxcbiAgICBjb2x1bW5Hcm91cHNJbmZvOiBIZWFkZXJHcm91cEluZm9bXVxuICApIHtcbiAgICBjb25zdCByb3dzQ291bnQgPSBjZWxscy5sZW5ndGg7XG4gICAgY29uc3QgY29sdW1uc0NvdW50ID0gKGNlbGxzWzBdICYmIGNlbGxzWzBdLmxlbmd0aCkgfHwgMDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93R3JvdXBzSW5mby5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgcm93R3JvdXBJbmZvID0gcm93R3JvdXBzSW5mb1tpXTtcbiAgICAgIGlmIChyb3dHcm91cEluZm8pIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb2x1bW5Hcm91cHNJbmZvLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgaWYgKGNvbHVtbkdyb3Vwc0luZm9bal0pIHtcbiAgICAgICAgICAgIC8vIGl0J3MgZW5vdWdoIHRvIGZpbGwgZ3JvdXAgdmFsdWVzIG9ubHkgZnJvbSByb3cgc2lkZVxuICAgICAgICAgICAgY29uc3Qge3Jvd3NJbmRleGVzLCBjb2x1bW5zSW5kZXhlc30gPSB0aGlzLmdldFZhbHVlc0luZGV4ZXNGcm9tQ2VsbHNJbmRleGVzKFxuICAgICAgICAgICAgICByb3dHcm91cEluZm8uaW5kZXhlcyxcbiAgICAgICAgICAgICAgY29sdW1uR3JvdXBzSW5mb1tqXS5pbmRleGVzXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3Qge3ZhbHVlcywgZGF0YVJlc291cmNlc30gPSB0aGlzLmdldEdyb3VwZWRWYWx1ZXNGb3JSb3dzQW5kQ29scyhyb3dzSW5kZXhlcywgY29sdW1uc0luZGV4ZXMpO1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSB0aGlzLmFnZ3JlZ2F0ZUFuZEZvcm1hdERhdGFWYWx1ZXModmFsdWVzLCByb3dzSW5kZXhlcywgY29sdW1uc0luZGV4ZXMpO1xuICAgICAgICAgICAgY2VsbHNbaV1bal0gPSB7XG4gICAgICAgICAgICAgIHZhbHVlOiBTdHJpbmcoZm9ybWF0dGVkVmFsdWUpLFxuICAgICAgICAgICAgICBkYXRhUmVzb3VyY2VzLFxuICAgICAgICAgICAgICBjb2xTcGFuOiAxLFxuICAgICAgICAgICAgICByb3dTcGFuOiAxLFxuICAgICAgICAgICAgICBjc3NDbGFzczogUGl2b3RUYWJsZUNvbnZlcnRlci5ncm91cERhdGFDbGFzcyxcbiAgICAgICAgICAgICAgaXNIZWFkZXI6IGZhbHNlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpbGxSb3dXaXRoQ29sb3IoY2VsbHMsIGksIHJvd0dyb3VwSW5mbywgY29sdW1uc0NvdW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbHVtbkdyb3Vwc0luZm8ubGVuZ3RoOyBqKyspIHtcbiAgICAgIGlmIChjb2x1bW5Hcm91cHNJbmZvW2pdKSB7XG4gICAgICAgIHRoaXMuZmlsbENvbHVtbldpdGhDb2xvcihjZWxscywgaiwgY29sdW1uR3JvdXBzSW5mb1tqXSwgcm93R3JvdXBzSW5mbywgcm93c0NvdW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFZhbHVlc0luZGV4ZXNGcm9tQ2VsbHNJbmRleGVzKFxuICAgIHJvd3M6IG51bWJlcltdLFxuICAgIGNvbHVtbnM6IG51bWJlcltdXG4gICk6IHsgcm93c0luZGV4ZXM6IG51bWJlcltdOyBjb2x1bW5zSW5kZXhlczogbnVtYmVyW10gfSB7XG4gICAgY29uc3Qgcm93c0luZGV4ZXMgPSByb3dzXG4gICAgICAubWFwKHJvdyA9PiB0aGlzLnJvd3NUcmFuc2Zvcm1hdGlvbkFycmF5LmZpbmRJbmRleCh0Um93ID0+IHRSb3cgPT09IHJvdykpXG4gICAgICAuZmlsdGVyKGluZGV4ID0+IGluZGV4ID49IDApO1xuICAgIGNvbnN0IGNvbHVtbnNJbmRleGVzID0gY29sdW1uc1xuICAgICAgLm1hcChjb2x1bW4gPT4gdGhpcy5jb2x1bW5zVHJhbnNmb3JtYXRpb25BcnJheS5maW5kSW5kZXgodENvbHVtbiA9PiB0Q29sdW1uID09PSBjb2x1bW4pKVxuICAgICAgLmZpbHRlcihpbmRleCA9PiBpbmRleCA+PSAwKTtcbiAgICByZXR1cm4ge3Jvd3NJbmRleGVzLCBjb2x1bW5zSW5kZXhlc307XG4gIH1cblxuICBwcml2YXRlIGZpbGxSb3dXaXRoQ29sb3IoXG4gICAgY2VsbHM6IExtclBpdm90VGFibGVDZWxsW11bXSxcbiAgICByb3c6IG51bWJlcixcbiAgICByb3dHcm91cEluZm86IEhlYWRlckdyb3VwSW5mbyxcbiAgICBjb2x1bW5zQ291bnQ6IG51bWJlclxuICApIHtcbiAgICBmb3IgKGxldCBpID0gdGhpcy5yb3dMZXZlbHM7IGkgPCBjb2x1bW5zQ291bnQ7IGkrKykge1xuICAgICAgY2VsbHNbcm93XVtpXSAmJiAoY2VsbHNbcm93XVtpXS5iYWNrZ3JvdW5kID0gcm93R3JvdXBJbmZvLmJhY2tncm91bmQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZmlsbENvbHVtbldpdGhDb2xvcihcbiAgICBjZWxsczogTG1yUGl2b3RUYWJsZUNlbGxbXVtdLFxuICAgIGNvbHVtbjogbnVtYmVyLFxuICAgIGNvbHVtbkdyb3VwSW5mbzogSGVhZGVyR3JvdXBJbmZvLFxuICAgIHJvd0dyb3Vwc0luZm86IEhlYWRlckdyb3VwSW5mb1tdLFxuICAgIHJvd0NvdW50OiBudW1iZXJcbiAgKSB7XG4gICAgZm9yIChsZXQgaSA9IHRoaXMuY29sdW1uTGV2ZWxzOyBpIDwgcm93Q291bnQ7IGkrKykge1xuICAgICAgY29uc3Qgcm93R3JvdXBJbmZvID0gcm93R3JvdXBzSW5mb1tpXTtcbiAgICAgIGlmICghcm93R3JvdXBJbmZvIHx8IHJvd0dyb3VwSW5mby5sZXZlbCA+IGNvbHVtbkdyb3VwSW5mby5sZXZlbCkge1xuICAgICAgICBjZWxsc1tpXVtjb2x1bW5dICYmIChjZWxsc1tpXVtjb2x1bW5dLmJhY2tncm91bmQgPSBjb2x1bW5Hcm91cEluZm8uYmFja2dyb3VuZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0Q2VsbHMoKTogTG1yUGl2b3RUYWJsZUNlbGxbXVtdIHtcbiAgICBjb25zdCByb3dzID0gdGhpcy5nZXRSb3dzQ291bnQoKSArIHRoaXMuY29sdW1uTGV2ZWxzO1xuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmdldENvbHVtbnNDb3VudCgpICsgdGhpcy5yb3dMZXZlbHM7XG5cbiAgICBjb25zdCBtYXRyaXg6IExtclBpdm90VGFibGVDZWxsW11bXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93czsgaSsrKSB7XG4gICAgICBtYXRyaXhbaV0gPSBbXTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY29sdW1uczsgaisrKSB7XG4gICAgICAgIGlmIChpID49IHRoaXMuY29sdW1uTGV2ZWxzICYmIGogPj0gdGhpcy5yb3dMZXZlbHMpIHtcbiAgICAgICAgICBjb25zdCBpc0RhdGFDbGFzcyA9IHRoaXMucm93c1RyYW5zZm9ybWF0aW9uQXJyYXkuaW5jbHVkZXMoaSkgJiYgdGhpcy5jb2x1bW5zVHJhbnNmb3JtYXRpb25BcnJheS5pbmNsdWRlcyhqKTtcbiAgICAgICAgICBtYXRyaXhbaV1bal0gPSB7XG4gICAgICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgICAgICBkYXRhUmVzb3VyY2VzOiBbXSxcbiAgICAgICAgICAgIGNzc0NsYXNzOiBpc0RhdGFDbGFzcyA/IFBpdm90VGFibGVDb252ZXJ0ZXIuZGF0YUNsYXNzIDogUGl2b3RUYWJsZUNvbnZlcnRlci5ncm91cERhdGFDbGFzcyxcbiAgICAgICAgICAgIHJvd1NwYW46IDEsXG4gICAgICAgICAgICBjb2xTcGFuOiAxLFxuICAgICAgICAgICAgaXNIZWFkZXI6IGZhbHNlLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWF0cml4W2ldW2pdID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucm93TGV2ZWxzID4gMCAmJiB0aGlzLmNvbHVtbkxldmVscyA+IDApIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5yb3dMZXZlbHM7IGorKykge1xuICAgICAgICBjb25zdCByb3dIZWFkZXJBdHRyaWJ1dGUgPSB0aGlzLmRhdGEucm93SGVhZGVyQXR0cmlidXRlc1tqXTtcbiAgICAgICAgaWYgKHJvd0hlYWRlckF0dHJpYnV0ZSkge1xuICAgICAgICAgIGNvbnN0IHRpdGxlQ29sU3BhbiA9IHRoaXMubm9uU3RpY2t5Q29sdW1uSW5kZXggfHwgdGhpcy5jb2x1bW5MZXZlbHNcbiAgICAgICAgICBtYXRyaXhbMF1bal0gPSB7XG4gICAgICAgICAgICB2YWx1ZTogcm93SGVhZGVyQXR0cmlidXRlLnRpdGxlLFxuICAgICAgICAgICAgY3NzQ2xhc3M6IFBpdm90VGFibGVDb252ZXJ0ZXIucm93QXR0cmlidXRlSGVhZGVyQ2xhc3MsXG4gICAgICAgICAgICBpc0hlYWRlcjogdHJ1ZSxcbiAgICAgICAgICAgIHJvd1NwYW46IDEsXG4gICAgICAgICAgICBjb2xTcGFuOiB0aXRsZUNvbFNwYW4sXG4gICAgICAgICAgICBzdGlja3lUb3A6IHRoaXMuaXNDb2x1bW5MZXZlbFN0aWNreSgwKSxcbiAgICAgICAgICAgIHN0aWNreVN0YXJ0OiB0aGlzLmlzUm93TGV2ZWxTdGlja3koaiksXG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiByb3dIZWFkZXJBdHRyaWJ1dGUuY29sb3IsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmICh0aGlzLmNvbHVtbkxldmVscyAtIHRpdGxlQ29sU3BhbiA+IDApIHtcbiAgICAgICAgICAgIG1hdHJpeFt0aGlzLm5vblN0aWNreUNvbHVtbkluZGV4XVtqXSA9IHtcbiAgICAgICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICAgICAgICBjc3NDbGFzczogUGl2b3RUYWJsZUNvbnZlcnRlci5yb3dBdHRyaWJ1dGVIZWFkZXJDbGFzcyxcbiAgICAgICAgICAgICAgaXNIZWFkZXI6IHRydWUsXG4gICAgICAgICAgICAgIHJvd1NwYW46IDEsXG4gICAgICAgICAgICAgIGNvbFNwYW46IHRoaXMuY29sdW1uTGV2ZWxzIC0gdGl0bGVDb2xTcGFuLFxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiByb3dIZWFkZXJBdHRyaWJ1dGUuY29sb3IsXG4gICAgICAgICAgICAgIHN0aWNreVN0YXJ0OiB0aGlzLmlzUm93TGV2ZWxTdGlja3koaiksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb2x1bW5MZXZlbHM7IGkrKykge1xuICAgICAgICAgICAgbWF0cml4W2ldW2pdID0ge1xuICAgICAgICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgICAgICAgIGNzc0NsYXNzOiBQaXZvdFRhYmxlQ29udmVydGVyLmVtcHR5Q2xhc3MsXG4gICAgICAgICAgICAgIHJvd1NwYW46IDEsXG4gICAgICAgICAgICAgIGNvbFNwYW46IDEsXG4gICAgICAgICAgICAgIHN0aWNreVN0YXJ0OiB0aGlzLmlzUm93TGV2ZWxTdGlja3koaiksXG4gICAgICAgICAgICAgIHN0aWNreVRvcDogdGhpcy5pc0NvbHVtbkxldmVsU3RpY2t5KGkpLFxuICAgICAgICAgICAgICBpc0hlYWRlcjogZmFsc2UsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdHJpeDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Um93c0NvdW50KCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuZGF0YS5yb3dIZWFkZXJzLmxlbmd0aCA9PT0gMCAmJiAodGhpcy5kYXRhLnZhbHVlVGl0bGVzIHx8IFtdKS5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgcmV0dXJuIGdldEhlYWRlcnNDaGlsZENvdW50KHRoaXMuZGF0YS5yb3dIZWFkZXJzLCB0aGlzLnJvd1Nob3dTdW1zKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29sdW1uc0NvdW50KCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuZGF0YS5jb2x1bW5IZWFkZXJzLmxlbmd0aCA9PT0gMCAmJiAodGhpcy5kYXRhLnZhbHVlVGl0bGVzIHx8IFtdKS5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgY29uc3QgbnVtYmVyT2ZTdW1zID0gTWF0aC5tYXgoMSwgKHRoaXMuZGF0YS52YWx1ZVRpdGxlcyB8fCBbXSkubGVuZ3RoKTtcbiAgICByZXR1cm4gZ2V0SGVhZGVyc0NoaWxkQ291bnQodGhpcy5kYXRhLmNvbHVtbkhlYWRlcnMsIHRoaXMuY29sdW1uU2hvd1N1bXMsIG51bWJlck9mU3Vtcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJlcGFyZVBpdm90RGF0YShcbiAgZGF0YTogTG1yUGl2b3RTdGVtRGF0YSxcbiAgY29uc3RyYWludERhdGE6IENvbnN0cmFpbnREYXRhLFxuICB2YWx1ZVR5cGVJbmZvOiBWYWx1ZVR5cGVJbmZvW11cbik6IExtclBpdm90U3RlbURhdGEge1xuICBjb25zdCBudW1iZXJPZlN1bXMgPSBNYXRoLm1heCgxLCAoZGF0YS52YWx1ZVRpdGxlcyB8fCBbXSkubGVuZ3RoKTtcbiAgY29uc3QgdmFsdWVzID0gY29tcHV0ZVZhbHVlc0J5VmFsdWVUeXBlKGRhdGEudmFsdWVzLCBkYXRhLnZhbHVlVHlwZXMsIG51bWJlck9mU3VtcywgdmFsdWVUeXBlSW5mbyk7XG4gIGNvbnN0IHNvcnRlZCA9IHNvcnRQaXZvdERhdGEoey4uLmRhdGEsIHZhbHVlc30sIGNvbnN0cmFpbnREYXRhKTtcbiAgcmV0dXJuIGZpbGxFeHByZXNzaW9uc1RvRGF0YShzb3J0ZWQpXG59XG5cbmZ1bmN0aW9uIGZpbGxFeHByZXNzaW9uc1RvRGF0YShkYXRhOiBMbXJQaXZvdFN0ZW1EYXRhKTogTG1yUGl2b3RTdGVtRGF0YSB7XG4gIHJldHVybiB7XG4gICAgLi4uZGF0YSxcbiAgICByb3dIZWFkZXJzOiBmaWxsRXhwcmVzc2lvbnNUb0hlYWRlcnMoZGF0YS5yb3dIZWFkZXJzLCBkYXRhLnJvd3NDb25maWcsIDApLFxuICAgIGNvbHVtbkhlYWRlcnM6IGZpbGxFeHByZXNzaW9uc1RvSGVhZGVycyhkYXRhLmNvbHVtbkhlYWRlcnMsIGRhdGEuY29sdW1uc0NvbmZpZywgMCksXG4gIH1cbn1cblxuZnVuY3Rpb24gZmlsbEV4cHJlc3Npb25zVG9IZWFkZXJzKGhlYWRlcnM6IExtclBpdm90RGF0YUhlYWRlcltdLCBjb25maWdzOiBMbXJQaXZvdERpbWVuc2lvbkNvbmZpZ1tdLCBpbmRleDogbnVtYmVyKTogTG1yUGl2b3REYXRhSGVhZGVyW10ge1xuICBjb25zdCBleHByZXNzaW9ucyA9IGNvbmZpZ3M/LltpbmRleF0/LmV4cHJlc3Npb25zIHx8IFtdXG4gIGNvbnN0IGhlYWRlcnNDb3B5ID0gWy4uLihoZWFkZXJzIHx8IFtdKV1cbiAgZm9yIChjb25zdCBleHByZXNzaW9uIG9mIGV4cHJlc3Npb25zKSB7XG4gICAgY29uc3QgZGF0YUhlYWRlckV4cHJlc3Npb24gPSBleHRlbmRQaXZvdEV4cHJlc3Npb24oZXhwcmVzc2lvbiwgaGVhZGVycylcbiAgICBpZiAoZGF0YUhlYWRlckV4cHJlc3Npb24ubGFzdEhlYWRlckluZGV4ID49IDApIHtcbiAgICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGRhdGFIZWFkZXJFeHByZXNzaW9uLmxhc3RIZWFkZXJJbmRleFxuICAgICAgY29uc3QgbmV3SGVhZGVyOiBMbXJQaXZvdERhdGFIZWFkZXIgPSB7Li4uaGVhZGVyc0NvcHlbbGFzdEhlYWRlckluZGV4XSwgZXhwcmVzc2lvbnM6IFsuLi4oaGVhZGVyc0NvcHlbbGFzdEhlYWRlckluZGV4XS5leHByZXNzaW9ucyB8fCBbXSksIGRhdGFIZWFkZXJFeHByZXNzaW9uXX1cbiAgICAgIGhlYWRlcnNDb3B5LnNwbGljZShsYXN0SGVhZGVySW5kZXgsIDEsIG5ld0hlYWRlcilcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlncz8uW2luZGV4ICsgMV0pIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlcnNDb3B5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBoZWFkZXJzQ29weS5zcGxpY2UoaSwgMSwgey4uLmhlYWRlcnNDb3B5W2ldLCBjaGlsZHJlbjogZmlsbEV4cHJlc3Npb25zVG9IZWFkZXJzKGhlYWRlcnNDb3B5W2ldLmNoaWxkcmVuLCBjb25maWdzLCBpbmRleCArIDEpfSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaGVhZGVyc0NvcHlcbn1cblxuZnVuY3Rpb24gZXh0ZW5kUGl2b3RFeHByZXNzaW9uKGV4cHJlc3Npb246IExtclBpdm90RXhwcmVzc2lvbiwgaGVhZGVyczogTG1yUGl2b3REYXRhSGVhZGVyW10pOiBMbXJQaXZvdERhdGFIZWFkZXJFeHByZXNzaW9uIHtcbiAgY29uc3QgZGF0YUhlYWRlck9wZXJhbmRzOiBMbXJQaXZvdERhdGFIZWFkZXJPcGVyYW5kW10gPSBbXTtcbiAgbGV0IGxhc3RIZWFkZXJJbmRleDogbnVtYmVyID0gLTFcblxuICBmdW5jdGlvbiB0cmF2ZXJzZShvcGVyYW5kczogTG1yUGl2b3RPcGVyYW5kW10pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IG9wZXJhbmQgb2Ygb3BlcmFuZHMpe1xuICAgICAgaWYgKG9wZXJhbmQudHlwZSA9PT0gJ2hlYWRlcicpIHtcbiAgICAgICAgY29uc3QgaW5kZXhlcyA9IGdldE9wZXJhbmRJbmRleGVzSW5IZWFkZXJzKG9wZXJhbmQsIGhlYWRlcnMpXG4gICAgICAgIGxhc3RIZWFkZXJJbmRleCA9IE1hdGgubWF4KGxhc3RIZWFkZXJJbmRleCwgLi4uaW5kZXhlcylcbiAgICAgICAgY29uc3Qgb3BlcmFuZEhlYWRlcnMgPSBpbmRleGVzLm1hcChpbmRleCA9PiBoZWFkZXJzW2luZGV4XSlcbiAgICAgICAgZGF0YUhlYWRlck9wZXJhbmRzLnB1c2goey4uLm9wZXJhbmQsIGhlYWRlcnM6IG9wZXJhbmRIZWFkZXJzfSk7XG4gICAgICB9IGVsc2UgaWYgKG9wZXJhbmQudHlwZSA9PT0gJ2V4cHJlc3Npb24nKSB7XG4gICAgICAgIHRyYXZlcnNlKG9wZXJhbmQub3BlcmFuZHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YUhlYWRlck9wZXJhbmRzLnB1c2gob3BlcmFuZClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0cmF2ZXJzZShleHByZXNzaW9uLm9wZXJhbmRzKTtcblxuICByZXR1cm4gey4uLmV4cHJlc3Npb24sIGxhc3RIZWFkZXJJbmRleCwgb3BlcmFuZHM6IGRhdGFIZWFkZXJPcGVyYW5kc307XG59XG5cbmZ1bmN0aW9uIGdldE9wZXJhbmRJbmRleGVzSW5IZWFkZXJzKG9wZXJhbmQ6IExtclBpdm90SGVhZGVyT3BlcmFuZCwgaGVhZGVyczogTG1yUGl2b3REYXRhSGVhZGVyW10pOiBudW1iZXJbXSB7XG4gIHJldHVybiAoaGVhZGVycyB8fCBbXSkucmVkdWNlPG51bWJlcltdPigoaW5kZXhlcywgaGVhZGVyLCBpbmRleCkgPT4ge1xuICAgIGlmIChvcGVyYW5kQ29udGFpbnNIZWFkZXIob3BlcmFuZCwgaGVhZGVyKSkge1xuICAgICAgaW5kZXhlcy5wdXNoKGluZGV4KVxuICAgIH1cbiAgICByZXR1cm4gaW5kZXhlc1xuICB9LCBbXSlcbn1cblxuZnVuY3Rpb24gb3BlcmFuZENvbnRhaW5zSGVhZGVyKG9wZXJhbmQ6IExtclBpdm90SGVhZGVyT3BlcmFuZCwgaGVhZGVyOiBMbXJQaXZvdERhdGFIZWFkZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIGhlYWRlci50aXRsZS5tYXRjaChuZXcgUmVnRXhwKG9wZXJhbmQudmFsdWUpKT8ubGVuZ3RoID4gMFxufVxuXG5mdW5jdGlvbiBjb21wdXRlVmFsdWVzQnlWYWx1ZVR5cGUoXG4gIHZhbHVlczogYW55W11bXSxcbiAgdmFsdWVUeXBlczogTG1yUGl2b3RWYWx1ZVR5cGVbXSxcbiAgbnVtVmFsdWVzOiBudW1iZXIsXG4gIHZhbHVlVHlwZUluZm86IFZhbHVlVHlwZUluZm9bXVxuKTogYW55W11bXSB7XG4gIGNvbnN0IHJvd3NJbmRleGVzID0gWy4uLkFycmF5KHZhbHVlcy5sZW5ndGgpLmtleXMoKV07XG4gIGNvbnN0IG1vZGlmaWVkVmFsdWVzID0gZGVlcE9iamVjdENvcHkodmFsdWVzKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVZhbHVlczsgaSsrKSB7XG4gICAgY29uc3QgdmFsdWVUeXBlID0gdmFsdWVUeXBlcyAmJiB2YWx1ZVR5cGVzW2ldO1xuICAgIGlmICghdmFsdWVUeXBlIHx8IHZhbHVlVHlwZSA9PT0gTG1yUGl2b3RWYWx1ZVR5cGUuRGVmYXVsdCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgY29sdW1uc0NvdW50ID0gKHZhbHVlc1swXSAmJiB2YWx1ZXNbMF0ubGVuZ3RoKSB8fCAwO1xuICAgIGNvbnN0IGNvbHVtbkluZGV4ZXMgPSBbLi4uQXJyYXkoY29sdW1uc0NvdW50KS5rZXlzKCldLmZpbHRlcihrZXkgPT4ga2V5ICUgbnVtVmFsdWVzID09PSBpKTtcbiAgICBjb25zdCBpbmZvID0gdmFsdWVUeXBlSW5mb1tpXTtcblxuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3NJbmRleGVzKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5JbmRleGVzKSB7XG4gICAgICAgIGlmICh2YWx1ZVR5cGUgPT09IExtclBpdm90VmFsdWVUeXBlLkFsbFBlcmNlbnRhZ2UpIHtcbiAgICAgICAgICBtb2RpZmllZFZhbHVlc1tyb3ddW2NvbHVtbl0gPSBkaXZpZGVWYWx1ZXModmFsdWVzW3Jvd11bY29sdW1uXSwgaW5mby5zdW0pO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PT0gTG1yUGl2b3RWYWx1ZVR5cGUuUm93UGVyY2VudGFnZSkge1xuICAgICAgICAgIG1vZGlmaWVkVmFsdWVzW3Jvd11bY29sdW1uXSA9IGRpdmlkZVZhbHVlcyh2YWx1ZXNbcm93XVtjb2x1bW5dLCBpbmZvLnN1bXNSb3dzW3Jvd10pO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PT0gTG1yUGl2b3RWYWx1ZVR5cGUuQ29sdW1uUGVyY2VudGFnZSkge1xuICAgICAgICAgIG1vZGlmaWVkVmFsdWVzW3Jvd11bY29sdW1uXSA9IGRpdmlkZVZhbHVlcyh2YWx1ZXNbcm93XVtjb2x1bW5dLCBpbmZvLnN1bXNDb2x1bW5zW2NvbHVtbl0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1vZGlmaWVkVmFsdWVzO1xufVxuXG5mdW5jdGlvbiBnZXRWYWx1ZXNUeXBlSW5mbyh2YWx1ZXM6IGFueVtdW10sIHZhbHVlVHlwZXM6IExtclBpdm90VmFsdWVUeXBlW10sIG51bVZhbHVlczogbnVtYmVyKTogVmFsdWVUeXBlSW5mb1tdIHtcbiAgY29uc3QgdmFsdWVUeXBlSW5mbyA9IFtdO1xuICBjb25zdCByb3dzSW5kZXhlcyA9IFsuLi5BcnJheSh2YWx1ZXMubGVuZ3RoKS5rZXlzKCldO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyBpKyspIHtcbiAgICBjb25zdCB2YWx1ZVR5cGUgPSB2YWx1ZVR5cGVzICYmIHZhbHVlVHlwZXNbaV07XG4gICAgY29uc3QgY29sdW1uc0NvdW50ID0gKHZhbHVlc1swXSAmJiB2YWx1ZXNbMF0ubGVuZ3RoKSB8fCAwO1xuICAgIGNvbnN0IGNvbHVtbkluZGV4ZXMgPSBbLi4uQXJyYXkoY29sdW1uc0NvdW50KS5rZXlzKCldLmZpbHRlcihrZXkgPT4ga2V5ICUgbnVtVmFsdWVzID09PSBpKTtcblxuICAgIHZhbHVlVHlwZUluZm9baV0gPSBnZXRWYWx1ZVR5cGVJbmZvKHZhbHVlcywgdmFsdWVUeXBlLCByb3dzSW5kZXhlcywgY29sdW1uSW5kZXhlcyk7XG4gIH1cblxuICByZXR1cm4gdmFsdWVUeXBlSW5mbztcbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWVUeXBlSW5mbyh2YWx1ZXM6IGFueVtdW10sIHR5cGU6IExtclBpdm90VmFsdWVUeXBlLCByb3dzOiBudW1iZXJbXSwgY29sdW1uczogbnVtYmVyW10pOiBWYWx1ZVR5cGVJbmZvIHtcbiAgY29uc3QgY29udGFpbnNEZWNpbWFsID0gY29udGFpbnNEZWNpbWFsVmFsdWUodmFsdWVzLCByb3dzLCBjb2x1bW5zKTtcbiAgY29uc3QgdmFsdWVUeXBlSW5mbzogVmFsdWVUeXBlSW5mbyA9IHtcbiAgICBkZWZhdWx0Q29uc3RyYWludDogY29udGFpbnNEZWNpbWFsID8gbmV3IE51bWJlckNvbnN0cmFpbnQoe2RlY2ltYWxzOiAyfSkgOiBudWxsLFxuICB9O1xuXG4gIGlmICh0eXBlID09PSBMbXJQaXZvdFZhbHVlVHlwZS5BbGxQZXJjZW50YWdlKSB7XG4gICAgcmV0dXJuIHsuLi52YWx1ZVR5cGVJbmZvLCBzdW06IGdldE51bWVyaWNWYWx1ZXNTdW1tYXJ5KHZhbHVlcywgcm93cywgY29sdW1ucyl9O1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IExtclBpdm90VmFsdWVUeXBlLlJvd1BlcmNlbnRhZ2UpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4udmFsdWVUeXBlSW5mbyxcbiAgICAgIHN1bXNSb3dzOiByb3dzLnJlZHVjZSgoYXJyLCByb3cpID0+IHtcbiAgICAgICAgYXJyW3Jvd10gPSBnZXROdW1lcmljVmFsdWVzU3VtbWFyeSh2YWx1ZXMsIFtyb3ddLCBjb2x1bW5zKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICAgIH0sIFtdKSxcbiAgICB9O1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IExtclBpdm90VmFsdWVUeXBlLkNvbHVtblBlcmNlbnRhZ2UpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4udmFsdWVUeXBlSW5mbyxcbiAgICAgIHN1bXNDb2x1bW5zOiBjb2x1bW5zLnJlZHVjZSgoYXJyLCBjb2x1bW4pID0+IHtcbiAgICAgICAgYXJyW2NvbHVtbl0gPSBnZXROdW1lcmljVmFsdWVzU3VtbWFyeSh2YWx1ZXMsIHJvd3MsIFtjb2x1bW5dKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICAgIH0sIFtdKSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHsuLi52YWx1ZVR5cGVJbmZvfTtcbn1cblxuZnVuY3Rpb24gY29udGFpbnNEZWNpbWFsVmFsdWUodmFsdWVzOiBhbnlbXVtdLCByb3dzOiBudW1iZXJbXSwgY29sdW1uczogbnVtYmVyW10pOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcbiAgICAgIGlmIChpc1ZhbHVlRGVjaW1hbCh2YWx1ZXNbcm93XVtjb2x1bW5dKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc1ZhbHVlRGVjaW1hbCh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChpc051bGxPclVuZGVmaW5lZCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoaXNOdW1lcmljKHZhbHVlKSkge1xuICAgIHJldHVybiB0b051bWJlcih2YWx1ZSkgJSAxICE9PSAwO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlVHJhbnNmb3JtYXRpb25NYXAoXG4gIGhlYWRlcnM6IExtclBpdm90RGF0YUhlYWRlcltdLFxuICBzaG93U3VtczogYm9vbGVhbltdLFxuICBhZGRpdGlvbmFsTnVtOiBudW1iZXIsXG4gIG51bWJlck9mU3VtczogbnVtYmVyXG4pOiBudW1iZXJbXSB7XG4gIGNvbnN0IGFycmF5ID0gW107XG4gIGl0ZXJhdGVUaHJvdWdoVHJhbnNmb3JtYXRpb25NYXAoaGVhZGVycywgYWRkaXRpb25hbE51bSwgYXJyYXksIDAsIHNob3dTdW1zLCBudW1iZXJPZlN1bXMpO1xuICByZXR1cm4gYXJyYXk7XG59XG5cbmZ1bmN0aW9uIGl0ZXJhdGVUaHJvdWdoVHJhbnNmb3JtYXRpb25NYXAoXG4gIGhlYWRlcnM6IExtclBpdm90RGF0YUhlYWRlcltdLFxuICBhZGRpdGlvbmFsTnVtOiBudW1iZXIsXG4gIGFycmF5OiBudW1iZXJbXSxcbiAgbGV2ZWw6IG51bWJlcixcbiAgc2hvd1N1bXM6IGJvb2xlYW5bXSxcbiAgbnVtYmVyT2ZTdW1zOiBudW1iZXJcbikge1xuICBsZXQgYWRkaXRpb25hbCA9IGFkZGl0aW9uYWxOdW07XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGhlYWRlciA9IGhlYWRlcnNbaV07XG4gICAgaWYgKGhlYWRlci5jaGlsZHJlbikge1xuICAgICAgaXRlcmF0ZVRocm91Z2hUcmFuc2Zvcm1hdGlvbk1hcChoZWFkZXIuY2hpbGRyZW4sIGFkZGl0aW9uYWwsIGFycmF5LCBsZXZlbCArIDEsIHNob3dTdW1zLCBudW1iZXJPZlN1bXMpO1xuICAgICAgYWRkaXRpb25hbCArPSBnZXRIZWFkZXJDaGlsZENvdW50KGhlYWRlciwgbGV2ZWwsIHNob3dTdW1zLCBudW1iZXJPZlN1bXMpO1xuICAgIH0gZWxzZSBpZiAoaXNOb3ROdWxsT3JVbmRlZmluZWQoaGVhZGVyLnRhcmdldEluZGV4KSkge1xuICAgICAgYXJyYXlbaGVhZGVyLnRhcmdldEluZGV4XSA9IGkgKyBhZGRpdGlvbmFsO1xuICAgICAgYWRkaXRpb25hbCArPSAoaGVhZGVyLmV4cHJlc3Npb25zIHx8IFtdKS5sZW5ndGg7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldEluZGV4ZXNGb3JIZWFkZXJzKGhlYWRlcnM6IExtclBpdm90RGF0YUhlYWRlcltdKTogbnVtYmVyW10ge1xuICBjb25zdCBhbGxSb3dzID0gKGhlYWRlcnMgfHwgW10pLnJlZHVjZSgocm93cywgaGVhZGVyKSA9PiB7XG4gICAgcm93cy5wdXNoKC4uLmdldFRhcmdldEluZGV4ZXNGb3JIZWFkZXIoaGVhZGVyKSk7XG4gICAgcmV0dXJuIHJvd3M7XG4gIH0sIFtdKTtcbiAgcmV0dXJuIHVuaXF1ZVZhbHVlczxudW1iZXI+KGFsbFJvd3MpO1xufVxuXG5mdW5jdGlvbiBnZXRUYXJnZXRJbmRleGVzRm9ySGVhZGVyKHBpdm90RGF0YUhlYWRlcjogTG1yUGl2b3REYXRhSGVhZGVyKTogbnVtYmVyW10ge1xuICBpZiAocGl2b3REYXRhSGVhZGVyLmNoaWxkcmVuKSB7XG4gICAgcmV0dXJuIHBpdm90RGF0YUhlYWRlci5jaGlsZHJlbi5yZWR1Y2UoKHJvd3MsIGhlYWRlcikgPT4ge1xuICAgICAgcm93cy5wdXNoKC4uLmdldFRhcmdldEluZGV4ZXNGb3JIZWFkZXIoaGVhZGVyKSk7XG4gICAgICByZXR1cm4gcm93cztcbiAgICB9LCBbXSk7XG4gIH1cbiAgcmV0dXJuIFtwaXZvdERhdGFIZWFkZXIudGFyZ2V0SW5kZXhdO1xufVxuXG5mdW5jdGlvbiBnZXRIZWFkZXJzQ2hpbGRDb3VudChoZWFkZXJzOiBMbXJQaXZvdERhdGFIZWFkZXJbXSwgc2hvd1N1bXM6IGJvb2xlYW5bXSwgbnVtYmVyT2ZTdW1zID0gMSk6IG51bWJlciB7XG4gIHJldHVybiAoaGVhZGVycyB8fCBbXSkucmVkdWNlKFxuICAgIChzdW0sIGhlYWRlcikgPT4gc3VtICsgZ2V0SGVhZGVyQ2hpbGRDb3VudChoZWFkZXIsIDAsIHNob3dTdW1zLCBudW1iZXJPZlN1bXMpLFxuICAgIHNob3dTdW1zWzBdID8gbnVtYmVyT2ZTdW1zIDogMFxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRIZWFkZXJDaGlsZENvdW50KFxuICBwaXZvdERhdGFIZWFkZXI6IExtclBpdm90RGF0YUhlYWRlcixcbiAgbGV2ZWw6IG51bWJlcixcbiAgc2hvd1N1bXM6IGJvb2xlYW5bXSxcbiAgbnVtYmVyT2ZTdW1zID0gMSxcbik6IG51bWJlciB7XG4gIGNvbnN0IG51bUV4cHJlc3Npb25zID0gKHBpdm90RGF0YUhlYWRlci5leHByZXNzaW9ucyB8fCBbXSkubGVuZ3RoXG4gIGlmIChwaXZvdERhdGFIZWFkZXIuY2hpbGRyZW4pIHtcbiAgICByZXR1cm4gcGl2b3REYXRhSGVhZGVyLmNoaWxkcmVuLnJlZHVjZShcbiAgICAgIChzdW0sIGhlYWRlcikgPT4gc3VtICsgZ2V0SGVhZGVyQ2hpbGRDb3VudChoZWFkZXIsIGxldmVsICsgMSwgc2hvd1N1bXMsIG51bWJlck9mU3VtcyksXG4gICAgICAoc2hvd1N1bXNbbGV2ZWwgKyAxXSA/IG51bWJlck9mU3VtcyA6IDApICsgbnVtRXhwcmVzc2lvbnNcbiAgICApO1xuICB9XG4gIHJldHVybiAxICsgbnVtRXhwcmVzc2lvbnM7XG59XG5cbmZ1bmN0aW9uIGdldERpcmVjdEhlYWRlckNoaWxkQ291bnQoXG4gIHBpdm90RGF0YUhlYWRlcjogTG1yUGl2b3REYXRhSGVhZGVyLFxuICBsZXZlbDogbnVtYmVyLFxuICBzaG93U3VtczogYm9vbGVhbltdLFxuICBudW1iZXJPZlN1bXMgPSAxXG4pOiBudW1iZXIge1xuICBpZiAocGl2b3REYXRhSGVhZGVyLmNoaWxkcmVuKSB7XG4gICAgcmV0dXJuIHBpdm90RGF0YUhlYWRlci5jaGlsZHJlbi5yZWR1Y2UoXG4gICAgICAoc3VtLCBoZWFkZXIpID0+IHN1bSArIGdldEhlYWRlckNoaWxkQ291bnQoaGVhZGVyLCBsZXZlbCArIDEsIHNob3dTdW1zLCBudW1iZXJPZlN1bXMpLFxuICAgICAgMFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIDE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzb3J0UGl2b3REYXRhKGRhdGE6IExtclBpdm90U3RlbURhdGEsIGNvbnN0cmFpbnREYXRhOiBDb25zdHJhaW50RGF0YSk6IExtclBpdm90U3RlbURhdGEge1xuICBjb25zdCByb3dTb3J0cyA9IChkYXRhLnJvd3NDb25maWcgfHwgW10pLm1hcChjb25maWcgPT4gY29uZmlnLnNvcnQpXG4gIGNvbnN0IGNvbHVtblNvcnRzID0gKGRhdGEuY29sdW1uc0NvbmZpZyB8fCBbXSkubWFwKGNvbmZpZyA9PiBjb25maWcuc29ydClcbiAgcmV0dXJuIHtcbiAgICAuLi5kYXRhLFxuICAgIHJvd0hlYWRlcnM6IHNvcnRQaXZvdFJvd0RhdGFIZWFkZXJzKGRhdGEucm93SGVhZGVycywgcm93U29ydHMsIGRhdGEsIGNvbnN0cmFpbnREYXRhKSxcbiAgICBjb2x1bW5IZWFkZXJzOiBzb3J0UGl2b3RDb2x1bW5EYXRhSGVhZGVycyhkYXRhLmNvbHVtbkhlYWRlcnMsIGNvbHVtblNvcnRzLCBkYXRhLCBjb25zdHJhaW50RGF0YSksXG4gIH07XG59XG5cbmZ1bmN0aW9uIHNvcnRQaXZvdFJvd0RhdGFIZWFkZXJzKFxuICByb3dIZWFkZXJzOiBMbXJQaXZvdERhdGFIZWFkZXJbXSxcbiAgcm93U29ydHM6IExtclBpdm90U29ydFtdLFxuICBwaXZvdERhdGE6IExtclBpdm90U3RlbURhdGEsXG4gIGNvbnN0cmFpbnREYXRhOiBDb25zdHJhaW50RGF0YVxuKTogTG1yUGl2b3REYXRhSGVhZGVyW10ge1xuICByZXR1cm4gc29ydFBpdm90RGF0YUhlYWRlcnNSZWN1cnNpdmUoXG4gICAgcm93SGVhZGVycyxcbiAgICAwLFxuICAgIHJvd1NvcnRzLFxuICAgIHBpdm90RGF0YS5jb2x1bW5IZWFkZXJzLFxuICAgIHBpdm90RGF0YS52YWx1ZXMsXG4gICAgcGl2b3REYXRhLnZhbHVlVGl0bGVzIHx8IFtdLFxuICAgIHRydWUsXG4gICAgY29uc3RyYWludERhdGFcbiAgKTtcbn1cblxuZnVuY3Rpb24gc29ydFBpdm90Q29sdW1uRGF0YUhlYWRlcnMoXG4gIGNvbHVtbkhlYWRlcnM6IExtclBpdm90RGF0YUhlYWRlcltdLFxuICBjb2x1bW5Tb3J0czogTG1yUGl2b3RTb3J0W10sXG4gIHBpdm90RGF0YTogTG1yUGl2b3RTdGVtRGF0YSxcbiAgY29uc3RyYWludERhdGE6IENvbnN0cmFpbnREYXRhXG4pOiBMbXJQaXZvdERhdGFIZWFkZXJbXSB7XG4gIHJldHVybiBzb3J0UGl2b3REYXRhSGVhZGVyc1JlY3Vyc2l2ZShcbiAgICBjb2x1bW5IZWFkZXJzLFxuICAgIDAsXG4gICAgY29sdW1uU29ydHMsXG4gICAgcGl2b3REYXRhLnJvd0hlYWRlcnMsXG4gICAgcGl2b3REYXRhLnZhbHVlcyxcbiAgICBwaXZvdERhdGEudmFsdWVUaXRsZXMgfHwgW10sXG4gICAgZmFsc2UsXG4gICAgY29uc3RyYWludERhdGFcbiAgKTtcbn1cblxuZnVuY3Rpb24gc29ydFBpdm90RGF0YUhlYWRlcnNSZWN1cnNpdmUoXG4gIGhlYWRlcnM6IExtclBpdm90RGF0YUhlYWRlcltdLFxuICBpbmRleDogbnVtYmVyLFxuICBzb3J0czogTG1yUGl2b3RTb3J0W10sXG4gIG90aGVyU2lkZUhlYWRlcnM6IExtclBpdm90RGF0YUhlYWRlcltdLFxuICB2YWx1ZXM6IGFueVtdW10sXG4gIHZhbHVlVGl0bGVzOiBzdHJpbmdbXSxcbiAgaXNSb3dzOiBib29sZWFuLFxuICBjb25zdHJhaW50RGF0YTogQ29uc3RyYWludERhdGFcbik6IExtclBpdm90RGF0YUhlYWRlcltdIHtcbiAgLy8gd2UgZG9uJ3Qgd2FudCB0byBzb3J0IHZhbHVlcyBoZWFkZXJzXG4gIGlmICghaXNSb3dzICYmIGlzVmFsdWVzSGVhZGVycyhoZWFkZXJzLCB2YWx1ZVRpdGxlcykpIHtcbiAgICByZXR1cm4gaGVhZGVycztcbiAgfVxuICBjb25zdCBzb3J0ID0gc29ydHMgJiYgc29ydHNbaW5kZXhdO1xuICBjb25zdCBjb25zdHJhaW50ID0gZ2V0Q29uc3RyYWludEZvclNvcnQoc29ydCwgaGVhZGVycyk7XG4gIGNvbnN0IHZhbHVlc01hcCA9IGNyZWF0ZUhlYWRlcnNWYWx1ZXNNYXAoaGVhZGVycywgc29ydCwgb3RoZXJTaWRlSGVhZGVycywgdmFsdWVzLCB2YWx1ZVRpdGxlcywgaXNSb3dzKTtcbiAgcmV0dXJuIGhlYWRlcnNcbiAgICAubWFwKGhlYWRlciA9PiAoe1xuICAgICAgLi4uaGVhZGVyLFxuICAgICAgY2hpbGRyZW46XG4gICAgICAgIGhlYWRlci5jaGlsZHJlbiAmJlxuICAgICAgICBzb3J0UGl2b3REYXRhSGVhZGVyc1JlY3Vyc2l2ZShcbiAgICAgICAgICBoZWFkZXIuY2hpbGRyZW4sXG4gICAgICAgICAgaW5kZXggKyAxLFxuICAgICAgICAgIHNvcnRzLFxuICAgICAgICAgIG90aGVyU2lkZUhlYWRlcnMsXG4gICAgICAgICAgdmFsdWVzLFxuICAgICAgICAgIHZhbHVlVGl0bGVzLFxuICAgICAgICAgIGlzUm93cyxcbiAgICAgICAgICBjb25zdHJhaW50RGF0YVxuICAgICAgICApLFxuICAgIH0pKVxuICAgIC5zb3J0KChyMSwgcjIpID0+IHtcbiAgICAgIGNvbnN0IHIxVmFsdWUgPSBjb25zdHJhaW50LmNyZWF0ZURhdGFWYWx1ZSh2YWx1ZXNNYXBbcjEudGl0bGVdLCBjb25zdHJhaW50RGF0YSk7XG4gICAgICBjb25zdCByMlZhbHVlID0gY29uc3RyYWludC5jcmVhdGVEYXRhVmFsdWUodmFsdWVzTWFwW3IyLnRpdGxlXSwgY29uc3RyYWludERhdGEpO1xuICAgICAgY29uc3QgbXVsdGlwbGllciA9ICFzb3J0IHx8IHNvcnQuYXNjID8gMSA6IC0xO1xuICAgICAgcmV0dXJuIHIxVmFsdWUuY29tcGFyZVRvKHIyVmFsdWUpICogbXVsdGlwbGllcjtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29uc3RyYWludEZvclNvcnQoc29ydDogTG1yUGl2b3RTb3J0LCBoZWFkZXJzOiBMbXJQaXZvdERhdGFIZWFkZXJbXSk6IENvbnN0cmFpbnQge1xuICBpZiAoKHNvcnQ/Lmxpc3Q/LnZhbHVlcyB8fCBbXSkubGVuZ3RoID4gMCkge1xuICAgIC8vIHNvcnQgaXMgZG9uZSBieSB2YWx1ZXMgaW4gY29sdW1uc1xuICAgIHJldHVybiBuZXcgTnVtYmVyQ29uc3RyYWludCh7fSk7XG4gIH1cbiAgcmV0dXJuICgoaGVhZGVycyB8fCBbXSlbMF0gJiYgKGhlYWRlcnMgfHwgW10pWzBdLmNvbnN0cmFpbnQpIHx8IG5ldyBVbmtub3duQ29uc3RyYWludCgpO1xufVxuXG5mdW5jdGlvbiBpc1ZhbHVlc0hlYWRlcnMoaGVhZGVyczogTG1yUGl2b3REYXRhSGVhZGVyW10sIHZhbHVlVGl0bGVzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHZhbHVlVGl0bGVzLmxlbmd0aCA+IDEgJiZcbiAgICAoaGVhZGVycyB8fCBbXSkuZXZlcnkoXG4gICAgICAoaGVhZGVyLCBpbmRleCkgPT4gaXNOb3ROdWxsT3JVbmRlZmluZWQoaGVhZGVyLnRhcmdldEluZGV4KSAmJiBoZWFkZXIudGl0bGUgPT09IHZhbHVlVGl0bGVzW2luZGV4XVxuICAgIClcbiAgKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlSGVhZGVyc1ZhbHVlc01hcChcbiAgaGVhZGVyczogTG1yUGl2b3REYXRhSGVhZGVyW10sXG4gIHNvcnQ6IExtclBpdm90U29ydCxcbiAgb3RoZXJTaWRlSGVhZGVyczogTG1yUGl2b3REYXRhSGVhZGVyW10sXG4gIHZhbHVlczogYW55W11bXSxcbiAgdmFsdWVUaXRsZXM6IHN0cmluZ1tdLFxuICBpc1Jvd3M6IGJvb2xlYW5cbik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICBjb25zdCBzb3J0VGFyZ2V0SW5kZXhlcyA9IHNvcnRWYWx1ZVRhcmdldEluZGV4ZXMoc29ydCwgb3RoZXJTaWRlSGVhZGVycywgdmFsdWVUaXRsZXMpO1xuICBpZiAoIXNvcnRUYXJnZXRJbmRleGVzKSB7XG4gICAgcmV0dXJuIChoZWFkZXJzIHx8IFtdKS5yZWR1Y2UoKHZhbHVlc01hcCwgaGVhZGVyKSA9PiB7XG4gICAgICB2YWx1ZXNNYXBbaGVhZGVyLnRpdGxlXSA9IGhlYWRlci50aXRsZTtcbiAgICAgIHJldHVybiB2YWx1ZXNNYXA7XG4gICAgfSwge30pO1xuICB9XG5cbiAgcmV0dXJuIChoZWFkZXJzIHx8IFtdKS5yZWR1Y2UoKHZhbHVlc01hcCwgaGVhZGVyKSA9PiB7XG4gICAgY29uc3Qgcm93cyA9IGlzUm93cyA/IGdldFRhcmdldEluZGV4ZXNGb3JIZWFkZXIoaGVhZGVyKSA6IHNvcnRUYXJnZXRJbmRleGVzO1xuICAgIGNvbnN0IGNvbHVtbnMgPSBpc1Jvd3MgPyBzb3J0VGFyZ2V0SW5kZXhlcyA6IGdldFRhcmdldEluZGV4ZXNGb3JIZWFkZXIoaGVhZGVyKTtcbiAgICB2YWx1ZXNNYXBbaGVhZGVyLnRpdGxlXSA9IGdldE51bWVyaWNWYWx1ZXNTdW1tYXJ5KHZhbHVlcywgcm93cywgY29sdW1ucyk7XG4gICAgcmV0dXJuIHZhbHVlc01hcDtcbiAgfSwge30pO1xufVxuXG5mdW5jdGlvbiBnZXROdW1lcmljVmFsdWVzU3VtbWFyeSh2YWx1ZXM6IGFueVtdW10sIHJvd3M6IG51bWJlcltdLCBjb2x1bW5zOiBudW1iZXJbXSk6IG51bWJlciB7XG4gIGxldCBzdW0gPSAwO1xuICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgZm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZXNbcm93XVtjb2x1bW5dO1xuICAgICAgaWYgKGlzTm90TnVsbE9yVW5kZWZpbmVkKHZhbHVlKSAmJiBpc051bWVyaWModmFsdWUpKSB7XG4gICAgICAgIHN1bSArPSB0b051bWJlcih2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBzdW07XG59XG5cbmZ1bmN0aW9uIHNvcnRWYWx1ZVRhcmdldEluZGV4ZXMoXG4gIHNvcnQ6IExtclBpdm90U29ydCxcbiAgb3RoZXJTaWRlSGVhZGVyczogTG1yUGl2b3REYXRhSGVhZGVyW10sXG4gIHZhbHVlVGl0bGVzOiBzdHJpbmdbXVxuKTogbnVtYmVyW10gfCBudWxsIHtcbiAgaWYgKHNvcnQgJiYgc29ydC5saXN0KSB7XG4gICAgbGV0IHZhbHVlSW5kZXggPSB2YWx1ZVRpdGxlcy5maW5kSW5kZXgodGl0bGUgPT4gdGl0bGUgPT09IHNvcnQubGlzdC52YWx1ZVRpdGxlKTtcbiAgICBpZiAodmFsdWVJbmRleCA9PT0gLTEpIHtcbiAgICAgIGlmICh2YWx1ZVRpdGxlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgdmFsdWVJbmRleCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgcGl2b3RIZWFkZXI6IExtclBpdm90RGF0YUhlYWRlciA9IG51bGw7XG4gICAgbGV0IGN1cnJlbnRPdGhlclNpZGVIZWFkZXJzID0gb3RoZXJTaWRlSGVhZGVycztcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNvcnQubGlzdC52YWx1ZXMgfHwgW10pIHtcbiAgICAgIGlmICh2YWx1ZS5pc1N1bW1hcnkpIHtcbiAgICAgICAgY29uc3QgaW5kZXhlcyA9IGdldFRhcmdldEluZGV4ZXNGb3JIZWFkZXJzKGN1cnJlbnRPdGhlclNpZGVIZWFkZXJzIHx8IFtdKSB8fCBbXTtcbiAgICAgICAgcmV0dXJuIGZpbHRlckluZGV4ZXNCeU1vZChpbmRleGVzLCB2YWx1ZVRpdGxlcy5sZW5ndGgsIHZhbHVlSW5kZXgpO1xuICAgICAgfVxuXG4gICAgICBwaXZvdEhlYWRlciA9IChjdXJyZW50T3RoZXJTaWRlSGVhZGVycyB8fCBbXSkuZmluZChoZWFkZXIgPT4gaGVhZGVyLnRpdGxlID09PSB2YWx1ZS50aXRsZSk7XG4gICAgICBpZiAoIXBpdm90SGVhZGVyKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50T3RoZXJTaWRlSGVhZGVycyA9IHBpdm90SGVhZGVyLmNoaWxkcmVuIHx8IFtdO1xuICAgIH1cblxuICAgIGlmIChwaXZvdEhlYWRlcikge1xuICAgICAgY29uc3QgdGFyZ2V0SW5kZXhlcyA9IGlzTm90TnVsbE9yVW5kZWZpbmVkKHBpdm90SGVhZGVyLnRhcmdldEluZGV4KVxuICAgICAgICA/IFtwaXZvdEhlYWRlci50YXJnZXRJbmRleF1cbiAgICAgICAgOiBnZXRUYXJnZXRJbmRleGVzRm9ySGVhZGVycyhjdXJyZW50T3RoZXJTaWRlSGVhZGVycyk7XG4gICAgICByZXR1cm4gZmlsdGVySW5kZXhlc0J5TW9kKHRhcmdldEluZGV4ZXMsIHZhbHVlVGl0bGVzLmxlbmd0aCwgdmFsdWVJbmRleCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGZpbHRlckluZGV4ZXNCeU1vZChpbmRleGVzOiBudW1iZXJbXSwgbW9kOiBudW1iZXIsIHZhbHVlOiBudW1iZXIpOiBudW1iZXJbXSB7XG4gIHJldHVybiAoaW5kZXhlcyB8fCBbXSkuZmlsdGVyKGluZGV4ID0+IGluZGV4ICUgbW9kID09PSB2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGRpdmlkZVZhbHVlcyh2YWx1ZTogYW55LCBkaXZpZGVyOiBhbnkpOiBudW1iZXIge1xuICBpZiAoaXNOdWxsT3JVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoaXNOdW1lcmljKHZhbHVlKSAmJiBpc051bWVyaWMoZGl2aWRlcikpIHtcbiAgICBpZiAoZGl2aWRlciAhPT0gMCkge1xuICAgICAgcmV0dXJuIHZhbHVlIC8gZGl2aWRlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iXX0=
|