@datagrok/sequence-translator 0.0.12 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -11
- package/dist/package-test.js +192 -135
- package/dist/package.js +195 -122
- package/package.json +7 -6
- package/src/defineAxolabsPattern.ts +58 -55
- package/src/package-test.ts +1 -1
- package/src/package.ts +28 -17
- package/src/structures-works/from-monomers.ts +20 -12
- package/src/structures-works/save-sense-antisense.ts +5 -2
- package/src/structures-works/sequence-codes-tools.ts +128 -45
- package/src/tests/smiles-tests.ts +31 -27
- package/{test-SequenceTranslator-c2bbc2b235db-afc0e1c5.html → test-SequenceTranslator-089b6516ed77-d62c21a9.html} +2 -2
package/dist/package.js
CHANGED
|
@@ -2483,21 +2483,21 @@ function defineAxolabsPattern() {
|
|
|
2483
2483
|
}
|
|
2484
2484
|
}
|
|
2485
2485
|
const tables = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.tableInput('Tables', datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.tables[0], datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.tables, (t) => {
|
|
2486
|
-
inputSsColumn = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.choiceInput('SS Column', '', t.columns.names(), (colName) => validateSsColumn(colName));
|
|
2486
|
+
const inputSsColumn = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.choiceInput('SS Column', '', t.columns.names(), (colName) => validateSsColumn(colName));
|
|
2487
2487
|
inputSsColumnDiv.innerHTML = '';
|
|
2488
2488
|
inputSsColumnDiv.append(inputSsColumn.root);
|
|
2489
|
-
inputAsColumn = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.choiceInput('AS Column', '', t.columns.names(), (colName) => validateAsColumn(colName));
|
|
2489
|
+
const inputAsColumn = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.choiceInput('AS Column', '', t.columns.names(), (colName) => validateAsColumn(colName));
|
|
2490
2490
|
inputAsColumnDiv.innerHTML = '';
|
|
2491
2491
|
inputAsColumnDiv.append(inputAsColumn.root);
|
|
2492
|
-
inputIdColumn = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.choiceInput('ID Column', '', t.columns.names(), (colName) => validateIdsColumn(colName));
|
|
2492
|
+
const inputIdColumn = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.choiceInput('ID Column', '', t.columns.names(), (colName) => validateIdsColumn(colName));
|
|
2493
2493
|
inputIdColumnDiv.innerHTML = '';
|
|
2494
2494
|
inputIdColumnDiv.append(inputIdColumn.root);
|
|
2495
2495
|
});
|
|
2496
|
-
|
|
2496
|
+
const inputSsColumn = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.choiceInput('SS Column', '', []);
|
|
2497
2497
|
inputSsColumnDiv.append(inputSsColumn.root);
|
|
2498
|
-
|
|
2498
|
+
const inputAsColumn = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.choiceInput('AS Column', '', []);
|
|
2499
2499
|
inputAsColumnDiv.append(inputAsColumn.root);
|
|
2500
|
-
|
|
2500
|
+
const inputIdColumn = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.choiceInput('ID Column', '', []);
|
|
2501
2501
|
inputIdColumnDiv.append(inputIdColumn.root);
|
|
2502
2502
|
updatePatternsList();
|
|
2503
2503
|
const sequenceBase = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.choiceInput('Sequence Basis', defaultBase, baseChoices, (v) => {
|
|
@@ -3280,8 +3280,8 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
3280
3280
|
|
|
3281
3281
|
|
|
3282
3282
|
|
|
3283
|
-
function sequenceToMolV3000(sequence, inverted = false, oclRender = false) {
|
|
3284
|
-
const obj = getObjectWithCodesAndSmiles(sequence);
|
|
3283
|
+
function sequenceToMolV3000(sequence, inverted = false, oclRender = false, format) {
|
|
3284
|
+
const obj = getObjectWithCodesAndSmiles(sequence, format);
|
|
3285
3285
|
let codes = sortByStringLengthInDescendingOrder(Object.keys(obj));
|
|
3286
3286
|
let i = 0;
|
|
3287
3287
|
const smilesCodes = [];
|
|
@@ -3314,8 +3314,8 @@ function sequenceToMolV3000(sequence, inverted = false, oclRender = false) {
|
|
|
3314
3314
|
}
|
|
3315
3315
|
return (0,_mol_transformations__WEBPACK_IMPORTED_MODULE_2__.getNucleotidesMol)(smilesCodes, oclRender);
|
|
3316
3316
|
}
|
|
3317
|
-
function sequenceToSmiles(sequence, inverted = false) {
|
|
3318
|
-
const obj = getObjectWithCodesAndSmiles(sequence);
|
|
3317
|
+
function sequenceToSmiles(sequence, inverted = false, format) {
|
|
3318
|
+
const obj = getObjectWithCodesAndSmiles(sequence, format);
|
|
3319
3319
|
let codes = sortByStringLengthInDescendingOrder(Object.keys(obj));
|
|
3320
3320
|
let i = 0;
|
|
3321
3321
|
let smiles = '';
|
|
@@ -3353,19 +3353,27 @@ function sequenceToSmiles(sequence, inverted = false) {
|
|
|
3353
3353
|
smiles :
|
|
3354
3354
|
smiles.slice(0, smiles.length - _map__WEBPACK_IMPORTED_MODULE_0__.stadardPhosphateLinkSmiles.length + 1);
|
|
3355
3355
|
}
|
|
3356
|
-
function getObjectWithCodesAndSmiles(sequence) {
|
|
3356
|
+
function getObjectWithCodesAndSmiles(sequence, format) {
|
|
3357
3357
|
const obj = {};
|
|
3358
|
-
|
|
3359
|
-
for (const
|
|
3360
|
-
for (const
|
|
3361
|
-
|
|
3358
|
+
if (format == null) {
|
|
3359
|
+
for (const synthesizer of Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.map)) {
|
|
3360
|
+
for (const technology of Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.map[synthesizer])) {
|
|
3361
|
+
for (const code of Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.map[synthesizer][technology]))
|
|
3362
|
+
obj[code] = _map__WEBPACK_IMPORTED_MODULE_0__.map[synthesizer][technology][code].SMILES;
|
|
3363
|
+
}
|
|
3364
|
+
}
|
|
3365
|
+
}
|
|
3366
|
+
else {
|
|
3367
|
+
for (const technology of Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.map[format])) {
|
|
3368
|
+
for (const code of Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.map[format][technology]))
|
|
3369
|
+
obj[code] = _map__WEBPACK_IMPORTED_MODULE_0__.map[format][technology][code].SMILES;
|
|
3362
3370
|
}
|
|
3363
3371
|
}
|
|
3364
3372
|
// TODO: create object based from synthesizer type to avoid key(codes) duplicates
|
|
3365
|
-
const output = (0,_sequence_codes_tools__WEBPACK_IMPORTED_MODULE_1__.isValidSequence)(sequence);
|
|
3366
|
-
if (output.synthesizer
|
|
3373
|
+
const output = (0,_sequence_codes_tools__WEBPACK_IMPORTED_MODULE_1__.isValidSequence)(sequence, format);
|
|
3374
|
+
if (output.synthesizer.includes(_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.MERMADE_12))
|
|
3367
3375
|
obj['g'] = _map__WEBPACK_IMPORTED_MODULE_0__.map[_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.MERMADE_12][_map__WEBPACK_IMPORTED_MODULE_0__.TECHNOLOGIES.SI_RNA]['g'].SMILES;
|
|
3368
|
-
else if (output.synthesizer
|
|
3376
|
+
else if (output.synthesizer.includes(_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.AXOLABS))
|
|
3369
3377
|
obj['g'] = _map__WEBPACK_IMPORTED_MODULE_0__.map[_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.AXOLABS][_map__WEBPACK_IMPORTED_MODULE_0__.TECHNOLOGIES.SI_RNA]['g'].SMILES;
|
|
3370
3378
|
return obj;
|
|
3371
3379
|
}
|
|
@@ -4355,12 +4363,16 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
4355
4363
|
/* harmony import */ var datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__);
|
|
4356
4364
|
/* harmony import */ var _structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../structures-works/from-monomers */ "./src/structures-works/from-monomers.ts");
|
|
4357
4365
|
/* harmony import */ var _structures_works_mol_transformations__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../structures-works/mol-transformations */ "./src/structures-works/mol-transformations.ts");
|
|
4366
|
+
/* harmony import */ var _structures_works_sequence_codes_tools__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../structures-works/sequence-codes-tools */ "./src/structures-works/sequence-codes-tools.ts");
|
|
4367
|
+
|
|
4358
4368
|
|
|
4359
4369
|
|
|
4360
4370
|
|
|
4361
4371
|
function saveSdf(as, ss, oneEntity, fit3dx) {
|
|
4362
|
-
const
|
|
4363
|
-
const
|
|
4372
|
+
const formatAs = (0,_structures_works_sequence_codes_tools__WEBPACK_IMPORTED_MODULE_3__.getFormat)(as);
|
|
4373
|
+
const formatSs = (0,_structures_works_sequence_codes_tools__WEBPACK_IMPORTED_MODULE_3__.getFormat)(ss);
|
|
4374
|
+
const molSS = (0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToMolV3000)(ss, false, false, formatSs);
|
|
4375
|
+
const molAS = (0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToMolV3000)(as, true, false, formatAs);
|
|
4364
4376
|
let result;
|
|
4365
4377
|
if (oneEntity)
|
|
4366
4378
|
result = (0,_structures_works_mol_transformations__WEBPACK_IMPORTED_MODULE_2__.linkV3000)([molSS, molAS], true, !fit3dx) + '\n\n$$$$\n';
|
|
@@ -4414,36 +4426,92 @@ function saveSenseAntiSense() {
|
|
|
4414
4426
|
__webpack_require__.r(__webpack_exports__);
|
|
4415
4427
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
4416
4428
|
/* harmony export */ "undefinedInputSequence": () => (/* binding */ undefinedInputSequence),
|
|
4429
|
+
/* harmony export */ "getFormat": () => (/* binding */ getFormat),
|
|
4417
4430
|
/* harmony export */ "isValidSequence": () => (/* binding */ isValidSequence),
|
|
4418
4431
|
/* harmony export */ "convertSequence": () => (/* binding */ convertSequence)
|
|
4419
4432
|
/* harmony export */ });
|
|
4420
|
-
/* harmony import */ var
|
|
4421
|
-
/* harmony import */ var
|
|
4422
|
-
|
|
4423
|
-
|
|
4424
|
-
/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./map */ "./src/structures-works/map.ts");
|
|
4425
|
-
/* harmony import */ var _converters__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./converters */ "./src/structures-works/converters.ts");
|
|
4426
|
-
|
|
4427
|
-
|
|
4433
|
+
/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./map */ "./src/structures-works/map.ts");
|
|
4434
|
+
/* harmony import */ var _converters__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./converters */ "./src/structures-works/converters.ts");
|
|
4435
|
+
// import * as grok from 'datagrok-api/grok';
|
|
4436
|
+
// import * as ui from 'datagrok-api/ui';
|
|
4428
4437
|
// import * as DG from 'datagrok-api/dg';
|
|
4429
4438
|
|
|
4430
4439
|
|
|
4431
4440
|
const noTranslationTableAvailable = 'No translation table available';
|
|
4432
4441
|
const undefinedInputSequence = 'Type of input sequence is undefined';
|
|
4433
|
-
function
|
|
4434
|
-
|
|
4435
|
-
if (possibleSynthesizers.length
|
|
4436
|
-
|
|
4437
|
-
|
|
4438
|
-
|
|
4439
|
-
|
|
4440
|
-
|
|
4441
|
-
|
|
4442
|
-
|
|
4443
|
-
|
|
4444
|
-
|
|
4445
|
-
|
|
4446
|
-
|
|
4442
|
+
function getFormat(sequence) {
|
|
4443
|
+
const possibleSynthesizers = getListOfPossibleSynthesizersByFirstMatchedCode(sequence);
|
|
4444
|
+
if (possibleSynthesizers.length == 0)
|
|
4445
|
+
return null;
|
|
4446
|
+
let outputIndex = 0;
|
|
4447
|
+
const firstUniqueCharacters = ['r', 'd'];
|
|
4448
|
+
const nucleotides = ['A', 'U', 'T', 'C', 'G'];
|
|
4449
|
+
possibleSynthesizers.forEach((synthesizer) => {
|
|
4450
|
+
const codes = getAllCodesOfSynthesizer(synthesizer);
|
|
4451
|
+
while (outputIndex < sequence.length) {
|
|
4452
|
+
const matchedCode = codes.find((c) => c == sequence.slice(outputIndex, outputIndex + c.length));
|
|
4453
|
+
if (matchedCode == null)
|
|
4454
|
+
break;
|
|
4455
|
+
if ( // for mistake pattern 'rAA'
|
|
4456
|
+
outputIndex > 1 &&
|
|
4457
|
+
nucleotides.includes(sequence[outputIndex]) &&
|
|
4458
|
+
firstUniqueCharacters.includes(sequence[outputIndex - 2]))
|
|
4459
|
+
break;
|
|
4460
|
+
if ( // for mistake pattern 'ArA'
|
|
4461
|
+
firstUniqueCharacters.includes(sequence[outputIndex + 1]) &&
|
|
4462
|
+
nucleotides.includes(sequence[outputIndex])) {
|
|
4463
|
+
outputIndex++;
|
|
4464
|
+
break;
|
|
4465
|
+
}
|
|
4466
|
+
outputIndex += matchedCode.length;
|
|
4467
|
+
}
|
|
4468
|
+
});
|
|
4469
|
+
const indexOfFirstNotValidChar = (outputIndex == sequence.length) ? -1 : outputIndex;
|
|
4470
|
+
if (indexOfFirstNotValidChar != -1)
|
|
4471
|
+
return possibleSynthesizers[0];
|
|
4472
|
+
const possibleTechnologies = getListOfPossibleTechnologiesByFirstMatchedCode(sequence, possibleSynthesizers[0]);
|
|
4473
|
+
if (possibleTechnologies.length == 0)
|
|
4474
|
+
return null;
|
|
4475
|
+
outputIndex = 0;
|
|
4476
|
+
possibleTechnologies.forEach((technology) => {
|
|
4477
|
+
const codes = Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.map[possibleSynthesizers[0]][technology]);
|
|
4478
|
+
while (outputIndex < sequence.length) {
|
|
4479
|
+
const matchedCode = codes.find((c) => c == sequence.slice(outputIndex, outputIndex + c.length));
|
|
4480
|
+
if (matchedCode == null)
|
|
4481
|
+
break;
|
|
4482
|
+
if ( // for mistake pattern 'rAA'
|
|
4483
|
+
outputIndex > 1 &&
|
|
4484
|
+
nucleotides.includes(sequence[outputIndex]) &&
|
|
4485
|
+
firstUniqueCharacters.includes(sequence[outputIndex - 2]))
|
|
4486
|
+
break;
|
|
4487
|
+
if ( // for mistake pattern 'ArA'
|
|
4488
|
+
firstUniqueCharacters.includes(sequence[outputIndex + 1]) &&
|
|
4489
|
+
nucleotides.includes(sequence[outputIndex])) {
|
|
4490
|
+
outputIndex++;
|
|
4491
|
+
break;
|
|
4492
|
+
}
|
|
4493
|
+
outputIndex += matchedCode.length;
|
|
4494
|
+
}
|
|
4495
|
+
});
|
|
4496
|
+
return possibleSynthesizers[0];
|
|
4497
|
+
}
|
|
4498
|
+
function isValidSequence(sequence, format) {
|
|
4499
|
+
const possibleSynthesizers = format == null ?
|
|
4500
|
+
getListOfPossibleSynthesizersByFirstMatchedCode(sequence) :
|
|
4501
|
+
[format];
|
|
4502
|
+
// if (possibleSynthesizers.length > 1) {
|
|
4503
|
+
// const synthesizer = ui.choiceInput('Choose synthesizer from list: ', possibleSynthesizers[0],
|
|
4504
|
+
// possibleSynthesizers);
|
|
4505
|
+
// ui.dialog('Choose Synthesizer')
|
|
4506
|
+
// .add(ui.panel([synthesizer.root], {style: {fontWeight: 'bold'}}))
|
|
4507
|
+
// .onOK(() => possibleSynthesizers = [synthesizer.value])
|
|
4508
|
+
// .onCancel(() => {
|
|
4509
|
+
// possibleSynthesizers = [possibleSynthesizers[0]];
|
|
4510
|
+
// grok.shell.warning('Input sequence is expected to be in format ' + possibleSynthesizers[0]);
|
|
4511
|
+
// })
|
|
4512
|
+
// .show();
|
|
4513
|
+
// } else if (possibleSynthesizers.length == 0)
|
|
4514
|
+
if (possibleSynthesizers.length == 0)
|
|
4447
4515
|
return { indexOfFirstNotValidChar: 0, synthesizer: null, technology: null };
|
|
4448
4516
|
let outputIndex = 0;
|
|
4449
4517
|
const firstUniqueCharacters = ['r', 'd'];
|
|
@@ -4472,27 +4540,28 @@ function isValidSequence(sequence) {
|
|
|
4472
4540
|
if (indexOfFirstNotValidChar != -1) {
|
|
4473
4541
|
return {
|
|
4474
4542
|
indexOfFirstNotValidChar: indexOfFirstNotValidChar,
|
|
4475
|
-
synthesizer: possibleSynthesizers
|
|
4543
|
+
synthesizer: possibleSynthesizers,
|
|
4476
4544
|
technology: null,
|
|
4477
4545
|
};
|
|
4478
4546
|
}
|
|
4479
|
-
|
|
4480
|
-
if (possibleTechnologies.length > 1) {
|
|
4481
|
-
|
|
4482
|
-
|
|
4483
|
-
|
|
4484
|
-
|
|
4485
|
-
|
|
4486
|
-
|
|
4487
|
-
|
|
4488
|
-
|
|
4489
|
-
|
|
4490
|
-
|
|
4491
|
-
else if (possibleTechnologies.length == 0)
|
|
4547
|
+
const possibleTechnologies = getListOfPossibleTechnologiesByFirstMatchedCode(sequence, possibleSynthesizers[0]);
|
|
4548
|
+
// if (possibleTechnologies.length > 1) {
|
|
4549
|
+
// const technology = ui.choiceInput('Choose technology from list: ', possibleTechnologies[0],
|
|
4550
|
+
// possibleTechnologies);
|
|
4551
|
+
// ui.dialog('Choose Technology')
|
|
4552
|
+
// .add(ui.panel([technology.root], {style: {fontWeight: 'bold'}}))
|
|
4553
|
+
// .onOK(() => possibleTechnologies = [technology.value])
|
|
4554
|
+
// .onCancel(() => {
|
|
4555
|
+
// possibleTechnologies = [possibleTechnologies[0]];
|
|
4556
|
+
// grok.shell.warning('Input sequence is expected to be in format ' + possibleTechnologies[0]);
|
|
4557
|
+
// })
|
|
4558
|
+
// .show();
|
|
4559
|
+
// } else if (possibleTechnologies.length == 0)
|
|
4560
|
+
if (possibleTechnologies.length == 0)
|
|
4492
4561
|
return { indexOfFirstNotValidChar: 0, synthesizer: null, technology: null };
|
|
4493
4562
|
outputIndex = 0;
|
|
4494
4563
|
possibleTechnologies.forEach((technology) => {
|
|
4495
|
-
const codes = Object.keys(
|
|
4564
|
+
const codes = Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.map[possibleSynthesizers[0]][technology]);
|
|
4496
4565
|
while (outputIndex < sequence.length) {
|
|
4497
4566
|
const matchedCode = codes.find((c) => c == sequence.slice(outputIndex, outputIndex + c.length));
|
|
4498
4567
|
if (matchedCode == null)
|
|
@@ -4513,19 +4582,19 @@ function isValidSequence(sequence) {
|
|
|
4513
4582
|
});
|
|
4514
4583
|
return {
|
|
4515
4584
|
indexOfFirstNotValidChar: indexOfFirstNotValidChar,
|
|
4516
|
-
synthesizer: possibleSynthesizers
|
|
4517
|
-
technology: possibleTechnologies[outputIndex],
|
|
4585
|
+
synthesizer: possibleSynthesizers,
|
|
4586
|
+
technology: [possibleTechnologies[outputIndex]],
|
|
4518
4587
|
};
|
|
4519
4588
|
}
|
|
4520
4589
|
function getAllCodesOfSynthesizer(synthesizer) {
|
|
4521
4590
|
let codes = [];
|
|
4522
|
-
for (const technology of Object.keys(
|
|
4523
|
-
codes = codes.concat(Object.keys(
|
|
4524
|
-
return codes.concat(Object.keys(
|
|
4591
|
+
for (const technology of Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.map[synthesizer]))
|
|
4592
|
+
codes = codes.concat(Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.map[synthesizer][technology]));
|
|
4593
|
+
return codes.concat(Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.MODIFICATIONS));
|
|
4525
4594
|
}
|
|
4526
4595
|
function getListOfPossibleSynthesizersByFirstMatchedCode(sequence) {
|
|
4527
4596
|
const synthesizers = [];
|
|
4528
|
-
Object.keys(
|
|
4597
|
+
Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.map).forEach((synthesizer) => {
|
|
4529
4598
|
const codes = getAllCodesOfSynthesizer(synthesizer);
|
|
4530
4599
|
//TODO: get first non-dropdown code when there are two modifications
|
|
4531
4600
|
let start = 0;
|
|
@@ -4542,8 +4611,8 @@ function getListOfPossibleSynthesizersByFirstMatchedCode(sequence) {
|
|
|
4542
4611
|
}
|
|
4543
4612
|
function getListOfPossibleTechnologiesByFirstMatchedCode(sequence, synthesizer) {
|
|
4544
4613
|
const technologies = [];
|
|
4545
|
-
Object.keys(
|
|
4546
|
-
const codes = Object.keys(
|
|
4614
|
+
Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.map[synthesizer]).forEach((technology) => {
|
|
4615
|
+
const codes = Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.map[synthesizer][technology]).concat(Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.MODIFICATIONS));
|
|
4547
4616
|
if (codes.some((s) => s == sequence.slice(0, s.length)))
|
|
4548
4617
|
technologies.push(technology);
|
|
4549
4618
|
});
|
|
@@ -4557,79 +4626,79 @@ function convertSequence(sequence, output) {
|
|
|
4557
4626
|
Error: undefinedInputSequence,
|
|
4558
4627
|
};
|
|
4559
4628
|
}
|
|
4560
|
-
if (output.synthesizer
|
|
4629
|
+
if (output.synthesizer.includes(_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.RAW_NUCLEOTIDES)) { //&& output.technology!.includes(TECHNOLOGIES.DNA)) {
|
|
4561
4630
|
return {
|
|
4562
|
-
type:
|
|
4631
|
+
type: _map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.RAW_NUCLEOTIDES,
|
|
4563
4632
|
Nucleotides: sequence,
|
|
4564
|
-
BioSpring: (0,
|
|
4565
|
-
GCRS: (0,
|
|
4633
|
+
BioSpring: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.asoGapmersNucleotidesToBioSpring)(sequence),
|
|
4634
|
+
GCRS: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.asoGapmersNucleotidesToGcrs)(sequence),
|
|
4566
4635
|
};
|
|
4567
4636
|
}
|
|
4568
|
-
if (output.synthesizer
|
|
4637
|
+
if (output.synthesizer.includes(_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.BIOSPRING) && output.technology.includes(_map__WEBPACK_IMPORTED_MODULE_0__.TECHNOLOGIES.ASO_GAPMERS)) {
|
|
4569
4638
|
return {
|
|
4570
|
-
type:
|
|
4571
|
-
Nucleotides: (0,
|
|
4639
|
+
type: _map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.BIOSPRING + ' ' + _map__WEBPACK_IMPORTED_MODULE_0__.TECHNOLOGIES.ASO_GAPMERS,
|
|
4640
|
+
Nucleotides: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.asoGapmersBioSpringToNucleotides)(sequence),
|
|
4572
4641
|
BioSpring: sequence,
|
|
4573
|
-
GCRS: (0,
|
|
4642
|
+
GCRS: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.asoGapmersBioSpringToGcrs)(sequence),
|
|
4574
4643
|
};
|
|
4575
4644
|
}
|
|
4576
|
-
if (output.synthesizer
|
|
4645
|
+
if (output.synthesizer.includes(_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.GCRS) && output.technology.includes(_map__WEBPACK_IMPORTED_MODULE_0__.TECHNOLOGIES.ASO_GAPMERS)) {
|
|
4577
4646
|
return {
|
|
4578
|
-
type:
|
|
4579
|
-
Nucleotides: (0,
|
|
4580
|
-
BioSpring: (0,
|
|
4581
|
-
Mermade12: (0,
|
|
4647
|
+
type: _map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.GCRS + ' ' + _map__WEBPACK_IMPORTED_MODULE_0__.TECHNOLOGIES.ASO_GAPMERS,
|
|
4648
|
+
Nucleotides: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.asoGapmersGcrsToNucleotides)(sequence),
|
|
4649
|
+
BioSpring: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.asoGapmersGcrsToBioSpring)(sequence),
|
|
4650
|
+
Mermade12: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.gcrsToMermade12)(sequence),
|
|
4582
4651
|
GCRS: sequence,
|
|
4583
4652
|
};
|
|
4584
4653
|
}
|
|
4585
|
-
if (output.synthesizer
|
|
4654
|
+
if (output.synthesizer.includes(_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.RAW_NUCLEOTIDES) && output.technology.includes(_map__WEBPACK_IMPORTED_MODULE_0__.TECHNOLOGIES.RNA)) {
|
|
4586
4655
|
return {
|
|
4587
|
-
type:
|
|
4656
|
+
type: _map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.RAW_NUCLEOTIDES + ' ' + _map__WEBPACK_IMPORTED_MODULE_0__.TECHNOLOGIES.RNA,
|
|
4588
4657
|
Nucleotides: sequence,
|
|
4589
|
-
BioSpring: (0,
|
|
4590
|
-
Axolabs: (0,
|
|
4591
|
-
GCRS: (0,
|
|
4658
|
+
BioSpring: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaNucleotideToBioSpringSenseStrand)(sequence),
|
|
4659
|
+
Axolabs: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaNucleotideToAxolabsSenseStrand)(sequence),
|
|
4660
|
+
GCRS: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaNucleotidesToGcrs)(sequence),
|
|
4592
4661
|
};
|
|
4593
4662
|
}
|
|
4594
|
-
if (output.synthesizer
|
|
4663
|
+
if (output.synthesizer.includes(_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.BIOSPRING) && output.technology.includes(_map__WEBPACK_IMPORTED_MODULE_0__.TECHNOLOGIES.SI_RNA)) {
|
|
4595
4664
|
return {
|
|
4596
|
-
type:
|
|
4597
|
-
Nucleotides: (0,
|
|
4665
|
+
type: _map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.BIOSPRING + ' ' + _map__WEBPACK_IMPORTED_MODULE_0__.TECHNOLOGIES.SI_RNA,
|
|
4666
|
+
Nucleotides: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaBioSpringToNucleotides)(sequence),
|
|
4598
4667
|
BioSpring: sequence,
|
|
4599
|
-
Axolabs: (0,
|
|
4600
|
-
GCRS: (0,
|
|
4668
|
+
Axolabs: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaBioSpringToAxolabs)(sequence),
|
|
4669
|
+
GCRS: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaBioSpringToGcrs)(sequence),
|
|
4601
4670
|
};
|
|
4602
4671
|
}
|
|
4603
|
-
if (output.synthesizer
|
|
4672
|
+
if (output.synthesizer.includes(_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.AXOLABS)) {
|
|
4604
4673
|
return {
|
|
4605
|
-
type:
|
|
4606
|
-
Nucleotides: (0,
|
|
4607
|
-
BioSpring: (0,
|
|
4674
|
+
type: _map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.AXOLABS + ' ' + _map__WEBPACK_IMPORTED_MODULE_0__.TECHNOLOGIES.SI_RNA,
|
|
4675
|
+
Nucleotides: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaAxolabsToNucleotides)(sequence),
|
|
4676
|
+
BioSpring: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaAxolabsToBioSpring)(sequence),
|
|
4608
4677
|
Axolabs: sequence,
|
|
4609
|
-
GCRS: (0,
|
|
4678
|
+
GCRS: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaAxolabsToGcrs)(sequence),
|
|
4610
4679
|
};
|
|
4611
4680
|
}
|
|
4612
|
-
if (output.synthesizer
|
|
4681
|
+
if (output.synthesizer.includes(_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.GCRS) && output.technology.includes(_map__WEBPACK_IMPORTED_MODULE_0__.TECHNOLOGIES.SI_RNA)) {
|
|
4613
4682
|
return {
|
|
4614
|
-
type:
|
|
4615
|
-
Nucleotides: (0,
|
|
4616
|
-
BioSpring: (0,
|
|
4617
|
-
Axolabs: (0,
|
|
4618
|
-
MM12: (0,
|
|
4683
|
+
type: _map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.GCRS + ' ' + _map__WEBPACK_IMPORTED_MODULE_0__.TECHNOLOGIES.SI_RNA,
|
|
4684
|
+
Nucleotides: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaGcrsToNucleotides)(sequence),
|
|
4685
|
+
BioSpring: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaGcrsToBioSpring)(sequence),
|
|
4686
|
+
Axolabs: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaGcrsToAxolabs)(sequence),
|
|
4687
|
+
MM12: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.gcrsToMermade12)(sequence),
|
|
4619
4688
|
GCRS: sequence,
|
|
4620
4689
|
};
|
|
4621
4690
|
}
|
|
4622
|
-
if (output.synthesizer
|
|
4691
|
+
if (output.synthesizer.includes(_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.GCRS)) {
|
|
4623
4692
|
return {
|
|
4624
|
-
type:
|
|
4625
|
-
Nucleotides: (0,
|
|
4693
|
+
type: _map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.GCRS,
|
|
4694
|
+
Nucleotides: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.gcrsToNucleotides)(sequence),
|
|
4626
4695
|
GCRS: sequence,
|
|
4627
|
-
Mermade12: (0,
|
|
4696
|
+
Mermade12: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.gcrsToMermade12)(sequence),
|
|
4628
4697
|
};
|
|
4629
4698
|
}
|
|
4630
|
-
if (output.synthesizer
|
|
4699
|
+
if (output.synthesizer.includes(_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.MERMADE_12)) {
|
|
4631
4700
|
return {
|
|
4632
|
-
type:
|
|
4701
|
+
type: _map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.MERMADE_12,
|
|
4633
4702
|
Nucleotides: noTranslationTableAvailable,
|
|
4634
4703
|
GCRS: noTranslationTableAvailable,
|
|
4635
4704
|
Mermade12: sequence,
|
|
@@ -4844,14 +4913,17 @@ function sequenceTranslator() {
|
|
|
4844
4913
|
windows.showProperties = false;
|
|
4845
4914
|
windows.showToolbox = false;
|
|
4846
4915
|
windows.showHelp = false;
|
|
4847
|
-
function updateTableAndMolecule(sequence) {
|
|
4916
|
+
function updateTableAndMolecule(sequence, inputFormat, isSet) {
|
|
4848
4917
|
moleculeSvgDiv.innerHTML = '';
|
|
4849
4918
|
outputTableDiv.innerHTML = '';
|
|
4850
4919
|
const pi = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.TaskBarProgressIndicator.create('Rendering table and molecule...');
|
|
4851
4920
|
let errorsExist = false;
|
|
4852
4921
|
try {
|
|
4853
4922
|
sequence = sequence.replace(/\s/g, '');
|
|
4854
|
-
const output = (0,_structures_works_sequence_codes_tools__WEBPACK_IMPORTED_MODULE_8__.isValidSequence)(sequence);
|
|
4923
|
+
const output = (0,_structures_works_sequence_codes_tools__WEBPACK_IMPORTED_MODULE_8__.isValidSequence)(sequence, null);
|
|
4924
|
+
if (isSet)
|
|
4925
|
+
output.synthesizer = [inputFormat];
|
|
4926
|
+
inputFormatChoiceInput.value = output.synthesizer[0];
|
|
4855
4927
|
const outputSequenceObj = (0,_structures_works_sequence_codes_tools__WEBPACK_IMPORTED_MODULE_8__.convertSequence)(sequence, output);
|
|
4856
4928
|
const tableRows = [];
|
|
4857
4929
|
for (const key of Object.keys(outputSequenceObj).slice(1)) {
|
|
@@ -4894,12 +4966,11 @@ function sequenceTranslator() {
|
|
|
4894
4966
|
outputTableDiv.append(datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.div([
|
|
4895
4967
|
datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.HtmlTable.create(tableRows, (item) => [item.key, item.value], ['Code', 'Sequence']).root,
|
|
4896
4968
|
]));
|
|
4897
|
-
semTypeOfInputSequence.textContent = 'Detected input type: ' + outputSequenceObj.type;
|
|
4898
4969
|
if (outputSequenceObj.type != _structures_works_sequence_codes_tools__WEBPACK_IMPORTED_MODULE_8__.undefinedInputSequence && outputSequenceObj.Error != _structures_works_sequence_codes_tools__WEBPACK_IMPORTED_MODULE_8__.undefinedInputSequence) {
|
|
4899
4970
|
const canvas = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.canvas(300, 170);
|
|
4900
4971
|
canvas.addEventListener('click', () => {
|
|
4901
4972
|
const canv = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.canvas(cash_dom__WEBPACK_IMPORTED_MODULE_4___default()(window).width(), cash_dom__WEBPACK_IMPORTED_MODULE_4___default()(window).height());
|
|
4902
|
-
const mol = (0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_7__.sequenceToMolV3000)(inputSequenceField.value.replace(/\s/g, ''), false, true);
|
|
4973
|
+
const mol = (0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_7__.sequenceToMolV3000)(inputSequenceField.value.replace(/\s/g, ''), false, true, output.synthesizer[0]);
|
|
4903
4974
|
// @ts-ignore
|
|
4904
4975
|
openchemlib_full_js__WEBPACK_IMPORTED_MODULE_3__.StructureView.drawMolecule(canv, openchemlib_full_js__WEBPACK_IMPORTED_MODULE_3__.Molecule.fromMolfile(mol), { suppressChiralText: true });
|
|
4905
4976
|
datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.dialog('Molecule: ' + inputSequenceField.value)
|
|
@@ -4908,7 +4979,7 @@ function sequenceTranslator() {
|
|
|
4908
4979
|
});
|
|
4909
4980
|
cash_dom__WEBPACK_IMPORTED_MODULE_4___default()(canvas).on('mouseover', () => cash_dom__WEBPACK_IMPORTED_MODULE_4___default()(canvas).css('cursor', 'zoom-in'));
|
|
4910
4981
|
cash_dom__WEBPACK_IMPORTED_MODULE_4___default()(canvas).on('mouseout', () => cash_dom__WEBPACK_IMPORTED_MODULE_4___default()(canvas).css('cursor', 'default'));
|
|
4911
|
-
const mol = (0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_7__.sequenceToMolV3000)(inputSequenceField.value.replace(/\s/g, ''), false, true);
|
|
4982
|
+
const mol = (0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_7__.sequenceToMolV3000)(inputSequenceField.value.replace(/\s/g, ''), false, true, output.synthesizer[0]);
|
|
4912
4983
|
// @ts-ignore
|
|
4913
4984
|
openchemlib_full_js__WEBPACK_IMPORTED_MODULE_3__.StructureView.drawMolecule(canvas, openchemlib_full_js__WEBPACK_IMPORTED_MODULE_3__.Molecule.fromMolfile(mol), { suppressChiralText: true });
|
|
4914
4985
|
moleculeSvgDiv.append(canvas);
|
|
@@ -4920,10 +4991,12 @@ function sequenceTranslator() {
|
|
|
4920
4991
|
pi.close();
|
|
4921
4992
|
}
|
|
4922
4993
|
}
|
|
4923
|
-
const
|
|
4994
|
+
const inputFormatChoiceInput = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.choiceInput('Input format: ', 'Janssen GCRS Codes', Object.keys(_structures_works_map__WEBPACK_IMPORTED_MODULE_9__.map), (format) => {
|
|
4995
|
+
updateTableAndMolecule(inputSequenceField.value.replace(/\s/g, ''), format, true);
|
|
4996
|
+
});
|
|
4924
4997
|
const moleculeSvgDiv = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.block([]);
|
|
4925
4998
|
const outputTableDiv = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.div([]);
|
|
4926
|
-
const inputSequenceField = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.textInput('', defaultInput, (sequence) => updateTableAndMolecule(sequence));
|
|
4999
|
+
const inputSequenceField = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.textInput('', defaultInput, (sequence) => updateTableAndMolecule(sequence, inputFormatChoiceInput.value, false));
|
|
4927
5000
|
const asoDf = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.DataFrame.fromObjects([
|
|
4928
5001
|
{ 'Name': '2\'MOE-5Me-rU', 'BioSpring': '5', 'Janssen GCRS': 'moeT' },
|
|
4929
5002
|
{ 'Name': '2\'MOE-rA', 'BioSpring': '6', 'Janssen GCRS': 'moeA' },
|
|
@@ -4955,11 +5028,10 @@ function sequenceTranslator() {
|
|
|
4955
5028
|
{ 'Name': '2\'OMe-rG', 'BioSpring': '8', 'Axolabs': 'g', 'Janssen GCRS': 'mG' },
|
|
4956
5029
|
{ 'Name': 'ps linkage', 'BioSpring': '*', 'Axolabs': 's', 'Janssen GCRS': 'ps' },
|
|
4957
5030
|
]), { showRowHeader: false, showCellTooltip: false });
|
|
4958
|
-
const overhangModificationsGrid = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.Viewer.grid(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.DataFrame.
|
|
4959
|
-
|
|
4960
|
-
{ 'Name': '(GalNAc-2-JNJ)' },
|
|
5031
|
+
const overhangModificationsGrid = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.Viewer.grid(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.DataFrame.fromColumns([
|
|
5032
|
+
datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.Column.fromStrings('Name', Object.keys(_structures_works_map__WEBPACK_IMPORTED_MODULE_9__.MODIFICATIONS)),
|
|
4961
5033
|
]), { showRowHeader: false, showCellTooltip: false });
|
|
4962
|
-
updateTableAndMolecule(defaultInput);
|
|
5034
|
+
updateTableAndMolecule(defaultInput, inputFormatChoiceInput.value, true);
|
|
4963
5035
|
const appMainDescription = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.info([
|
|
4964
5036
|
datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.divText('How to convert one sequence:', { style: { 'font-weight': 'bolder' } }),
|
|
4965
5037
|
datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.divText('Paste sequence into the text field below'),
|
|
@@ -4987,7 +5059,7 @@ function sequenceTranslator() {
|
|
|
4987
5059
|
inputSequenceField.root,
|
|
4988
5060
|
], 'input-base'),
|
|
4989
5061
|
], 'inputSequence'),
|
|
4990
|
-
|
|
5062
|
+
datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.div([inputFormatChoiceInput], { style: { padding: '5px 0' } }),
|
|
4991
5063
|
datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.block([
|
|
4992
5064
|
datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.h1('Output'),
|
|
4993
5065
|
outputTableDiv,
|
|
@@ -5007,14 +5079,14 @@ function sequenceTranslator() {
|
|
|
5007
5079
|
cash_dom__WEBPACK_IMPORTED_MODULE_4___default()(codesTablesDiv).hide());
|
|
5008
5080
|
const topPanel = [
|
|
5009
5081
|
datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.iconFA('download', () => {
|
|
5010
|
-
const result = (0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_7__.sequenceToMolV3000)(inputSequenceField.value.replace(/\s/g, ''));
|
|
5082
|
+
const result = (0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_7__.sequenceToMolV3000)(inputSequenceField.value.replace(/\s/g, ''), false, false, inputFormatChoiceInput.value);
|
|
5011
5083
|
const element = document.createElement('a');
|
|
5012
5084
|
element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(result));
|
|
5013
5085
|
element.setAttribute('download', inputSequenceField.value.replace(/\s/g, '') + '.mol');
|
|
5014
5086
|
element.click();
|
|
5015
5087
|
}, 'Save .mol file'),
|
|
5016
5088
|
datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.iconFA('copy', () => {
|
|
5017
|
-
navigator.clipboard.writeText((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_7__.sequenceToSmiles)(inputSequenceField.value.replace(/\s/g, '')))
|
|
5089
|
+
navigator.clipboard.writeText((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_7__.sequenceToSmiles)(inputSequenceField.value.replace(/\s/g, ''), false, inputFormatChoiceInput.value))
|
|
5018
5090
|
.then(() => datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.info(sequenceWasCopied));
|
|
5019
5091
|
}, 'Copy SMILES'),
|
|
5020
5092
|
switchInput.root,
|
|
@@ -5033,9 +5105,10 @@ function saveTableAsSdFile(table) {
|
|
|
5033
5105
|
const typeColumn = table.col(_structures_works_map__WEBPACK_IMPORTED_MODULE_9__.COL_NAMES.TYPE);
|
|
5034
5106
|
let result = '';
|
|
5035
5107
|
for (let i = 0; i < table.rowCount; i++) {
|
|
5108
|
+
const format = (0,_structures_works_sequence_codes_tools__WEBPACK_IMPORTED_MODULE_8__.getFormat)(structureColumn.get(i));
|
|
5036
5109
|
result += (typeColumn.get(i) == 'SS') ?
|
|
5037
|
-
(0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_7__.sequenceToMolV3000)(structureColumn.get(i), false, true) + '\n' + `> <Sequence>\nSense Strand\n\n` :
|
|
5038
|
-
(0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_7__.sequenceToMolV3000)(structureColumn.get(i), true, true) + '\n' + `> <Sequence>\nAnti Sense\n\n`;
|
|
5110
|
+
(0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_7__.sequenceToMolV3000)(structureColumn.get(i), false, true, format) + '\n' + `> <Sequence>\nSense Strand\n\n` :
|
|
5111
|
+
(0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_7__.sequenceToMolV3000)(structureColumn.get(i), true, true, format) + '\n' + `> <Sequence>\nAnti Sense\n\n`;
|
|
5039
5112
|
for (const col of table.columns) {
|
|
5040
5113
|
if (col.name != _structures_works_map__WEBPACK_IMPORTED_MODULE_9__.COL_NAMES.SEQUENCE)
|
|
5041
5114
|
result += `> <${col.name}>\n${col.get(i)}\n\n`;
|
|
@@ -5148,4 +5221,4 @@ function oligoSdFile(table) {
|
|
|
5148
5221
|
sequencetranslator = __webpack_exports__;
|
|
5149
5222
|
/******/ })()
|
|
5150
5223
|
;
|
|
5151
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQ0FBa0MsT0FBTztBQUN6QztBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7O0FBRUEsMkJBQTJCOztBQUUzQjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxzQkFBc0I7QUFDdEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxnQkFBZ0I7O0FBRWhCO0FBQ0E7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsQ0FBQyxHQUFHO0FBQ0o7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELDhFQUE4RTs7QUFFOUU7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDLEVBQUU7QUFDRjtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSx3RkFBd0Y7O0FBRXhGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4QkFBOEI7QUFDOUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7O0FBRXZDOztBQUVBLHdDQUF3QztBQUN4Qzs7QUFFQTtBQUNBLEdBQUc7QUFDSCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxHQUFHO0FBQ0g7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVB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QUFDQSxhQUFhO0FBQ2I7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQ0FBMEM7QUFDMUM7QUFDQSxnREFBZ0Q7QUFDaEQsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0EsK0NBQStDO0FBQy9DLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQzViTTtBQUNQO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNGTztBQUNQO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNGQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7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O0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNi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RUFBYyxFQUFFLGtFQUFlLEVBQUUsaUVBQWMsRUFBRSxtRUFBZ0IsRUFBRSxnRUFBYSxFQUFFLGdFQUFhO0FBQ3BIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBLElBQUksc0VBQTRCO0FBQ2hDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vbm9kZV9tb2R1bGVzL2Nhc2gtZG9tL2Rpc3QvY2FzaC5qcyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9ub2RlX21vZHVsZXMvc2F2ZS1zdmctYXMtcG5nL2xpYi9zYXZlU3ZnQXNQbmcuanMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL0lDRHMudHMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL0lEUHMudHMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL2F4b2xhYnNNYXAudHMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL2RlZmluZUF4b2xhYnNQYXR0ZXJuLnRzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL3NyYy9kcmF3QXhvbGFic1BhdHRlcm4udHMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL3NhbHRzLnRzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL3NyYy9zb3VyY2VzLnRzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL3NyYy9zdHJ1Y3R1cmVzLXdvcmtzL2NvbnZlcnRlcnMudHMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL3N0cnVjdHVyZXMtd29ya3MvZnJvbS1tb25vbWVycy50cyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9zcmMvc3RydWN0dXJlcy13b3Jrcy9tYXAudHMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL3N0cnVjdHVyZXMtd29ya3MvbW9sLXRyYW5zZm9ybWF0aW9ucy50cyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9zcmMvc3RydWN0dXJlcy13b3Jrcy9zYXZlLXNlbnNlLWFudGlzZW5zZS50cyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9zcmMvc3RydWN0dXJlcy13b3Jrcy9zZXF1ZW5jZS1jb2Rlcy10b29scy50cyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9zcmMvdXNlcnMudHMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yL2V4dGVybmFsIHZhciBcIkRHXCIiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yL2V4dGVybmFsIHZhciBcIk9DTFwiIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci9leHRlcm5hbCB2YXIgXCJncm9rXCIiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yL2V4dGVybmFsIHZhciBcInVpXCIiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3Ivd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL3NyYy9wYWNrYWdlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIE1JVCBodHRwczovL2dpdGh1Yi5jb20vZmFiaW9zcGFtcGluYXRvL2Nhc2ggKi9cbihmdW5jdGlvbigpe1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBwcm9wTWFwID0ge1xuICAvKiBHRU5FUkFMICovXG4gIFwiY2xhc3NcIjogJ2NsYXNzTmFtZScsXG4gIGNvbnRlbnRlZGl0YWJsZTogJ2NvbnRlbnRFZGl0YWJsZScsXG5cbiAgLyogTEFCRUwgKi9cbiAgXCJmb3JcIjogJ2h0bWxGb3InLFxuXG4gIC8qIElOUFVUICovXG4gIHJlYWRvbmx5OiAncmVhZE9ubHknLFxuICBtYXhsZW5ndGg6ICdtYXhMZW5ndGgnLFxuICB0YWJpbmRleDogJ3RhYkluZGV4JyxcblxuICAvKiBUQUJMRSAqL1xuICBjb2xzcGFuOiAnY29sU3BhbicsXG4gIHJvd3NwYW46ICdyb3dTcGFuJyxcblxuICAvKiBJTUFHRSAqL1xuICB1c2VtYXA6ICd1c2VNYXAnXG59O1xuXG5mdW5jdGlvbiBhdHRlbXB0KGZuLCBhcmcpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oYXJnKTtcbiAgfSBjYXRjaCAoX2EpIHtcbiAgICByZXR1cm4gYXJnO1xuICB9XG59XG5cbnZhciBkb2MgPSBkb2N1bWVudCxcbiAgICB3aW4gPSB3aW5kb3csXG4gICAgZG9jRWxlID0gZG9jLmRvY3VtZW50RWxlbWVudCxcbiAgICBjcmVhdGVFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQuYmluZChkb2MpLFxuICAgIGRpdiA9IGNyZWF0ZUVsZW1lbnQoJ2RpdicpLFxuICAgIHRhYmxlID0gY3JlYXRlRWxlbWVudCgndGFibGUnKSxcbiAgICB0Ym9keSA9IGNyZWF0ZUVsZW1lbnQoJ3Rib2R5JyksXG4gICAgdHIgPSBjcmVhdGVFbGVtZW50KCd0cicpLFxuICAgIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5LFxuICAgIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlLFxuICAgIGNvbmNhdCA9IEFycmF5UHJvdG90eXBlLmNvbmNhdCxcbiAgICBmaWx0ZXIgPSBBcnJheVByb3RvdHlwZS5maWx0ZXIsXG4gICAgaW5kZXhPZiA9IEFycmF5UHJvdG90eXBlLmluZGV4T2YsXG4gICAgbWFwID0gQXJyYXlQcm90b3R5cGUubWFwLFxuICAgIHB1c2ggPSBBcnJheVByb3RvdHlwZS5wdXNoLFxuICAgIHNsaWNlID0gQXJyYXlQcm90b3R5cGUuc2xpY2UsXG4gICAgc29tZSA9IEFycmF5UHJvdG90eXBlLnNvbWUsXG4gICAgc3BsaWNlID0gQXJyYXlQcm90b3R5cGUuc3BsaWNlO1xudmFyIGlkUmUgPSAvXiMoPzpbXFx3LV18XFxcXC58W15cXHgwMC1cXHhhMF0pKiQvLFxuICAgIGNsYXNzUmUgPSAvXlxcLig/OltcXHctXXxcXFxcLnxbXlxceDAwLVxceGEwXSkqJC8sXG4gICAgaHRtbFJlID0gLzwuKz4vLFxuICAgIHRhZ1JlID0gL15cXHcrJC87IC8vIEByZXF1aXJlIC4vdmFyaWFibGVzLnRzXG5cbmZ1bmN0aW9uIGZpbmQoc2VsZWN0b3IsIGNvbnRleHQpIHtcbiAgcmV0dXJuICFzZWxlY3RvciB8fCAhaXNEb2N1bWVudChjb250ZXh0KSAmJiAhaXNFbGVtZW50KGNvbnRleHQpID8gW10gOiBjbGFzc1JlLnRlc3Qoc2VsZWN0b3IpID8gY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHNlbGVjdG9yLnNsaWNlKDEpKSA6IHRhZ1JlLnRlc3Qoc2VsZWN0b3IpID8gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZShzZWxlY3RvcikgOiBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xufSAvLyBAcmVxdWlyZSAuL2ZpbmQudHNcbi8vIEByZXF1aXJlIC4vdmFyaWFibGVzLnRzXG5cblxudmFyIENhc2ggPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBDYXNoKHNlbGVjdG9yLCBjb250ZXh0KSB7XG4gICAgaWYgKCFzZWxlY3RvcikgcmV0dXJuO1xuICAgIGlmIChpc0Nhc2goc2VsZWN0b3IpKSByZXR1cm4gc2VsZWN0b3I7XG4gICAgdmFyIGVsZXMgPSBzZWxlY3RvcjtcblxuICAgIGlmIChpc1N0cmluZyhzZWxlY3RvcikpIHtcbiAgICAgIHZhciBjdHggPSAoaXNDYXNoKGNvbnRleHQpID8gY29udGV4dFswXSA6IGNvbnRleHQpIHx8IGRvYztcbiAgICAgIGVsZXMgPSBpZFJlLnRlc3Qoc2VsZWN0b3IpID8gY3R4LmdldEVsZW1lbnRCeUlkKHNlbGVjdG9yLnNsaWNlKDEpKSA6IGh0bWxSZS50ZXN0KHNlbGVjdG9yKSA/IHBhcnNlSFRNTChzZWxlY3RvcikgOiBmaW5kKHNlbGVjdG9yLCBjdHgpO1xuICAgICAgaWYgKCFlbGVzKSByZXR1cm47XG4gICAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKHNlbGVjdG9yKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVhZHkoc2VsZWN0b3IpOyAvL0ZJWE1FOiBgZm4ucmVhZHlgIGlzIG5vdCBpbmNsdWRlZCBpbiBgY29yZWAsIGJ1dCBpdCdzIGFjdHVhbGx5IGEgY29yZSBmdW5jdGlvbmFsaXR5XG4gICAgfVxuXG4gICAgaWYgKGVsZXMubm9kZVR5cGUgfHwgZWxlcyA9PT0gd2luKSBlbGVzID0gW2VsZXNdO1xuICAgIHRoaXMubGVuZ3RoID0gZWxlcy5sZW5ndGg7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB0aGlzW2ldID0gZWxlc1tpXTtcbiAgICB9XG4gIH1cblxuICBDYXNoLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKHNlbGVjdG9yLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIG5ldyBDYXNoKHNlbGVjdG9yLCBjb250ZXh0KTtcbiAgfTtcblxuICByZXR1cm4gQ2FzaDtcbn0oKTtcblxudmFyIGZuID0gQ2FzaC5wcm90b3R5cGUsXG4gICAgY2FzaCA9IGZuLmluaXQ7XG5jYXNoLmZuID0gY2FzaC5wcm90b3R5cGUgPSBmbjsgLy8gRW5zdXJpbmcgdGhhdCBgY2FzaCAoKSBpbnN0YW5jZW9mIGNhc2hgXG5cbmZuLmxlbmd0aCA9IDA7XG5mbi5zcGxpY2UgPSBzcGxpY2U7IC8vIEVuc3VyaW5nIGEgY2FzaCBjb2xsZWN0aW9uIGdldHMgcHJpbnRlZCBhcyBhcnJheS1saWtlIGluIENocm9tZSdzIGRldnRvb2xzXG5cbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIEVuc3VyaW5nIGEgY2FzaCBjb2xsZWN0aW9uIGlzIGl0ZXJhYmxlXG4gIGZuW1N5bWJvbFsnaXRlcmF0b3InXV0gPSBBcnJheVByb3RvdHlwZVtTeW1ib2xbJ2l0ZXJhdG9yJ11dO1xufVxuXG5mbi5tYXAgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgcmV0dXJuIGNhc2goY29uY2F0LmFwcGx5KFtdLCBtYXAuY2FsbCh0aGlzLCBmdW5jdGlvbiAoZWxlLCBpKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrLmNhbGwoZWxlLCBpLCBlbGUpO1xuICB9KSkpO1xufTtcblxuZm4uc2xpY2UgPSBmdW5jdGlvbiAoc3RhcnQsIGVuZCkge1xuICByZXR1cm4gY2FzaChzbGljZS5jYWxsKHRoaXMsIHN0YXJ0LCBlbmQpKTtcbn07IC8vIEByZXF1aXJlIC4vY2FzaC50c1xuXG5cbnZhciBkYXNoQWxwaGFSZSA9IC8tKFthLXpdKS9nO1xuXG5mdW5jdGlvbiBjYW1lbENhc2Uoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZShkYXNoQWxwaGFSZSwgZnVuY3Rpb24gKG1hdGNoLCBsZXR0ZXIpIHtcbiAgICByZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7XG4gIH0pO1xufVxuXG5jYXNoLmd1aWQgPSAxOyAvLyBAcmVxdWlyZSAuL2Nhc2gudHNcblxuZnVuY3Rpb24gbWF0Y2hlcyhlbGUsIHNlbGVjdG9yKSB7XG4gIHZhciBtYXRjaGVzID0gZWxlICYmIChlbGVbJ21hdGNoZXMnXSB8fCBlbGVbJ3dlYmtpdE1hdGNoZXNTZWxlY3RvciddIHx8IGVsZVsnbXNNYXRjaGVzU2VsZWN0b3InXSk7XG4gIHJldHVybiAhIW1hdGNoZXMgJiYgISFzZWxlY3RvciAmJiBtYXRjaGVzLmNhbGwoZWxlLCBzZWxlY3Rvcik7XG59XG5cbmZ1bmN0aW9uIGlzQ2FzaCh4KSB7XG4gIHJldHVybiB4IGluc3RhbmNlb2YgQ2FzaDtcbn1cblxuZnVuY3Rpb24gaXNXaW5kb3coeCkge1xuICByZXR1cm4gISF4ICYmIHggPT09IHgud2luZG93O1xufVxuXG5mdW5jdGlvbiBpc0RvY3VtZW50KHgpIHtcbiAgcmV0dXJuICEheCAmJiB4Lm5vZGVUeXBlID09PSA5O1xufVxuXG5mdW5jdGlvbiBpc0VsZW1lbnQoeCkge1xuICByZXR1cm4gISF4ICYmIHgubm9kZVR5cGUgPT09IDE7XG59XG5cbmZ1bmN0aW9uIGlzQm9vbGVhbih4KSB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gJ2Jvb2xlYW4nO1xufVxuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBpc1N0cmluZyh4KSB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gJ3N0cmluZyc7XG59XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKHgpIHtcbiAgcmV0dXJuIHggPT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gaXNOdWxsKHgpIHtcbiAgcmV0dXJuIHggPT09IG51bGw7XG59XG5cbmZ1bmN0aW9uIGlzTnVtZXJpYyh4KSB7XG4gIHJldHVybiAhaXNOYU4ocGFyc2VGbG9hdCh4KSkgJiYgaXNGaW5pdGUoeCk7XG59XG5cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QoeCkge1xuICBpZiAodHlwZW9mIHggIT09ICdvYmplY3QnIHx8IHggPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgdmFyIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHgpO1xuICByZXR1cm4gcHJvdG8gPT09IG51bGwgfHwgcHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGU7XG59XG5cbmNhc2guaXNXaW5kb3cgPSBpc1dpbmRvdztcbmNhc2guaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5jYXNoLmlzQXJyYXkgPSBpc0FycmF5O1xuY2FzaC5pc051bWVyaWMgPSBpc051bWVyaWM7XG5jYXNoLmlzUGxhaW5PYmplY3QgPSBpc1BsYWluT2JqZWN0O1xuXG5mbi5nZXQgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKGluZGV4KSkgcmV0dXJuIHNsaWNlLmNhbGwodGhpcyk7XG4gIGluZGV4ID0gTnVtYmVyKGluZGV4KTtcbiAgcmV0dXJuIHRoaXNbaW5kZXggPCAwID8gaW5kZXggKyB0aGlzLmxlbmd0aCA6IGluZGV4XTtcbn07XG5cbmZuLmVxID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gIHJldHVybiBjYXNoKHRoaXMuZ2V0KGluZGV4KSk7XG59O1xuXG5mbi5maXJzdCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZXEoMCk7XG59O1xuXG5mbi5sYXN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5lcSgtMSk7XG59O1xuXG5mdW5jdGlvbiBlYWNoKGFyciwgY2FsbGJhY2ssIF9yZXZlcnNlKSB7XG4gIGlmIChfcmV2ZXJzZSkge1xuICAgIHZhciBpID0gYXJyLmxlbmd0aDtcblxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGlmIChjYWxsYmFjay5jYWxsKGFycltpXSwgaSwgYXJyW2ldKSA9PT0gZmFsc2UpIHJldHVybiBhcnI7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QoYXJyKSkge1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoYXJyKTtcblxuICAgIGZvciAodmFyIGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgaWYgKGNhbGxiYWNrLmNhbGwoYXJyW2tleV0sIGtleSwgYXJyW2tleV0pID09PSBmYWxzZSkgcmV0dXJuIGFycjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcnIubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBpZiAoY2FsbGJhY2suY2FsbChhcnJbaV0sIGksIGFycltpXSkgPT09IGZhbHNlKSByZXR1cm4gYXJyO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhcnI7XG59XG5cbmNhc2guZWFjaCA9IGVhY2g7XG5cbmZuLmVhY2ggPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgcmV0dXJuIGVhY2godGhpcywgY2FsbGJhY2spO1xufTtcblxuZm4ucHJvcCA9IGZ1bmN0aW9uIChwcm9wLCB2YWx1ZSkge1xuICBpZiAoIXByb3ApIHJldHVybjtcblxuICBpZiAoaXNTdHJpbmcocHJvcCkpIHtcbiAgICBwcm9wID0gcHJvcE1hcFtwcm9wXSB8fCBwcm9wO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIHRoaXNbMF0gJiYgdGhpc1swXVtwcm9wXTtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICAgIGVsZVtwcm9wXSA9IHZhbHVlO1xuICAgIH0pO1xuICB9XG5cbiAgZm9yICh2YXIga2V5IGluIHByb3ApIHtcbiAgICB0aGlzLnByb3Aoa2V5LCBwcm9wW2tleV0pO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mbi5yZW1vdmVQcm9wID0gZnVuY3Rpb24gKHByb3ApIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgZGVsZXRlIGVsZVtwcm9wTWFwW3Byb3BdIHx8IHByb3BdO1xuICB9KTtcbn07XG5cbmZ1bmN0aW9uIGV4dGVuZCgpIHtcbiAgdmFyIHNvdXJjZXMgPSBbXTtcblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgIHNvdXJjZXNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgfVxuXG4gIHZhciBkZWVwID0gaXNCb29sZWFuKHNvdXJjZXNbMF0pID8gc291cmNlcy5zaGlmdCgpIDogZmFsc2UsXG4gICAgICB0YXJnZXQgPSBzb3VyY2VzLnNoaWZ0KCksXG4gICAgICBsZW5ndGggPSBzb3VyY2VzLmxlbmd0aDtcbiAgaWYgKCF0YXJnZXQpIHJldHVybiB7fTtcbiAgaWYgKCFsZW5ndGgpIHJldHVybiBleHRlbmQoZGVlcCwgY2FzaCwgdGFyZ2V0KTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IHNvdXJjZXNbaV07XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICBpZiAoZGVlcCAmJiAoaXNBcnJheShzb3VyY2Vba2V5XSkgfHwgaXNQbGFpbk9iamVjdChzb3VyY2Vba2V5XSkpKSB7XG4gICAgICAgIGlmICghdGFyZ2V0W2tleV0gfHwgdGFyZ2V0W2tleV0uY29uc3RydWN0b3IgIT09IHNvdXJjZVtrZXldLmNvbnN0cnVjdG9yKSB0YXJnZXRba2V5XSA9IG5ldyBzb3VyY2Vba2V5XS5jb25zdHJ1Y3RvcigpO1xuICAgICAgICBleHRlbmQoZGVlcCwgdGFyZ2V0W2tleV0sIHNvdXJjZVtrZXldKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuY2FzaC5leHRlbmQgPSBleHRlbmQ7XG5cbmZuLmV4dGVuZCA9IGZ1bmN0aW9uIChwbHVnaW5zKSB7XG4gIHJldHVybiBleHRlbmQoZm4sIHBsdWdpbnMpO1xufTsgLy8gQHJlcXVpcmUgLi9tYXRjaGVzLnRzXG4vLyBAcmVxdWlyZSAuL3R5cGVfY2hlY2tpbmcudHNcblxuXG5mdW5jdGlvbiBnZXRDb21wYXJlRnVuY3Rpb24oY29tcGFyYXRvcikge1xuICByZXR1cm4gaXNTdHJpbmcoY29tcGFyYXRvcikgPyBmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgcmV0dXJuIG1hdGNoZXMoZWxlLCBjb21wYXJhdG9yKTtcbiAgfSA6IGlzRnVuY3Rpb24oY29tcGFyYXRvcikgPyBjb21wYXJhdG9yIDogaXNDYXNoKGNvbXBhcmF0b3IpID8gZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIHJldHVybiBjb21wYXJhdG9yLmlzKGVsZSk7XG4gIH0gOiAhY29tcGFyYXRvciA/IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gOiBmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgcmV0dXJuIGVsZSA9PT0gY29tcGFyYXRvcjtcbiAgfTtcbn1cblxuZm4uZmlsdGVyID0gZnVuY3Rpb24gKGNvbXBhcmF0b3IpIHtcbiAgdmFyIGNvbXBhcmUgPSBnZXRDb21wYXJlRnVuY3Rpb24oY29tcGFyYXRvcik7XG4gIHJldHVybiBjYXNoKGZpbHRlci5jYWxsKHRoaXMsIGZ1bmN0aW9uIChlbGUsIGkpIHtcbiAgICByZXR1cm4gY29tcGFyZS5jYWxsKGVsZSwgaSwgZWxlKTtcbiAgfSkpO1xufTsgLy8gQHJlcXVpcmUgY29sbGVjdGlvbi9maWx0ZXIudHNcblxuXG5mdW5jdGlvbiBmaWx0ZXJlZChjb2xsZWN0aW9uLCBjb21wYXJhdG9yKSB7XG4gIHJldHVybiAhY29tcGFyYXRvciA/IGNvbGxlY3Rpb24gOiBjb2xsZWN0aW9uLmZpbHRlcihjb21wYXJhdG9yKTtcbn0gLy8gQHJlcXVpcmUgLi90eXBlX2NoZWNraW5nLnRzXG5cblxudmFyIHNwbGl0VmFsdWVzUmUgPSAvXFxTKy9nO1xuXG5mdW5jdGlvbiBnZXRTcGxpdFZhbHVlcyhzdHIpIHtcbiAgcmV0dXJuIGlzU3RyaW5nKHN0cikgPyBzdHIubWF0Y2goc3BsaXRWYWx1ZXNSZSkgfHwgW10gOiBbXTtcbn1cblxuZm4uaGFzQ2xhc3MgPSBmdW5jdGlvbiAoY2xzKSB7XG4gIHJldHVybiAhIWNscyAmJiBzb21lLmNhbGwodGhpcywgZnVuY3Rpb24gKGVsZSkge1xuICAgIHJldHVybiBpc0VsZW1lbnQoZWxlKSAmJiBlbGUuY2xhc3NMaXN0LmNvbnRhaW5zKGNscyk7XG4gIH0pO1xufTtcblxuZm4ucmVtb3ZlQXR0ciA9IGZ1bmN0aW9uIChhdHRyKSB7XG4gIHZhciBhdHRycyA9IGdldFNwbGl0VmFsdWVzKGF0dHIpO1xuICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICBpZiAoIWlzRWxlbWVudChlbGUpKSByZXR1cm47XG4gICAgZWFjaChhdHRycywgZnVuY3Rpb24gKGksIGEpIHtcbiAgICAgIGVsZS5yZW1vdmVBdHRyaWJ1dGUoYSk7XG4gICAgfSk7XG4gIH0pO1xufTtcblxuZnVuY3Rpb24gYXR0cihhdHRyLCB2YWx1ZSkge1xuICBpZiAoIWF0dHIpIHJldHVybjtcblxuICBpZiAoaXNTdHJpbmcoYXR0cikpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIGlmICghdGhpc1swXSB8fCAhaXNFbGVtZW50KHRoaXNbMF0pKSByZXR1cm47XG4gICAgICB2YXIgdmFsdWVfMSA9IHRoaXNbMF0uZ2V0QXR0cmlidXRlKGF0dHIpO1xuICAgICAgcmV0dXJuIGlzTnVsbCh2YWx1ZV8xKSA/IHVuZGVmaW5lZCA6IHZhbHVlXzE7XG4gICAgfVxuXG4gICAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSkgcmV0dXJuIHRoaXM7XG4gICAgaWYgKGlzTnVsbCh2YWx1ZSkpIHJldHVybiB0aGlzLnJlbW92ZUF0dHIoYXR0cik7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgICBpZiAoIWlzRWxlbWVudChlbGUpKSByZXR1cm47XG4gICAgICBlbGUuc2V0QXR0cmlidXRlKGF0dHIsIHZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZvciAodmFyIGtleSBpbiBhdHRyKSB7XG4gICAgdGhpcy5hdHRyKGtleSwgYXR0cltrZXldKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufVxuXG5mbi5hdHRyID0gYXR0cjtcblxuZm4udG9nZ2xlQ2xhc3MgPSBmdW5jdGlvbiAoY2xzLCBmb3JjZSkge1xuICB2YXIgY2xhc3NlcyA9IGdldFNwbGl0VmFsdWVzKGNscyksXG4gICAgICBpc0ZvcmNlID0gIWlzVW5kZWZpbmVkKGZvcmNlKTtcbiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgaWYgKCFpc0VsZW1lbnQoZWxlKSkgcmV0dXJuO1xuICAgIGVhY2goY2xhc3NlcywgZnVuY3Rpb24gKGksIGMpIHtcbiAgICAgIGlmIChpc0ZvcmNlKSB7XG4gICAgICAgIGZvcmNlID8gZWxlLmNsYXNzTGlzdC5hZGQoYykgOiBlbGUuY2xhc3NMaXN0LnJlbW92ZShjKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZS5jbGFzc0xpc3QudG9nZ2xlKGMpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn07XG5cbmZuLmFkZENsYXNzID0gZnVuY3Rpb24gKGNscykge1xuICByZXR1cm4gdGhpcy50b2dnbGVDbGFzcyhjbHMsIHRydWUpO1xufTtcblxuZm4ucmVtb3ZlQ2xhc3MgPSBmdW5jdGlvbiAoY2xzKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGhpcy50b2dnbGVDbGFzcyhjbHMsIGZhbHNlKTtcbiAgcmV0dXJuIHRoaXMuYXR0cignY2xhc3MnLCAnJyk7XG59O1xuXG5mdW5jdGlvbiBwbHVjayhhcnIsIHByb3AsIGRlZXAsIHVudGlsKSB7XG4gIHZhciBwbHVja2VkID0gW10sXG4gICAgICBpc0NhbGxiYWNrID0gaXNGdW5jdGlvbihwcm9wKSxcbiAgICAgIGNvbXBhcmUgPSB1bnRpbCAmJiBnZXRDb21wYXJlRnVuY3Rpb24odW50aWwpO1xuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gYXJyLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGlmIChpc0NhbGxiYWNrKSB7XG4gICAgICB2YXIgdmFsXzEgPSBwcm9wKGFycltpXSk7XG4gICAgICBpZiAodmFsXzEubGVuZ3RoKSBwdXNoLmFwcGx5KHBsdWNrZWQsIHZhbF8xKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHZhbF8yID0gYXJyW2ldW3Byb3BdO1xuXG4gICAgICB3aGlsZSAodmFsXzIgIT0gbnVsbCkge1xuICAgICAgICBpZiAodW50aWwgJiYgY29tcGFyZSgtMSwgdmFsXzIpKSBicmVhaztcbiAgICAgICAgcGx1Y2tlZC5wdXNoKHZhbF8yKTtcbiAgICAgICAgdmFsXzIgPSBkZWVwID8gdmFsXzJbcHJvcF0gOiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwbHVja2VkO1xufVxuXG5mdW5jdGlvbiB1bmlxdWUoYXJyKSB7XG4gIHJldHVybiBhcnIubGVuZ3RoID4gMSA/IGZpbHRlci5jYWxsKGFyciwgZnVuY3Rpb24gKGl0ZW0sIGluZGV4LCBzZWxmKSB7XG4gICAgcmV0dXJuIGluZGV4T2YuY2FsbChzZWxmLCBpdGVtKSA9PT0gaW5kZXg7XG4gIH0pIDogYXJyO1xufVxuXG5jYXNoLnVuaXF1ZSA9IHVuaXF1ZTtcblxuZm4uYWRkID0gZnVuY3Rpb24gKHNlbGVjdG9yLCBjb250ZXh0KSB7XG4gIHJldHVybiBjYXNoKHVuaXF1ZSh0aGlzLmdldCgpLmNvbmNhdChjYXNoKHNlbGVjdG9yLCBjb250ZXh0KS5nZXQoKSkpKTtcbn07IC8vIEByZXF1aXJlIGNvcmUvdHlwZV9jaGVja2luZy50c1xuLy8gQHJlcXVpcmUgY29yZS92YXJpYWJsZXMudHNcblxuXG5mdW5jdGlvbiBjb21wdXRlU3R5bGUoZWxlLCBwcm9wLCBpc1ZhcmlhYmxlKSB7XG4gIGlmICghaXNFbGVtZW50KGVsZSkpIHJldHVybjtcbiAgdmFyIHN0eWxlID0gd2luLmdldENvbXB1dGVkU3R5bGUoZWxlLCBudWxsKTtcbiAgcmV0dXJuIGlzVmFyaWFibGUgPyBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKHByb3ApIHx8IHVuZGVmaW5lZCA6IHN0eWxlW3Byb3BdIHx8IGVsZS5zdHlsZVtwcm9wXTtcbn0gLy8gQHJlcXVpcmUgLi9jb21wdXRlX3N0eWxlLnRzXG5cblxuZnVuY3Rpb24gY29tcHV0ZVN0eWxlSW50KGVsZSwgcHJvcCkge1xuICByZXR1cm4gcGFyc2VJbnQoY29tcHV0ZVN0eWxlKGVsZSwgcHJvcCksIDEwKSB8fCAwO1xufVxuXG52YXIgY3NzVmFyaWFibGVSZSA9IC9eLS0vOyAvLyBAcmVxdWlyZSAuL3ZhcmlhYmxlcy50c1xuXG5mdW5jdGlvbiBpc0NTU1ZhcmlhYmxlKHByb3ApIHtcbiAgcmV0dXJuIGNzc1ZhcmlhYmxlUmUudGVzdChwcm9wKTtcbn0gLy8gQHJlcXVpcmUgY29yZS9jYW1lbF9jYXNlLnRzXG4vLyBAcmVxdWlyZSBjb3JlL2Nhc2gudHNcbi8vIEByZXF1aXJlIGNvcmUvZWFjaC50c1xuLy8gQHJlcXVpcmUgY29yZS92YXJpYWJsZXMudHNcbi8vIEByZXF1aXJlIC4vaXNfY3NzX3ZhcmlhYmxlLnRzXG5cblxudmFyIHByZWZpeGVkUHJvcHMgPSB7fSxcbiAgICBzdHlsZSA9IGRpdi5zdHlsZSxcbiAgICB2ZW5kb3JzUHJlZml4ZXMgPSBbJ3dlYmtpdCcsICdtb3onLCAnbXMnXTtcblxuZnVuY3Rpb24gZ2V0UHJlZml4ZWRQcm9wKHByb3AsIGlzVmFyaWFibGUpIHtcbiAgaWYgKGlzVmFyaWFibGUgPT09IHZvaWQgMCkge1xuICAgIGlzVmFyaWFibGUgPSBpc0NTU1ZhcmlhYmxlKHByb3ApO1xuICB9XG5cbiAgaWYgKGlzVmFyaWFibGUpIHJldHVybiBwcm9wO1xuXG4gIGlmICghcHJlZml4ZWRQcm9wc1twcm9wXSkge1xuICAgIHZhciBwcm9wQ0MgPSBjYW1lbENhc2UocHJvcCksXG4gICAgICAgIHByb3BVQyA9IFwiXCIgKyBwcm9wQ0NbMF0udG9VcHBlckNhc2UoKSArIHByb3BDQy5zbGljZSgxKSxcbiAgICAgICAgcHJvcHMgPSAocHJvcENDICsgXCIgXCIgKyB2ZW5kb3JzUHJlZml4ZXMuam9pbihwcm9wVUMgKyBcIiBcIikgKyBwcm9wVUMpLnNwbGl0KCcgJyk7XG4gICAgZWFjaChwcm9wcywgZnVuY3Rpb24gKGksIHApIHtcbiAgICAgIGlmIChwIGluIHN0eWxlKSB7XG4gICAgICAgIHByZWZpeGVkUHJvcHNbcHJvcF0gPSBwO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcHJlZml4ZWRQcm9wc1twcm9wXTtcbn1cblxuOyAvLyBAcmVxdWlyZSBjb3JlL3R5cGVfY2hlY2tpbmcudHNcbi8vIEByZXF1aXJlIC4vaXNfY3NzX3ZhcmlhYmxlLnRzXG5cbnZhciBudW1lcmljUHJvcHMgPSB7XG4gIGFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiB0cnVlLFxuICBjb2x1bW5Db3VudDogdHJ1ZSxcbiAgZmxleEdyb3c6IHRydWUsXG4gIGZsZXhTaHJpbms6IHRydWUsXG4gIGZvbnRXZWlnaHQ6IHRydWUsXG4gIGdyaWRBcmVhOiB0cnVlLFxuICBncmlkQ29sdW1uOiB0cnVlLFxuICBncmlkQ29sdW1uRW5kOiB0cnVlLFxuICBncmlkQ29sdW1uU3RhcnQ6IHRydWUsXG4gIGdyaWRSb3c6IHRydWUsXG4gIGdyaWRSb3dFbmQ6IHRydWUsXG4gIGdyaWRSb3dTdGFydDogdHJ1ZSxcbiAgbGluZUhlaWdodDogdHJ1ZSxcbiAgb3BhY2l0eTogdHJ1ZSxcbiAgb3JkZXI6IHRydWUsXG4gIG9ycGhhbnM6IHRydWUsXG4gIHdpZG93czogdHJ1ZSxcbiAgekluZGV4OiB0cnVlXG59O1xuXG5mdW5jdGlvbiBnZXRTdWZmaXhlZFZhbHVlKHByb3AsIHZhbHVlLCBpc1ZhcmlhYmxlKSB7XG4gIGlmIChpc1ZhcmlhYmxlID09PSB2b2lkIDApIHtcbiAgICBpc1ZhcmlhYmxlID0gaXNDU1NWYXJpYWJsZShwcm9wKTtcbiAgfVxuXG4gIHJldHVybiAhaXNWYXJpYWJsZSAmJiAhbnVtZXJpY1Byb3BzW3Byb3BdICYmIGlzTnVtZXJpYyh2YWx1ZSkgPyB2YWx1ZSArIFwicHhcIiA6IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBjc3MocHJvcCwgdmFsdWUpIHtcbiAgaWYgKGlzU3RyaW5nKHByb3ApKSB7XG4gICAgdmFyIGlzVmFyaWFibGVfMSA9IGlzQ1NTVmFyaWFibGUocHJvcCk7XG4gICAgcHJvcCA9IGdldFByZWZpeGVkUHJvcChwcm9wLCBpc1ZhcmlhYmxlXzEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIHRoaXNbMF0gJiYgY29tcHV0ZVN0eWxlKHRoaXNbMF0sIHByb3AsIGlzVmFyaWFibGVfMSk7XG4gICAgaWYgKCFwcm9wKSByZXR1cm4gdGhpcztcbiAgICB2YWx1ZSA9IGdldFN1ZmZpeGVkVmFsdWUocHJvcCwgdmFsdWUsIGlzVmFyaWFibGVfMSk7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgICBpZiAoIWlzRWxlbWVudChlbGUpKSByZXR1cm47XG5cbiAgICAgIGlmIChpc1ZhcmlhYmxlXzEpIHtcbiAgICAgICAgZWxlLnN0eWxlLnNldFByb3BlcnR5KHByb3AsIHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZS5zdHlsZVtwcm9wXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZm9yICh2YXIga2V5IGluIHByb3ApIHtcbiAgICB0aGlzLmNzcyhrZXksIHByb3Bba2V5XSk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn1cblxuO1xuZm4uY3NzID0gY3NzOyAvLyBAb3B0aW9uYWwgLi9jc3MudHNcbi8vIEByZXF1aXJlIGNvcmUvYXR0ZW1wdC50c1xuLy8gQHJlcXVpcmUgY29yZS9jYW1lbF9jYXNlLnRzXG5cbnZhciBKU09OU3RyaW5nUmUgPSAvXlxccyt8XFxzKyQvO1xuXG5mdW5jdGlvbiBnZXREYXRhKGVsZSwga2V5KSB7XG4gIHZhciB2YWx1ZSA9IGVsZS5kYXRhc2V0W2tleV0gfHwgZWxlLmRhdGFzZXRbY2FtZWxDYXNlKGtleSldO1xuICBpZiAoSlNPTlN0cmluZ1JlLnRlc3QodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gIHJldHVybiBhdHRlbXB0KEpTT04ucGFyc2UsIHZhbHVlKTtcbn0gLy8gQHJlcXVpcmUgY29yZS9hdHRlbXB0LnRzXG4vLyBAcmVxdWlyZSBjb3JlL2NhbWVsX2Nhc2UudHNcblxuXG5mdW5jdGlvbiBzZXREYXRhKGVsZSwga2V5LCB2YWx1ZSkge1xuICB2YWx1ZSA9IGF0dGVtcHQoSlNPTi5zdHJpbmdpZnksIHZhbHVlKTtcbiAgZWxlLmRhdGFzZXRbY2FtZWxDYXNlKGtleSldID0gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGRhdGEobmFtZSwgdmFsdWUpIHtcbiAgaWYgKCFuYW1lKSB7XG4gICAgaWYgKCF0aGlzWzBdKSByZXR1cm47XG4gICAgdmFyIGRhdGFzID0ge307XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpc1swXS5kYXRhc2V0KSB7XG4gICAgICBkYXRhc1trZXldID0gZ2V0RGF0YSh0aGlzWzBdLCBrZXkpO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhcztcbiAgfVxuXG4gIGlmIChpc1N0cmluZyhuYW1lKSkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIHRoaXNbMF0gJiYgZ2V0RGF0YSh0aGlzWzBdLCBuYW1lKTtcbiAgICBpZiAoaXNVbmRlZmluZWQodmFsdWUpKSByZXR1cm4gdGhpcztcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICAgIHNldERhdGEoZWxlLCBuYW1lLCB2YWx1ZSk7XG4gICAgfSk7XG4gIH1cblxuICBmb3IgKHZhciBrZXkgaW4gbmFtZSkge1xuICAgIHRoaXMuZGF0YShrZXksIG5hbWVba2V5XSk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn1cblxuZm4uZGF0YSA9IGRhdGE7IC8vIEBvcHRpb25hbCAuL2RhdGEudHNcblxuZnVuY3Rpb24gZ2V0RG9jdW1lbnREaW1lbnNpb24oZG9jLCBkaW1lbnNpb24pIHtcbiAgdmFyIGRvY0VsZSA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG4gIHJldHVybiBNYXRoLm1heChkb2MuYm9keVtcInNjcm9sbFwiICsgZGltZW5zaW9uXSwgZG9jRWxlW1wic2Nyb2xsXCIgKyBkaW1lbnNpb25dLCBkb2MuYm9keVtcIm9mZnNldFwiICsgZGltZW5zaW9uXSwgZG9jRWxlW1wib2Zmc2V0XCIgKyBkaW1lbnNpb25dLCBkb2NFbGVbXCJjbGllbnRcIiArIGRpbWVuc2lvbl0pO1xufSAvLyBAcmVxdWlyZSBjc3MvaGVscGVycy9jb21wdXRlX3N0eWxlX2ludC50c1xuXG5cbmZ1bmN0aW9uIGdldEV4dHJhU3BhY2UoZWxlLCB4QXhpcykge1xuICByZXR1cm4gY29tcHV0ZVN0eWxlSW50KGVsZSwgXCJib3JkZXJcIiArICh4QXhpcyA/ICdMZWZ0JyA6ICdUb3AnKSArIFwiV2lkdGhcIikgKyBjb21wdXRlU3R5bGVJbnQoZWxlLCBcInBhZGRpbmdcIiArICh4QXhpcyA/ICdMZWZ0JyA6ICdUb3AnKSkgKyBjb21wdXRlU3R5bGVJbnQoZWxlLCBcInBhZGRpbmdcIiArICh4QXhpcyA/ICdSaWdodCcgOiAnQm90dG9tJykpICsgY29tcHV0ZVN0eWxlSW50KGVsZSwgXCJib3JkZXJcIiArICh4QXhpcyA/ICdSaWdodCcgOiAnQm90dG9tJykgKyBcIldpZHRoXCIpO1xufVxuXG5lYWNoKFt0cnVlLCBmYWxzZV0sIGZ1bmN0aW9uIChpLCBvdXRlcikge1xuICBlYWNoKFsnV2lkdGgnLCAnSGVpZ2h0J10sIGZ1bmN0aW9uIChpLCBwcm9wKSB7XG4gICAgdmFyIG5hbWUgPSBcIlwiICsgKG91dGVyID8gJ291dGVyJyA6ICdpbm5lcicpICsgcHJvcDtcblxuICAgIGZuW25hbWVdID0gZnVuY3Rpb24gKGluY2x1ZGVNYXJnaW5zKSB7XG4gICAgICBpZiAoIXRoaXNbMF0pIHJldHVybjtcbiAgICAgIGlmIChpc1dpbmRvdyh0aGlzWzBdKSkgcmV0dXJuIG91dGVyID8gdGhpc1swXVtcImlubmVyXCIgKyBwcm9wXSA6IHRoaXNbMF0uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50W1wiY2xpZW50XCIgKyBwcm9wXTtcbiAgICAgIGlmIChpc0RvY3VtZW50KHRoaXNbMF0pKSByZXR1cm4gZ2V0RG9jdW1lbnREaW1lbnNpb24odGhpc1swXSwgcHJvcCk7XG4gICAgICByZXR1cm4gdGhpc1swXVtcIlwiICsgKG91dGVyID8gJ29mZnNldCcgOiAnY2xpZW50JykgKyBwcm9wXSArIChpbmNsdWRlTWFyZ2lucyAmJiBvdXRlciA/IGNvbXB1dGVTdHlsZUludCh0aGlzWzBdLCBcIm1hcmdpblwiICsgKGkgPyAnVG9wJyA6ICdMZWZ0JykpICsgY29tcHV0ZVN0eWxlSW50KHRoaXNbMF0sIFwibWFyZ2luXCIgKyAoaSA/ICdCb3R0b20nIDogJ1JpZ2h0JykpIDogMCk7XG4gICAgfTtcbiAgfSk7XG59KTtcbmVhY2goWydXaWR0aCcsICdIZWlnaHQnXSwgZnVuY3Rpb24gKGluZGV4LCBwcm9wKSB7XG4gIHZhciBwcm9wTEMgPSBwcm9wLnRvTG93ZXJDYXNlKCk7XG5cbiAgZm5bcHJvcExDXSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGlmICghdGhpc1swXSkgcmV0dXJuIGlzVW5kZWZpbmVkKHZhbHVlKSA/IHVuZGVmaW5lZCA6IHRoaXM7XG5cbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIGlmIChpc1dpbmRvdyh0aGlzWzBdKSkgcmV0dXJuIHRoaXNbMF0uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50W1wiY2xpZW50XCIgKyBwcm9wXTtcbiAgICAgIGlmIChpc0RvY3VtZW50KHRoaXNbMF0pKSByZXR1cm4gZ2V0RG9jdW1lbnREaW1lbnNpb24odGhpc1swXSwgcHJvcCk7XG4gICAgICByZXR1cm4gdGhpc1swXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVtwcm9wTENdIC0gZ2V0RXh0cmFTcGFjZSh0aGlzWzBdLCAhaW5kZXgpO1xuICAgIH1cblxuICAgIHZhciB2YWx1ZU51bWJlciA9IHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgICBpZiAoIWlzRWxlbWVudChlbGUpKSByZXR1cm47XG4gICAgICB2YXIgYm94U2l6aW5nID0gY29tcHV0ZVN0eWxlKGVsZSwgJ2JveFNpemluZycpO1xuICAgICAgZWxlLnN0eWxlW3Byb3BMQ10gPSBnZXRTdWZmaXhlZFZhbHVlKHByb3BMQywgdmFsdWVOdW1iZXIgKyAoYm94U2l6aW5nID09PSAnYm9yZGVyLWJveCcgPyBnZXRFeHRyYVNwYWNlKGVsZSwgIWluZGV4KSA6IDApKTtcbiAgICB9KTtcbiAgfTtcbn0pOyAvLyBAb3B0aW9uYWwgLi9pbm5lcl9vdXRlci50c1xuLy8gQG9wdGlvbmFsIC4vbm9ybWFsLnRzXG4vLyBAcmVxdWlyZSBjc3MvaGVscGVycy9jb21wdXRlX3N0eWxlLnRzXG5cbnZhciBkZWZhdWx0RGlzcGxheSA9IHt9O1xuXG5mdW5jdGlvbiBnZXREZWZhdWx0RGlzcGxheSh0YWdOYW1lKSB7XG4gIGlmIChkZWZhdWx0RGlzcGxheVt0YWdOYW1lXSkgcmV0dXJuIGRlZmF1bHREaXNwbGF5W3RhZ05hbWVdO1xuICB2YXIgZWxlID0gY3JlYXRlRWxlbWVudCh0YWdOYW1lKTtcbiAgZG9jLmJvZHkuaW5zZXJ0QmVmb3JlKGVsZSwgbnVsbCk7XG4gIHZhciBkaXNwbGF5ID0gY29tcHV0ZVN0eWxlKGVsZSwgJ2Rpc3BsYXknKTtcbiAgZG9jLmJvZHkucmVtb3ZlQ2hpbGQoZWxlKTtcbiAgcmV0dXJuIGRlZmF1bHREaXNwbGF5W3RhZ05hbWVdID0gZGlzcGxheSAhPT0gJ25vbmUnID8gZGlzcGxheSA6ICdibG9jayc7XG59IC8vIEByZXF1aXJlIGNzcy9oZWxwZXJzL2NvbXB1dGVfc3R5bGUudHNcblxuXG5mdW5jdGlvbiBpc0hpZGRlbihlbGUpIHtcbiAgcmV0dXJuIGNvbXB1dGVTdHlsZShlbGUsICdkaXNwbGF5JykgPT09ICdub25lJztcbn1cblxudmFyIGRpc3BsYXlQcm9wZXJ0eSA9ICdfX19jZCc7XG5cbmZuLnRvZ2dsZSA9IGZ1bmN0aW9uIChmb3JjZSkge1xuICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICBpZiAoIWlzRWxlbWVudChlbGUpKSByZXR1cm47XG4gICAgdmFyIHNob3cgPSBpc1VuZGVmaW5lZChmb3JjZSkgPyBpc0hpZGRlbihlbGUpIDogZm9yY2U7XG5cbiAgICBpZiAoc2hvdykge1xuICAgICAgZWxlLnN0eWxlLmRpc3BsYXkgPSBlbGVbZGlzcGxheVByb3BlcnR5XSB8fCAnJztcblxuICAgICAgaWYgKGlzSGlkZGVuKGVsZSkpIHtcbiAgICAgICAgZWxlLnN0eWxlLmRpc3BsYXkgPSBnZXREZWZhdWx0RGlzcGxheShlbGUudGFnTmFtZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZVtkaXNwbGF5UHJvcGVydHldID0gY29tcHV0ZVN0eWxlKGVsZSwgJ2Rpc3BsYXknKTtcbiAgICAgIGVsZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cbiAgfSk7XG59O1xuXG5mbi5oaWRlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy50b2dnbGUoZmFsc2UpO1xufTtcblxuZm4uc2hvdyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMudG9nZ2xlKHRydWUpO1xufTsgLy8gQG9wdGlvbmFsIC4vaGlkZS50c1xuLy8gQG9wdGlvbmFsIC4vc2hvdy50c1xuLy8gQG9wdGlvbmFsIC4vdG9nZ2xlLnRzXG5cblxuZnVuY3Rpb24gaGFzTmFtZXNwYWNlcyhuczEsIG5zMikge1xuICByZXR1cm4gIW5zMiB8fCAhc29tZS5jYWxsKG5zMiwgZnVuY3Rpb24gKG5zKSB7XG4gICAgcmV0dXJuIG5zMS5pbmRleE9mKG5zKSA8IDA7XG4gIH0pO1xufVxuXG52YXIgZXZlbnRzTmFtZXNwYWNlID0gJ19fX2NlJyxcbiAgICBldmVudHNOYW1lc3BhY2VzU2VwYXJhdG9yID0gJy4nLFxuICAgIGV2ZW50c0ZvY3VzID0ge1xuICBmb2N1czogJ2ZvY3VzaW4nLFxuICBibHVyOiAnZm9jdXNvdXQnXG59LFxuICAgIGV2ZW50c0hvdmVyID0ge1xuICBtb3VzZWVudGVyOiAnbW91c2VvdmVyJyxcbiAgbW91c2VsZWF2ZTogJ21vdXNlb3V0J1xufSxcbiAgICBldmVudHNNb3VzZVJlID0gL14obW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3B8Y2xpY2t8ZGJsY2xpY2spL2k7IC8vIEByZXF1aXJlIC4vdmFyaWFibGVzLnRzXG5cbmZ1bmN0aW9uIGdldEV2ZW50TmFtZUJ1YmJsaW5nKG5hbWUpIHtcbiAgcmV0dXJuIGV2ZW50c0hvdmVyW25hbWVdIHx8IGV2ZW50c0ZvY3VzW25hbWVdIHx8IG5hbWU7XG59IC8vIEByZXF1aXJlIC4vdmFyaWFibGVzLnRzXG5cblxuZnVuY3Rpb24gZ2V0RXZlbnRzQ2FjaGUoZWxlKSB7XG4gIHJldHVybiBlbGVbZXZlbnRzTmFtZXNwYWNlXSA9IGVsZVtldmVudHNOYW1lc3BhY2VdIHx8IHt9O1xufSAvLyBAcmVxdWlyZSBjb3JlL2d1aWQudHNcbi8vIEByZXF1aXJlIGV2ZW50cy9oZWxwZXJzL2dldF9ldmVudHNfY2FjaGUudHNcblxuXG5mdW5jdGlvbiBhZGRFdmVudChlbGUsIG5hbWUsIG5hbWVzcGFjZXMsIHNlbGVjdG9yLCBjYWxsYmFjaykge1xuICB2YXIgZXZlbnRDYWNoZSA9IGdldEV2ZW50c0NhY2hlKGVsZSk7XG4gIGV2ZW50Q2FjaGVbbmFtZV0gPSBldmVudENhY2hlW25hbWVdIHx8IFtdO1xuICBldmVudENhY2hlW25hbWVdLnB1c2goW25hbWVzcGFjZXMsIHNlbGVjdG9yLCBjYWxsYmFja10pO1xuICBlbGUuYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBjYWxsYmFjayk7XG59IC8vIEByZXF1aXJlIC4vdmFyaWFibGVzLnRzXG5cblxuZnVuY3Rpb24gcGFyc2VFdmVudE5hbWUoZXZlbnROYW1lKSB7XG4gIHZhciBwYXJ0cyA9IGV2ZW50TmFtZS5zcGxpdChldmVudHNOYW1lc3BhY2VzU2VwYXJhdG9yKTtcbiAgcmV0dXJuIFtwYXJ0c1swXSwgcGFydHMuc2xpY2UoMSkuc29ydCgpXTsgLy8gW25hbWUsIG5hbWVzcGFjZVtdXVxufSAvLyBAcmVxdWlyZSAuL2dldF9ldmVudHNfY2FjaGUudHNcbi8vIEByZXF1aXJlIC4vaGFzX25hbWVzcGFjZXMudHNcbi8vIEByZXF1aXJlIC4vcGFyc2VfZXZlbnRfbmFtZS50c1xuXG5cbmZ1bmN0aW9uIHJlbW92ZUV2ZW50KGVsZSwgbmFtZSwgbmFtZXNwYWNlcywgc2VsZWN0b3IsIGNhbGxiYWNrKSB7XG4gIHZhciBjYWNoZSA9IGdldEV2ZW50c0NhY2hlKGVsZSk7XG5cbiAgaWYgKCFuYW1lKSB7XG4gICAgZm9yIChuYW1lIGluIGNhY2hlKSB7XG4gICAgICByZW1vdmVFdmVudChlbGUsIG5hbWUsIG5hbWVzcGFjZXMsIHNlbGVjdG9yLCBjYWxsYmFjayk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNhY2hlW25hbWVdKSB7XG4gICAgY2FjaGVbbmFtZV0gPSBjYWNoZVtuYW1lXS5maWx0ZXIoZnVuY3Rpb24gKF9hKSB7XG4gICAgICB2YXIgbnMgPSBfYVswXSxcbiAgICAgICAgICBzZWwgPSBfYVsxXSxcbiAgICAgICAgICBjYiA9IF9hWzJdO1xuICAgICAgaWYgKGNhbGxiYWNrICYmIGNiLmd1aWQgIT09IGNhbGxiYWNrLmd1aWQgfHwgIWhhc05hbWVzcGFjZXMobnMsIG5hbWVzcGFjZXMpIHx8IHNlbGVjdG9yICYmIHNlbGVjdG9yICE9PSBzZWwpIHJldHVybiB0cnVlO1xuICAgICAgZWxlLnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgY2IpO1xuICAgIH0pO1xuICB9XG59XG5cbmZuLm9mZiA9IGZ1bmN0aW9uIChldmVudEZ1bGxOYW1lLCBzZWxlY3RvciwgY2FsbGJhY2spIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICBpZiAoaXNVbmRlZmluZWQoZXZlbnRGdWxsTmFtZSkpIHtcbiAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgICAgaWYgKCFpc0VsZW1lbnQoZWxlKSAmJiAhaXNEb2N1bWVudChlbGUpICYmICFpc1dpbmRvdyhlbGUpKSByZXR1cm47XG4gICAgICByZW1vdmVFdmVudChlbGUpO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKCFpc1N0cmluZyhldmVudEZ1bGxOYW1lKSkge1xuICAgIGZvciAodmFyIGtleSBpbiBldmVudEZ1bGxOYW1lKSB7XG4gICAgICB0aGlzLm9mZihrZXksIGV2ZW50RnVsbE5hbWVba2V5XSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChpc0Z1bmN0aW9uKHNlbGVjdG9yKSkge1xuICAgICAgY2FsbGJhY2sgPSBzZWxlY3RvcjtcbiAgICAgIHNlbGVjdG9yID0gJyc7XG4gICAgfVxuXG4gICAgZWFjaChnZXRTcGxpdFZhbHVlcyhldmVudEZ1bGxOYW1lKSwgZnVuY3Rpb24gKGksIGV2ZW50RnVsbE5hbWUpIHtcbiAgICAgIHZhciBfYSA9IHBhcnNlRXZlbnROYW1lKGV2ZW50RnVsbE5hbWUpLFxuICAgICAgICAgIG5hbWVPcmlnaW5hbCA9IF9hWzBdLFxuICAgICAgICAgIG5hbWVzcGFjZXMgPSBfYVsxXSxcbiAgICAgICAgICBuYW1lID0gZ2V0RXZlbnROYW1lQnViYmxpbmcobmFtZU9yaWdpbmFsKTtcblxuICAgICAgX3RoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgICAgIGlmICghaXNFbGVtZW50KGVsZSkgJiYgIWlzRG9jdW1lbnQoZWxlKSAmJiAhaXNXaW5kb3coZWxlKSkgcmV0dXJuO1xuICAgICAgICByZW1vdmVFdmVudChlbGUsIG5hbWUsIG5hbWVzcGFjZXMsIHNlbGVjdG9yLCBjYWxsYmFjayk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gb24oZXZlbnRGdWxsTmFtZSwgc2VsZWN0b3IsIGRhdGEsIGNhbGxiYWNrLCBfb25lKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgaWYgKCFpc1N0cmluZyhldmVudEZ1bGxOYW1lKSkge1xuICAgIGZvciAodmFyIGtleSBpbiBldmVudEZ1bGxOYW1lKSB7XG4gICAgICB0aGlzLm9uKGtleSwgc2VsZWN0b3IsIGRhdGEsIGV2ZW50RnVsbE5hbWVba2V5XSwgX29uZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBpZiAoIWlzU3RyaW5nKHNlbGVjdG9yKSkge1xuICAgIGlmIChpc1VuZGVmaW5lZChzZWxlY3RvcikgfHwgaXNOdWxsKHNlbGVjdG9yKSkge1xuICAgICAgc2VsZWN0b3IgPSAnJztcbiAgICB9IGVsc2UgaWYgKGlzVW5kZWZpbmVkKGRhdGEpKSB7XG4gICAgICBkYXRhID0gc2VsZWN0b3I7XG4gICAgICBzZWxlY3RvciA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsYmFjayA9IGRhdGE7XG4gICAgICBkYXRhID0gc2VsZWN0b3I7XG4gICAgICBzZWxlY3RvciA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIGlmICghaXNGdW5jdGlvbihjYWxsYmFjaykpIHtcbiAgICBjYWxsYmFjayA9IGRhdGE7XG4gICAgZGF0YSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmICghY2FsbGJhY2spIHJldHVybiB0aGlzO1xuICBlYWNoKGdldFNwbGl0VmFsdWVzKGV2ZW50RnVsbE5hbWUpLCBmdW5jdGlvbiAoaSwgZXZlbnRGdWxsTmFtZSkge1xuICAgIHZhciBfYSA9IHBhcnNlRXZlbnROYW1lKGV2ZW50RnVsbE5hbWUpLFxuICAgICAgICBuYW1lT3JpZ2luYWwgPSBfYVswXSxcbiAgICAgICAgbmFtZXNwYWNlcyA9IF9hWzFdLFxuICAgICAgICBuYW1lID0gZ2V0RXZlbnROYW1lQnViYmxpbmcobmFtZU9yaWdpbmFsKSxcbiAgICAgICAgaXNFdmVudEhvdmVyID0gbmFtZU9yaWdpbmFsIGluIGV2ZW50c0hvdmVyLFxuICAgICAgICBpc0V2ZW50Rm9jdXMgPSBuYW1lT3JpZ2luYWwgaW4gZXZlbnRzRm9jdXM7XG5cbiAgICBpZiAoIW5hbWUpIHJldHVybjtcblxuICAgIF90aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgICAgaWYgKCFpc0VsZW1lbnQoZWxlKSAmJiAhaXNEb2N1bWVudChlbGUpICYmICFpc1dpbmRvdyhlbGUpKSByZXR1cm47XG5cbiAgICAgIHZhciBmaW5hbENhbGxiYWNrID0gZnVuY3Rpb24gZmluYWxDYWxsYmFjayhldmVudCkge1xuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0W1wiX19faVwiICsgZXZlbnQudHlwZV0pIHJldHVybiBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsgLy8gSWdub3JpbmcgbmF0aXZlIGV2ZW50IGluIGZhdm9yIG9mIHRoZSB1cGNvbWluZyBjdXN0b20gb25lXG5cbiAgICAgICAgaWYgKGV2ZW50Lm5hbWVzcGFjZSAmJiAhaGFzTmFtZXNwYWNlcyhuYW1lc3BhY2VzLCBldmVudC5uYW1lc3BhY2Uuc3BsaXQoZXZlbnRzTmFtZXNwYWNlc1NlcGFyYXRvcikpKSByZXR1cm47XG4gICAgICAgIGlmICghc2VsZWN0b3IgJiYgKGlzRXZlbnRGb2N1cyAmJiAoZXZlbnQudGFyZ2V0ICE9PSBlbGUgfHwgZXZlbnQuX19fb3QgPT09IG5hbWUpIHx8IGlzRXZlbnRIb3ZlciAmJiBldmVudC5yZWxhdGVkVGFyZ2V0ICYmIGVsZS5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KSkpIHJldHVybjtcbiAgICAgICAgdmFyIHRoaXNBcmcgPSBlbGU7XG5cbiAgICAgICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICAgICAgdmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldDtcblxuICAgICAgICAgIHdoaWxlICghbWF0Y2hlcyh0YXJnZXQsIHNlbGVjdG9yKSkge1xuICAgICAgICAgICAgaWYgKHRhcmdldCA9PT0gZWxlKSByZXR1cm47XG4gICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIGlmICghdGFyZ2V0KSByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpc0FyZyA9IHRhcmdldDtcbiAgICAgICAgICBldmVudC5fX19jZCA9IHRydWU7IC8vIERlbGVnYXRlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQuX19fY2QpIHtcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXZlbnQsICdjdXJyZW50VGFyZ2V0Jywge1xuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzQXJnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV2ZW50LCAnZGF0YScsIHtcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgcmV0dXJuVmFsdWUgPSBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIGV2ZW50LCBldmVudC5fX190ZCk7XG5cbiAgICAgICAgaWYgKF9vbmUpIHtcbiAgICAgICAgICByZW1vdmVFdmVudChlbGUsIG5hbWUsIG5hbWVzcGFjZXMsIHNlbGVjdG9yLCBmaW5hbENhbGxiYWNrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXR1cm5WYWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBmaW5hbENhbGxiYWNrLmd1aWQgPSBjYWxsYmFjay5ndWlkID0gY2FsbGJhY2suZ3VpZCB8fCBjYXNoLmd1aWQrKztcbiAgICAgIGFkZEV2ZW50KGVsZSwgbmFtZSwgbmFtZXNwYWNlcywgc2VsZWN0b3IsIGZpbmFsQ2FsbGJhY2spO1xuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbmZuLm9uID0gb247XG5cbmZ1bmN0aW9uIG9uZShldmVudEZ1bGxOYW1lLCBzZWxlY3RvciwgZGF0YSwgY2FsbGJhY2spIHtcbiAgcmV0dXJuIHRoaXMub24oZXZlbnRGdWxsTmFtZSwgc2VsZWN0b3IsIGRhdGEsIGNhbGxiYWNrLCB0cnVlKTtcbn1cblxuO1xuZm4ub25lID0gb25lO1xuXG5mbi5yZWFkeSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICB2YXIgY2IgPSBmdW5jdGlvbiBjYigpIHtcbiAgICByZXR1cm4gc2V0VGltZW91dChjYWxsYmFjaywgMCwgY2FzaCk7XG4gIH07XG5cbiAgaWYgKGRvYy5yZWFkeVN0YXRlICE9PSAnbG9hZGluZycpIHtcbiAgICBjYigpO1xuICB9IGVsc2Uge1xuICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgY2IpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mbi50cmlnZ2VyID0gZnVuY3Rpb24gKGV2ZW50LCBkYXRhKSB7XG4gIGlmIChpc1N0cmluZyhldmVudCkpIHtcbiAgICB2YXIgX2EgPSBwYXJzZUV2ZW50TmFtZShldmVudCksXG4gICAgICAgIG5hbWVPcmlnaW5hbCA9IF9hWzBdLFxuICAgICAgICBuYW1lc3BhY2VzID0gX2FbMV0sXG4gICAgICAgIG5hbWVfMSA9IGdldEV2ZW50TmFtZUJ1YmJsaW5nKG5hbWVPcmlnaW5hbCk7XG5cbiAgICBpZiAoIW5hbWVfMSkgcmV0dXJuIHRoaXM7XG4gICAgdmFyIHR5cGUgPSBldmVudHNNb3VzZVJlLnRlc3QobmFtZV8xKSA/ICdNb3VzZUV2ZW50cycgOiAnSFRNTEV2ZW50cyc7XG4gICAgZXZlbnQgPSBkb2MuY3JlYXRlRXZlbnQodHlwZSk7XG4gICAgZXZlbnQuaW5pdEV2ZW50KG5hbWVfMSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgZXZlbnQubmFtZXNwYWNlID0gbmFtZXNwYWNlcy5qb2luKGV2ZW50c05hbWVzcGFjZXNTZXBhcmF0b3IpO1xuICAgIGV2ZW50Ll9fX290ID0gbmFtZU9yaWdpbmFsO1xuICB9XG5cbiAgZXZlbnQuX19fdGQgPSBkYXRhO1xuICB2YXIgaXNFdmVudEZvY3VzID0gZXZlbnQuX19fb3QgaW4gZXZlbnRzRm9jdXM7XG4gIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIGlmIChpc0V2ZW50Rm9jdXMgJiYgaXNGdW5jdGlvbihlbGVbZXZlbnQuX19fb3RdKSkge1xuICAgICAgZWxlW1wiX19faVwiICsgZXZlbnQudHlwZV0gPSB0cnVlOyAvLyBFbnN1cmluZyB0aGUgbmF0aXZlIGV2ZW50IGlzIGlnbm9yZWRcblxuICAgICAgZWxlW2V2ZW50Ll9fX290XSgpO1xuXG4gICAgICBlbGVbXCJfX19pXCIgKyBldmVudC50eXBlXSA9IGZhbHNlOyAvLyBFbnN1cmluZyB0aGUgY3VzdG9tIGV2ZW50IGlzIG5vdCBpZ25vcmVkXG4gICAgfVxuXG4gICAgZWxlLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICB9KTtcbn07IC8vIEBvcHRpb25hbCAuL29mZi50c1xuLy8gQG9wdGlvbmFsIC4vb24udHNcbi8vIEBvcHRpb25hbCAuL29uZS50c1xuLy8gQG9wdGlvbmFsIC4vcmVhZHkudHNcbi8vIEBvcHRpb25hbCAuL3RyaWdnZXIudHNcbi8vIEByZXF1aXJlIGNvcmUvcGx1Y2sudHNcbi8vIEByZXF1aXJlIGNvcmUvdmFyaWFibGVzLnRzXG5cblxuZnVuY3Rpb24gZ2V0VmFsdWUoZWxlKSB7XG4gIGlmIChlbGUubXVsdGlwbGUgJiYgZWxlLm9wdGlvbnMpIHJldHVybiBwbHVjayhmaWx0ZXIuY2FsbChlbGUub3B0aW9ucywgZnVuY3Rpb24gKG9wdGlvbikge1xuICAgIHJldHVybiBvcHRpb24uc2VsZWN0ZWQgJiYgIW9wdGlvbi5kaXNhYmxlZCAmJiAhb3B0aW9uLnBhcmVudE5vZGUuZGlzYWJsZWQ7XG4gIH0pLCAndmFsdWUnKTtcbiAgcmV0dXJuIGVsZS52YWx1ZSB8fCAnJztcbn1cblxudmFyIHF1ZXJ5RW5jb2RlU3BhY2VSZSA9IC8lMjAvZyxcbiAgICBxdWVyeUVuY29kZUNSTEZSZSA9IC9cXHI/XFxuL2c7XG5cbmZ1bmN0aW9uIHF1ZXJ5RW5jb2RlKHByb3AsIHZhbHVlKSB7XG4gIHJldHVybiBcIiZcIiArIGVuY29kZVVSSUNvbXBvbmVudChwcm9wKSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlLnJlcGxhY2UocXVlcnlFbmNvZGVDUkxGUmUsICdcXHJcXG4nKSkucmVwbGFjZShxdWVyeUVuY29kZVNwYWNlUmUsICcrJyk7XG59XG5cbnZhciBza2lwcGFibGVSZSA9IC9maWxlfHJlc2V0fHN1Ym1pdHxidXR0b258aW1hZ2UvaSxcbiAgICBjaGVja2FibGVSZSA9IC9yYWRpb3xjaGVja2JveC9pO1xuXG5mbi5zZXJpYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBxdWVyeSA9ICcnO1xuICB0aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIGVhY2goZWxlLmVsZW1lbnRzIHx8IFtlbGVdLCBmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgICBpZiAoZWxlLmRpc2FibGVkIHx8ICFlbGUubmFtZSB8fCBlbGUudGFnTmFtZSA9PT0gJ0ZJRUxEU0VUJyB8fCBza2lwcGFibGVSZS50ZXN0KGVsZS50eXBlKSB8fCBjaGVja2FibGVSZS50ZXN0KGVsZS50eXBlKSAmJiAhZWxlLmNoZWNrZWQpIHJldHVybjtcbiAgICAgIHZhciB2YWx1ZSA9IGdldFZhbHVlKGVsZSk7XG5cbiAgICAgIGlmICghaXNVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgICAgIHZhciB2YWx1ZXMgPSBpc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbiAgICAgICAgZWFjaCh2YWx1ZXMsIGZ1bmN0aW9uIChpLCB2YWx1ZSkge1xuICAgICAgICAgIHF1ZXJ5ICs9IHF1ZXJ5RW5jb2RlKGVsZS5uYW1lLCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIHF1ZXJ5LnNsaWNlKDEpO1xufTtcblxuZnVuY3Rpb24gdmFsKHZhbHVlKSB7XG4gIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRoaXNbMF0gJiYgZ2V0VmFsdWUodGhpc1swXSk7XG4gIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIHZhciBpc1NlbGVjdCA9IGVsZS5tdWx0aXBsZSAmJiBlbGUub3B0aW9ucztcblxuICAgIGlmIChpc1NlbGVjdCB8fCBjaGVja2FibGVSZS50ZXN0KGVsZS50eXBlKSkge1xuICAgICAgdmFyIGVsZVZhbHVlXzEgPSBpc0FycmF5KHZhbHVlKSA/IG1hcC5jYWxsKHZhbHVlLCBTdHJpbmcpIDogaXNOdWxsKHZhbHVlKSA/IFtdIDogW1N0cmluZyh2YWx1ZSldO1xuXG4gICAgICBpZiAoaXNTZWxlY3QpIHtcbiAgICAgICAgZWFjaChlbGUub3B0aW9ucywgZnVuY3Rpb24gKGksIG9wdGlvbikge1xuICAgICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IGVsZVZhbHVlXzEuaW5kZXhPZihvcHRpb24udmFsdWUpID49IDA7XG4gICAgICAgIH0sIHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlLmNoZWNrZWQgPSBlbGVWYWx1ZV8xLmluZGV4T2YoZWxlLnZhbHVlKSA+PSAwO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBlbGUudmFsdWUgPSBpc1VuZGVmaW5lZCh2YWx1ZSkgfHwgaXNOdWxsKHZhbHVlKSA/ICcnIDogdmFsdWU7XG4gICAgfVxuICB9KTtcbn1cblxuZm4udmFsID0gdmFsO1xuXG5mbi5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICByZXR1cm4gZWxlLmNsb25lTm9kZSh0cnVlKTtcbiAgfSk7XG59O1xuXG5mbi5kZXRhY2ggPSBmdW5jdGlvbiAoY29tcGFyYXRvcikge1xuICBmaWx0ZXJlZCh0aGlzLCBjb21wYXJhdG9yKS5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICBpZiAoZWxlLnBhcmVudE5vZGUpIHtcbiAgICAgIGVsZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsZSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG52YXIgZnJhZ21lbnRSZSA9IC9eXFxzKjwoXFx3KylbXj5dKj4vLFxuICAgIHNpbmdsZVRhZ1JlID0gL148KFxcdyspXFxzKlxcLz8+KD86PFxcL1xcMT4pPyQvO1xudmFyIGNvbnRhaW5lcnMgPSB7XG4gICcqJzogZGl2LFxuICB0cjogdGJvZHksXG4gIHRkOiB0cixcbiAgdGg6IHRyLFxuICB0aGVhZDogdGFibGUsXG4gIHRib2R5OiB0YWJsZSxcbiAgdGZvb3Q6IHRhYmxlXG59OyAvL1RPRE86IENyZWF0ZSBlbGVtZW50cyBpbnNpZGUgYSBkb2N1bWVudCBmcmFnbWVudCwgaW4gb3JkZXIgdG8gcHJldmVudCBpbmxpbmUgZXZlbnQgaGFuZGxlcnMgZnJvbSBmaXJpbmdcbi8vVE9ETzogRW5zdXJlIHRoZSBjcmVhdGVkIGVsZW1lbnRzIGhhdmUgdGhlIGZyYWdtZW50IGFzIHRoZWlyIHBhcmVudCBpbnN0ZWFkIG9mIG51bGwsIHRoaXMgYWxzbyBlbnN1cmVzIHdlIGNhbiBkZWFsIHdpdGggZGV0YXRjaGVkIG5vZGVzIG1vcmUgcmVsaWFibHlcblxuZnVuY3Rpb24gcGFyc2VIVE1MKGh0bWwpIHtcbiAgaWYgKCFpc1N0cmluZyhodG1sKSkgcmV0dXJuIFtdO1xuICBpZiAoc2luZ2xlVGFnUmUudGVzdChodG1sKSkgcmV0dXJuIFtjcmVhdGVFbGVtZW50KFJlZ0V4cC4kMSldO1xuICB2YXIgZnJhZ21lbnQgPSBmcmFnbWVudFJlLnRlc3QoaHRtbCkgJiYgUmVnRXhwLiQxLFxuICAgICAgY29udGFpbmVyID0gY29udGFpbmVyc1tmcmFnbWVudF0gfHwgY29udGFpbmVyc1snKiddO1xuICBjb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcbiAgcmV0dXJuIGNhc2goY29udGFpbmVyLmNoaWxkTm9kZXMpLmRldGFjaCgpLmdldCgpO1xufVxuXG5jYXNoLnBhcnNlSFRNTCA9IHBhcnNlSFRNTDtcblxuZm4uZW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIHdoaWxlIChlbGUuZmlyc3RDaGlsZCkge1xuICAgICAgZWxlLnJlbW92ZUNoaWxkKGVsZS5maXJzdENoaWxkKTtcbiAgICB9XG4gIH0pO1xufTtcblxuZnVuY3Rpb24gaHRtbChodG1sKSB7XG4gIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRoaXNbMF0gJiYgdGhpc1swXS5pbm5lckhUTUw7XG4gIGlmIChpc1VuZGVmaW5lZChodG1sKSkgcmV0dXJuIHRoaXM7XG4gIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIGlmICghaXNFbGVtZW50KGVsZSkpIHJldHVybjtcbiAgICBlbGUuaW5uZXJIVE1MID0gaHRtbDtcbiAgfSk7XG59XG5cbmZuLmh0bWwgPSBodG1sO1xuXG5mbi5yZW1vdmUgPSBmdW5jdGlvbiAoY29tcGFyYXRvcikge1xuICBmaWx0ZXJlZCh0aGlzLCBjb21wYXJhdG9yKS5kZXRhY2goKS5vZmYoKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiB0ZXh0KHRleHQpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKHRleHQpKSByZXR1cm4gdGhpc1swXSA/IHRoaXNbMF0udGV4dENvbnRlbnQgOiAnJztcbiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgaWYgKCFpc0VsZW1lbnQoZWxlKSkgcmV0dXJuO1xuICAgIGVsZS50ZXh0Q29udGVudCA9IHRleHQ7XG4gIH0pO1xufVxuXG47XG5mbi50ZXh0ID0gdGV4dDtcblxuZm4udW53cmFwID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLnBhcmVudCgpLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIGlmIChlbGUudGFnTmFtZSA9PT0gJ0JPRFknKSByZXR1cm47XG4gICAgdmFyICRlbGUgPSBjYXNoKGVsZSk7XG4gICAgJGVsZS5yZXBsYWNlV2l0aCgkZWxlLmNoaWxkcmVuKCkpO1xuICB9KTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mbi5vZmZzZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlbGUgPSB0aGlzWzBdO1xuICBpZiAoIWVsZSkgcmV0dXJuO1xuICB2YXIgcmVjdCA9IGVsZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgcmV0dXJuIHtcbiAgICB0b3A6IHJlY3QudG9wICsgd2luLnBhZ2VZT2Zmc2V0LFxuICAgIGxlZnQ6IHJlY3QubGVmdCArIHdpbi5wYWdlWE9mZnNldFxuICB9O1xufTtcblxuZm4ub2Zmc2V0UGFyZW50ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIHZhciBvZmZzZXRQYXJlbnQgPSBlbGUub2Zmc2V0UGFyZW50O1xuXG4gICAgd2hpbGUgKG9mZnNldFBhcmVudCAmJiBjb21wdXRlU3R5bGUob2Zmc2V0UGFyZW50LCAncG9zaXRpb24nKSA9PT0gJ3N0YXRpYycpIHtcbiAgICAgIG9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5vZmZzZXRQYXJlbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9mZnNldFBhcmVudCB8fCBkb2NFbGU7XG4gIH0pO1xufTtcblxuZm4ucG9zaXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlbGUgPSB0aGlzWzBdO1xuICBpZiAoIWVsZSkgcmV0dXJuO1xuICB2YXIgaXNGaXhlZCA9IGNvbXB1dGVTdHlsZShlbGUsICdwb3NpdGlvbicpID09PSAnZml4ZWQnLFxuICAgICAgb2Zmc2V0ID0gaXNGaXhlZCA/IGVsZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA6IHRoaXMub2Zmc2V0KCk7XG5cbiAgaWYgKCFpc0ZpeGVkKSB7XG4gICAgdmFyIGRvY18xID0gZWxlLm93bmVyRG9jdW1lbnQ7XG4gICAgdmFyIG9mZnNldFBhcmVudCA9IGVsZS5vZmZzZXRQYXJlbnQgfHwgZG9jXzEuZG9jdW1lbnRFbGVtZW50O1xuXG4gICAgd2hpbGUgKChvZmZzZXRQYXJlbnQgPT09IGRvY18xLmJvZHkgfHwgb2Zmc2V0UGFyZW50ID09PSBkb2NfMS5kb2N1bWVudEVsZW1lbnQpICYmIGNvbXB1dGVTdHlsZShvZmZzZXRQYXJlbnQsICdwb3NpdGlvbicpID09PSAnc3RhdGljJykge1xuICAgICAgb2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50LnBhcmVudE5vZGU7XG4gICAgfVxuXG4gICAgaWYgKG9mZnNldFBhcmVudCAhPT0gZWxlICYmIGlzRWxlbWVudChvZmZzZXRQYXJlbnQpKSB7XG4gICAgICB2YXIgcGFyZW50T2Zmc2V0ID0gY2FzaChvZmZzZXRQYXJlbnQpLm9mZnNldCgpO1xuICAgICAgb2Zmc2V0LnRvcCAtPSBwYXJlbnRPZmZzZXQudG9wICsgY29tcHV0ZVN0eWxlSW50KG9mZnNldFBhcmVudCwgJ2JvcmRlclRvcFdpZHRoJyk7XG4gICAgICBvZmZzZXQubGVmdCAtPSBwYXJlbnRPZmZzZXQubGVmdCArIGNvbXB1dGVTdHlsZUludChvZmZzZXRQYXJlbnQsICdib3JkZXJMZWZ0V2lkdGgnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHRvcDogb2Zmc2V0LnRvcCAtIGNvbXB1dGVTdHlsZUludChlbGUsICdtYXJnaW5Ub3AnKSxcbiAgICBsZWZ0OiBvZmZzZXQubGVmdCAtIGNvbXB1dGVTdHlsZUludChlbGUsICdtYXJnaW5MZWZ0JylcbiAgfTtcbn07XG5cbmZuLmNoaWxkcmVuID0gZnVuY3Rpb24gKGNvbXBhcmF0b3IpIHtcbiAgcmV0dXJuIGZpbHRlcmVkKGNhc2godW5pcXVlKHBsdWNrKHRoaXMsIGZ1bmN0aW9uIChlbGUpIHtcbiAgICByZXR1cm4gZWxlLmNoaWxkcmVuO1xuICB9KSkpLCBjb21wYXJhdG9yKTtcbn07XG5cbmZuLmNvbnRlbnRzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gY2FzaCh1bmlxdWUocGx1Y2sodGhpcywgZnVuY3Rpb24gKGVsZSkge1xuICAgIHJldHVybiBlbGUudGFnTmFtZSA9PT0gJ0lGUkFNRScgPyBbZWxlLmNvbnRlbnREb2N1bWVudF0gOiBlbGUudGFnTmFtZSA9PT0gJ1RFTVBMQVRFJyA/IGVsZS5jb250ZW50LmNoaWxkTm9kZXMgOiBlbGUuY2hpbGROb2RlcztcbiAgfSkpKTtcbn07XG5cbmZuLmZpbmQgPSBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgcmV0dXJuIGNhc2godW5pcXVlKHBsdWNrKHRoaXMsIGZ1bmN0aW9uIChlbGUpIHtcbiAgICByZXR1cm4gZmluZChzZWxlY3RvciwgZWxlKTtcbiAgfSkpKTtcbn07IC8vIEByZXF1aXJlIGNvcmUvdmFyaWFibGVzLnRzXG4vLyBAcmVxdWlyZSBjb2xsZWN0aW9uL2ZpbHRlci50c1xuLy8gQHJlcXVpcmUgdHJhdmVyc2FsL2ZpbmQudHNcblxuXG52YXIgSFRNTENEQVRBUmUgPSAvXlxccyo8ISg/OlxcW0NEQVRBXFxbfC0tKXwoPzpcXF1cXF18LS0pPlxccyokL2csXG4gICAgc2NyaXB0VHlwZVJlID0gL14kfF5tb2R1bGUkfFxcLyhqYXZhfGVjbWEpc2NyaXB0L2ksXG4gICAgc2NyaXB0QXR0cmlidXRlcyA9IFsndHlwZScsICdzcmMnLCAnbm9uY2UnLCAnbm9Nb2R1bGUnXTtcblxuZnVuY3Rpb24gZXZhbFNjcmlwdHMobm9kZSwgZG9jKSB7XG4gIHZhciBjb2xsZWN0aW9uID0gY2FzaChub2RlKTtcbiAgY29sbGVjdGlvbi5maWx0ZXIoJ3NjcmlwdCcpLmFkZChjb2xsZWN0aW9uLmZpbmQoJ3NjcmlwdCcpKS5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICBpZiAoc2NyaXB0VHlwZVJlLnRlc3QoZWxlLnR5cGUpICYmIGRvY0VsZS5jb250YWlucyhlbGUpKSB7XG4gICAgICAvLyBUaGUgc2NyaXB0IHR5cGUgaXMgc3VwcG9ydGVkIC8vIFRoZSBlbGVtZW50IGlzIGF0dGFjaGVkIHRvIHRoZSBET00gLy8gVXNpbmcgYGRvY3VtZW50RWxlbWVudGAgZm9yIGJyb2FkZXIgYnJvd3NlciBzdXBwb3J0XG4gICAgICB2YXIgc2NyaXB0XzEgPSBjcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgIHNjcmlwdF8xLnRleHQgPSBlbGUudGV4dENvbnRlbnQucmVwbGFjZShIVE1MQ0RBVEFSZSwgJycpO1xuICAgICAgZWFjaChzY3JpcHRBdHRyaWJ1dGVzLCBmdW5jdGlvbiAoaSwgYXR0cikge1xuICAgICAgICBpZiAoZWxlW2F0dHJdKSBzY3JpcHRfMVthdHRyXSA9IGVsZVthdHRyXTtcbiAgICAgIH0pO1xuICAgICAgZG9jLmhlYWQuaW5zZXJ0QmVmb3JlKHNjcmlwdF8xLCBudWxsKTtcbiAgICAgIGRvYy5oZWFkLnJlbW92ZUNoaWxkKHNjcmlwdF8xKTtcbiAgICB9XG4gIH0pO1xufSAvLyBAcmVxdWlyZSAuL2V2YWxfc2NyaXB0cy50c1xuXG5cbmZ1bmN0aW9uIGluc2VydEVsZW1lbnQoYW5jaG9yLCB0YXJnZXQsIGxlZnQsIGluc2lkZSwgZXZhbHVhdGUpIHtcbiAgaWYgKGluc2lkZSkge1xuICAgIC8vIHByZXBlbmQvYXBwZW5kXG4gICAgYW5jaG9yLmluc2VydEJlZm9yZSh0YXJnZXQsIGxlZnQgPyBhbmNob3IuZmlyc3RDaGlsZCA6IG51bGwpO1xuICB9IGVsc2Uge1xuICAgIC8vIGJlZm9yZS9hZnRlclxuICAgIGFuY2hvci5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0YXJnZXQsIGxlZnQgPyBhbmNob3IgOiBhbmNob3IubmV4dFNpYmxpbmcpO1xuICB9XG5cbiAgaWYgKGV2YWx1YXRlKSB7XG4gICAgZXZhbFNjcmlwdHModGFyZ2V0LCBhbmNob3Iub3duZXJEb2N1bWVudCk7XG4gIH1cbn0gLy8gQHJlcXVpcmUgLi9pbnNlcnRfZWxlbWVudC50c1xuXG5cbmZ1bmN0aW9uIGluc2VydFNlbGVjdG9ycyhzZWxlY3RvcnMsIGFuY2hvcnMsIGludmVyc2UsIGxlZnQsIGluc2lkZSwgcmV2ZXJzZUxvb3AxLCByZXZlcnNlTG9vcDIsIHJldmVyc2VMb29wMykge1xuICBlYWNoKHNlbGVjdG9ycywgZnVuY3Rpb24gKHNpLCBzZWxlY3Rvcikge1xuICAgIGVhY2goY2FzaChzZWxlY3RvciksIGZ1bmN0aW9uICh0aSwgdGFyZ2V0KSB7XG4gICAgICBlYWNoKGNhc2goYW5jaG9ycyksIGZ1bmN0aW9uIChhaSwgYW5jaG9yKSB7XG4gICAgICAgIHZhciBhbmNob3JGaW5hbCA9IGludmVyc2UgPyB0YXJnZXQgOiBhbmNob3IsXG4gICAgICAgICAgICB0YXJnZXRGaW5hbCA9IGludmVyc2UgPyBhbmNob3IgOiB0YXJnZXQsXG4gICAgICAgICAgICBpbmRleEZpbmFsID0gaW52ZXJzZSA/IHRpIDogYWk7XG4gICAgICAgIGluc2VydEVsZW1lbnQoYW5jaG9yRmluYWwsICFpbmRleEZpbmFsID8gdGFyZ2V0RmluYWwgOiB0YXJnZXRGaW5hbC5jbG9uZU5vZGUodHJ1ZSksIGxlZnQsIGluc2lkZSwgIWluZGV4RmluYWwpO1xuICAgICAgfSwgcmV2ZXJzZUxvb3AzKTtcbiAgICB9LCByZXZlcnNlTG9vcDIpO1xuICB9LCByZXZlcnNlTG9vcDEpO1xuICByZXR1cm4gYW5jaG9ycztcbn1cblxuZm4uYWZ0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBpbnNlcnRTZWxlY3RvcnMoYXJndW1lbnRzLCB0aGlzLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCB0cnVlKTtcbn07XG5cbmZuLmFwcGVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGluc2VydFNlbGVjdG9ycyhhcmd1bWVudHMsIHRoaXMsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7XG59O1xuXG5mbi5hcHBlbmRUbyA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICByZXR1cm4gaW5zZXJ0U2VsZWN0b3JzKGFyZ3VtZW50cywgdGhpcywgdHJ1ZSwgZmFsc2UsIHRydWUpO1xufTtcblxuZm4uYmVmb3JlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gaW5zZXJ0U2VsZWN0b3JzKGFyZ3VtZW50cywgdGhpcywgZmFsc2UsIHRydWUpO1xufTtcblxuZm4uaW5zZXJ0QWZ0ZXIgPSBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgcmV0dXJuIGluc2VydFNlbGVjdG9ycyhhcmd1bWVudHMsIHRoaXMsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTtcbn07XG5cbmZuLmluc2VydEJlZm9yZSA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICByZXR1cm4gaW5zZXJ0U2VsZWN0b3JzKGFyZ3VtZW50cywgdGhpcywgdHJ1ZSwgdHJ1ZSk7XG59O1xuXG5mbi5wcmVwZW5kID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gaW5zZXJ0U2VsZWN0b3JzKGFyZ3VtZW50cywgdGhpcywgZmFsc2UsIHRydWUsIHRydWUsIHRydWUsIHRydWUpO1xufTtcblxuZm4ucHJlcGVuZFRvID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gIHJldHVybiBpbnNlcnRTZWxlY3RvcnMoYXJndW1lbnRzLCB0aGlzLCB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIHRydWUpO1xufTtcblxuZm4ucmVwbGFjZVdpdGggPSBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgcmV0dXJuIHRoaXMuYmVmb3JlKHNlbGVjdG9yKS5yZW1vdmUoKTtcbn07XG5cbmZuLnJlcGxhY2VBbGwgPSBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgY2FzaChzZWxlY3RvcikucmVwbGFjZVdpdGgodGhpcyk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuZm4ud3JhcEFsbCA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICB2YXIgc3RydWN0dXJlID0gY2FzaChzZWxlY3RvciksXG4gICAgICB3cmFwcGVyID0gc3RydWN0dXJlWzBdO1xuXG4gIHdoaWxlICh3cmFwcGVyLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgIHdyYXBwZXIgPSB3cmFwcGVyLmZpcnN0RWxlbWVudENoaWxkO1xuICB9XG5cbiAgdGhpcy5maXJzdCgpLmJlZm9yZShzdHJ1Y3R1cmUpO1xuICByZXR1cm4gdGhpcy5hcHBlbmRUbyh3cmFwcGVyKTtcbn07XG5cbmZuLndyYXAgPSBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgdmFyIHdyYXBwZXIgPSBjYXNoKHNlbGVjdG9yKVswXTtcbiAgICBjYXNoKGVsZSkud3JhcEFsbCghaSA/IHdyYXBwZXIgOiB3cmFwcGVyLmNsb25lTm9kZSh0cnVlKSk7XG4gIH0pO1xufTtcblxuZm4ud3JhcElubmVyID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIHZhciAkZWxlID0gY2FzaChlbGUpLFxuICAgICAgICBjb250ZW50cyA9ICRlbGUuY29udGVudHMoKTtcbiAgICBjb250ZW50cy5sZW5ndGggPyBjb250ZW50cy53cmFwQWxsKHNlbGVjdG9yKSA6ICRlbGUuYXBwZW5kKHNlbGVjdG9yKTtcbiAgfSk7XG59O1xuXG5mbi5oYXMgPSBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgdmFyIGNvbXBhcmF0b3IgPSBpc1N0cmluZyhzZWxlY3RvcikgPyBmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgcmV0dXJuIGZpbmQoc2VsZWN0b3IsIGVsZSkubGVuZ3RoO1xuICB9IDogZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIHJldHVybiBlbGUuY29udGFpbnMoc2VsZWN0b3IpO1xuICB9O1xuICByZXR1cm4gdGhpcy5maWx0ZXIoY29tcGFyYXRvcik7XG59O1xuXG5mbi5pcyA9IGZ1bmN0aW9uIChjb21wYXJhdG9yKSB7XG4gIHZhciBjb21wYXJlID0gZ2V0Q29tcGFyZUZ1bmN0aW9uKGNvbXBhcmF0b3IpO1xuICByZXR1cm4gc29tZS5jYWxsKHRoaXMsIGZ1bmN0aW9uIChlbGUsIGkpIHtcbiAgICByZXR1cm4gY29tcGFyZS5jYWxsKGVsZSwgaSwgZWxlKTtcbiAgfSk7XG59O1xuXG5mbi5uZXh0ID0gZnVuY3Rpb24gKGNvbXBhcmF0b3IsIF9hbGwsIF91bnRpbCkge1xuICByZXR1cm4gZmlsdGVyZWQoY2FzaCh1bmlxdWUocGx1Y2sodGhpcywgJ25leHRFbGVtZW50U2libGluZycsIF9hbGwsIF91bnRpbCkpKSwgY29tcGFyYXRvcik7XG59O1xuXG5mbi5uZXh0QWxsID0gZnVuY3Rpb24gKGNvbXBhcmF0b3IpIHtcbiAgcmV0dXJuIHRoaXMubmV4dChjb21wYXJhdG9yLCB0cnVlKTtcbn07XG5cbmZuLm5leHRVbnRpbCA9IGZ1bmN0aW9uICh1bnRpbCwgY29tcGFyYXRvcikge1xuICByZXR1cm4gdGhpcy5uZXh0KGNvbXBhcmF0b3IsIHRydWUsIHVudGlsKTtcbn07XG5cbmZuLm5vdCA9IGZ1bmN0aW9uIChjb21wYXJhdG9yKSB7XG4gIHZhciBjb21wYXJlID0gZ2V0Q29tcGFyZUZ1bmN0aW9uKGNvbXBhcmF0b3IpO1xuICByZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIHJldHVybiAoIWlzU3RyaW5nKGNvbXBhcmF0b3IpIHx8IGlzRWxlbWVudChlbGUpKSAmJiAhY29tcGFyZS5jYWxsKGVsZSwgaSwgZWxlKTtcbiAgfSk7XG59O1xuXG5mbi5wYXJlbnQgPSBmdW5jdGlvbiAoY29tcGFyYXRvcikge1xuICByZXR1cm4gZmlsdGVyZWQoY2FzaCh1bmlxdWUocGx1Y2sodGhpcywgJ3BhcmVudE5vZGUnKSkpLCBjb21wYXJhdG9yKTtcbn07XG5cbmZuLmluZGV4ID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gIHZhciBjaGlsZCA9IHNlbGVjdG9yID8gY2FzaChzZWxlY3RvcilbMF0gOiB0aGlzWzBdLFxuICAgICAgY29sbGVjdGlvbiA9IHNlbGVjdG9yID8gdGhpcyA6IGNhc2goY2hpbGQpLnBhcmVudCgpLmNoaWxkcmVuKCk7XG4gIHJldHVybiBpbmRleE9mLmNhbGwoY29sbGVjdGlvbiwgY2hpbGQpO1xufTtcblxuZm4uY2xvc2VzdCA9IGZ1bmN0aW9uIChjb21wYXJhdG9yKSB7XG4gIHZhciBmaWx0ZXJlZCA9IHRoaXMuZmlsdGVyKGNvbXBhcmF0b3IpO1xuICBpZiAoZmlsdGVyZWQubGVuZ3RoKSByZXR1cm4gZmlsdGVyZWQ7XG4gIHZhciAkcGFyZW50ID0gdGhpcy5wYXJlbnQoKTtcbiAgaWYgKCEkcGFyZW50Lmxlbmd0aCkgcmV0dXJuIGZpbHRlcmVkO1xuICByZXR1cm4gJHBhcmVudC5jbG9zZXN0KGNvbXBhcmF0b3IpO1xufTtcblxuZm4ucGFyZW50cyA9IGZ1bmN0aW9uIChjb21wYXJhdG9yLCBfdW50aWwpIHtcbiAgcmV0dXJuIGZpbHRlcmVkKGNhc2godW5pcXVlKHBsdWNrKHRoaXMsICdwYXJlbnRFbGVtZW50JywgdHJ1ZSwgX3VudGlsKSkpLCBjb21wYXJhdG9yKTtcbn07XG5cbmZuLnBhcmVudHNVbnRpbCA9IGZ1bmN0aW9uICh1bnRpbCwgY29tcGFyYXRvcikge1xuICByZXR1cm4gdGhpcy5wYXJlbnRzKGNvbXBhcmF0b3IsIHVudGlsKTtcbn07XG5cbmZuLnByZXYgPSBmdW5jdGlvbiAoY29tcGFyYXRvciwgX2FsbCwgX3VudGlsKSB7XG4gIHJldHVybiBmaWx0ZXJlZChjYXNoKHVuaXF1ZShwbHVjayh0aGlzLCAncHJldmlvdXNFbGVtZW50U2libGluZycsIF9hbGwsIF91bnRpbCkpKSwgY29tcGFyYXRvcik7XG59O1xuXG5mbi5wcmV2QWxsID0gZnVuY3Rpb24gKGNvbXBhcmF0b3IpIHtcbiAgcmV0dXJuIHRoaXMucHJldihjb21wYXJhdG9yLCB0cnVlKTtcbn07XG5cbmZuLnByZXZVbnRpbCA9IGZ1bmN0aW9uICh1bnRpbCwgY29tcGFyYXRvcikge1xuICByZXR1cm4gdGhpcy5wcmV2KGNvbXBhcmF0b3IsIHRydWUsIHVudGlsKTtcbn07XG5cbmZuLnNpYmxpbmdzID0gZnVuY3Rpb24gKGNvbXBhcmF0b3IpIHtcbiAgcmV0dXJuIGZpbHRlcmVkKGNhc2godW5pcXVlKHBsdWNrKHRoaXMsIGZ1bmN0aW9uIChlbGUpIHtcbiAgICByZXR1cm4gY2FzaChlbGUpLnBhcmVudCgpLmNoaWxkcmVuKCkubm90KGVsZSk7XG4gIH0pKSksIGNvbXBhcmF0b3IpO1xufTsgLy8gQG9wdGlvbmFsIC4vY2hpbGRyZW4udHNcbi8vIEBvcHRpb25hbCAuL2Nsb3Nlc3QudHNcbi8vIEBvcHRpb25hbCAuL2NvbnRlbnRzLnRzXG4vLyBAb3B0aW9uYWwgLi9maW5kLnRzXG4vLyBAb3B0aW9uYWwgLi9oYXMudHNcbi8vIEBvcHRpb25hbCAuL2lzLnRzXG4vLyBAb3B0aW9uYWwgLi9uZXh0LnRzXG4vLyBAb3B0aW9uYWwgLi9uZXh0X2FsbC50c1xuLy8gQG9wdGlvbmFsIC4vbmV4dF91bnRpbC50c1xuLy8gQG9wdGlvbmFsIC4vbm90LnRzXG4vLyBAb3B0aW9uYWwgLi9wYXJlbnQudHNcbi8vIEBvcHRpb25hbCAuL3BhcmVudHMudHNcbi8vIEBvcHRpb25hbCAuL3BhcmVudHNfdW50aWwudHNcbi8vIEBvcHRpb25hbCAuL3ByZXYudHNcbi8vIEBvcHRpb25hbCAuL3ByZXZfYWxsLnRzXG4vLyBAb3B0aW9uYWwgLi9wcmV2X3VudGlsLnRzXG4vLyBAb3B0aW9uYWwgLi9zaWJsaW5ncy50c1xuLy8gQG9wdGlvbmFsIGF0dHJpYnV0ZXMvaW5kZXgudHNcbi8vIEBvcHRpb25hbCBjb2xsZWN0aW9uL2luZGV4LnRzXG4vLyBAb3B0aW9uYWwgY3NzL2luZGV4LnRzXG4vLyBAb3B0aW9uYWwgZGF0YS9pbmRleC50c1xuLy8gQG9wdGlvbmFsIGRpbWVuc2lvbnMvaW5kZXgudHNcbi8vIEBvcHRpb25hbCBlZmZlY3RzL2luZGV4LnRzXG4vLyBAb3B0aW9uYWwgZXZlbnRzL2luZGV4LnRzXG4vLyBAb3B0aW9uYWwgZm9ybXMvaW5kZXgudHNcbi8vIEBvcHRpb25hbCBtYW5pcHVsYXRpb24vaW5kZXgudHNcbi8vIEBvcHRpb25hbCBvZmZzZXQvaW5kZXgudHNcbi8vIEBvcHRpb25hbCB0cmF2ZXJzYWwvaW5kZXgudHNcbi8vIEByZXF1aXJlIGNvcmUvaW5kZXgudHNcbi8vIEBwcmlvcml0eSAtMTAwXG4vLyBAcmVxdWlyZSAuL2Nhc2gudHNcbi8vIEByZXF1aXJlIC4vdmFyaWFibGVzLnRzXG5cblxuaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAvLyBOb2RlLmpzXG4gIG1vZHVsZS5leHBvcnRzID0gY2FzaDtcbn0gZWxzZSB7XG4gIC8vIEJyb3dzZXJcbiAgd2luWydjYXNoJ10gPSB3aW5bJyQnXSA9IGNhc2g7XG59XG59KSgpOyIsIid1c2Ugc3RyaWN0JztcblxuKGZ1bmN0aW9uICgpIHtcbiAgdmFyIG91dCQgPSB0eXBlb2YgZXhwb3J0cyAhPSAndW5kZWZpbmVkJyAmJiBleHBvcnRzIHx8IHR5cGVvZiBkZWZpbmUgIT0gJ3VuZGVmaW5lZCcgJiYge30gfHwgdGhpcyB8fCB3aW5kb3c7XG4gIGlmICh0eXBlb2YgZGVmaW5lICE9PSAndW5kZWZpbmVkJykgZGVmaW5lKCdzYXZlLXN2Zy1hcy1wbmcnLCBbXSwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBvdXQkO1xuICB9KTtcbiAgb3V0JC5kZWZhdWx0ID0gb3V0JDtcblxuICB2YXIgeG1sTnMgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8nO1xuICB2YXIgeGh0bWxOcyA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJztcbiAgdmFyIHN2Z05zID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJztcbiAgdmFyIGRvY3R5cGUgPSAnPD94bWwgdmVyc2lvbj1cIjEuMFwiIHN0YW5kYWxvbmU9XCJub1wiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyBcIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOXCIgXCJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGRcIiBbPCFFTlRJVFkgbmJzcCBcIiYjMTYwO1wiPl0+JztcbiAgdmFyIHVybFJlZ2V4ID0gL3VybFxcKFtcIiddPyguKz8pW1wiJ10/XFwpLztcbiAgdmFyIGZvbnRGb3JtYXRzID0ge1xuICAgIHdvZmYyOiAnZm9udC93b2ZmMicsXG4gICAgd29mZjogJ2ZvbnQvd29mZicsXG4gICAgb3RmOiAnYXBwbGljYXRpb24veC1mb250LW9wZW50eXBlJyxcbiAgICB0dGY6ICdhcHBsaWNhdGlvbi94LWZvbnQtdHRmJyxcbiAgICBlb3Q6ICdhcHBsaWNhdGlvbi92bmQubXMtZm9udG9iamVjdCcsXG4gICAgc2ZudDogJ2FwcGxpY2F0aW9uL2ZvbnQtc2ZudCcsXG4gICAgc3ZnOiAnaW1hZ2Uvc3ZnK3htbCdcbiAgfTtcblxuICB2YXIgaXNFbGVtZW50ID0gZnVuY3Rpb24gaXNFbGVtZW50KG9iaikge1xuICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCBvYmogaW5zdGFuY2VvZiBTVkdFbGVtZW50O1xuICB9O1xuICB2YXIgcmVxdWlyZURvbU5vZGUgPSBmdW5jdGlvbiByZXF1aXJlRG9tTm9kZShlbCkge1xuICAgIGlmICghaXNFbGVtZW50KGVsKSkgdGhyb3cgbmV3IEVycm9yKCdhbiBIVE1MRWxlbWVudCBvciBTVkdFbGVtZW50IGlzIHJlcXVpcmVkOyBnb3QgJyArIGVsKTtcbiAgfTtcbiAgdmFyIHJlcXVpcmVEb21Ob2RlUHJvbWlzZSA9IGZ1bmN0aW9uIHJlcXVpcmVEb21Ob2RlUHJvbWlzZShlbCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBpZiAoaXNFbGVtZW50KGVsKSkgcmVzb2x2ZShlbCk7ZWxzZSByZWplY3QobmV3IEVycm9yKCdhbiBIVE1MRWxlbWVudCBvciBTVkdFbGVtZW50IGlzIHJlcXVpcmVkOyBnb3QgJyArIGVsKSk7XG4gICAgfSk7XG4gIH07XG4gIHZhciBpc0V4dGVybmFsID0gZnVuY3Rpb24gaXNFeHRlcm5hbCh1cmwpIHtcbiAgICByZXR1cm4gdXJsICYmIHVybC5sYXN0SW5kZXhPZignaHR0cCcsIDApID09PSAwICYmIHVybC5sYXN0SW5kZXhPZih3aW5kb3cubG9jYXRpb24uaG9zdCkgPT09IC0xO1xuICB9O1xuXG4gIHZhciBnZXRGb250TWltZVR5cGVGcm9tVXJsID0gZnVuY3Rpb24gZ2V0Rm9udE1pbWVUeXBlRnJvbVVybChmb250VXJsKSB7XG4gICAgdmFyIGZvcm1hdHMgPSBPYmplY3Qua2V5cyhmb250Rm9ybWF0cykuZmlsdGVyKGZ1bmN0aW9uIChleHRlbnNpb24pIHtcbiAgICAgIHJldHVybiBmb250VXJsLmluZGV4T2YoJy4nICsgZXh0ZW5zaW9uKSA+IDA7XG4gICAgfSkubWFwKGZ1bmN0aW9uIChleHRlbnNpb24pIHtcbiAgICAgIHJldHVybiBmb250Rm9ybWF0c1tleHRlbnNpb25dO1xuICAgIH0pO1xuICAgIGlmIChmb3JtYXRzKSByZXR1cm4gZm9ybWF0c1swXTtcbiAgICBjb25zb2xlLmVycm9yKCdVbmtub3duIGZvbnQgZm9ybWF0IGZvciAnICsgZm9udFVybCArICcuIEZvbnRzIG1heSBub3QgYmUgd29ya2luZyBjb3JyZWN0bHkuJyk7XG4gICAgcmV0dXJuICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nO1xuICB9O1xuXG4gIHZhciBhcnJheUJ1ZmZlclRvQmFzZTY0ID0gZnVuY3Rpb24gYXJyYXlCdWZmZXJUb0Jhc2U2NChidWZmZXIpIHtcbiAgICB2YXIgYmluYXJ5ID0gJyc7XG4gICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmJ5dGVMZW5ndGg7IGkrKykge1xuICAgICAgYmluYXJ5ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0pO1xuICAgIH1yZXR1cm4gd2luZG93LmJ0b2EoYmluYXJ5KTtcbiAgfTtcblxuICB2YXIgZ2V0RGltZW5zaW9uID0gZnVuY3Rpb24gZ2V0RGltZW5zaW9uKGVsLCBjbG9uZSwgZGltKSB7XG4gICAgdmFyIHYgPSBlbC52aWV3Qm94ICYmIGVsLnZpZXdCb3guYmFzZVZhbCAmJiBlbC52aWV3Qm94LmJhc2VWYWxbZGltXSB8fCBjbG9uZS5nZXRBdHRyaWJ1dGUoZGltKSAhPT0gbnVsbCAmJiAhY2xvbmUuZ2V0QXR0cmlidXRlKGRpbSkubWF0Y2goLyUkLykgJiYgcGFyc2VJbnQoY2xvbmUuZ2V0QXR0cmlidXRlKGRpbSkpIHx8IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW2RpbV0gfHwgcGFyc2VJbnQoY2xvbmUuc3R5bGVbZGltXSkgfHwgcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpLmdldFByb3BlcnR5VmFsdWUoZGltKSk7XG4gICAgcmV0dXJuIHR5cGVvZiB2ID09PSAndW5kZWZpbmVkJyB8fCB2ID09PSBudWxsIHx8IGlzTmFOKHBhcnNlRmxvYXQodikpID8gMCA6IHY7XG4gIH07XG5cbiAgdmFyIGdldERpbWVuc2lvbnMgPSBmdW5jdGlvbiBnZXREaW1lbnNpb25zKGVsLCBjbG9uZSwgd2lkdGgsIGhlaWdodCkge1xuICAgIGlmIChlbC50YWdOYW1lID09PSAnc3ZnJykgcmV0dXJuIHtcbiAgICAgIHdpZHRoOiB3aWR0aCB8fCBnZXREaW1lbnNpb24oZWwsIGNsb25lLCAnd2lkdGgnKSxcbiAgICAgIGhlaWdodDogaGVpZ2h0IHx8IGdldERpbWVuc2lvbihlbCwgY2xvbmUsICdoZWlnaHQnKVxuICAgIH07ZWxzZSBpZiAoZWwuZ2V0QkJveCkge1xuICAgICAgdmFyIF9lbCRnZXRCQm94ID0gZWwuZ2V0QkJveCgpLFxuICAgICAgICAgIHggPSBfZWwkZ2V0QkJveC54LFxuICAgICAgICAgIHkgPSBfZWwkZ2V0QkJveC55LFxuICAgICAgICAgIF93aWR0aCA9IF9lbCRnZXRCQm94LndpZHRoLFxuICAgICAgICAgIF9oZWlnaHQgPSBfZWwkZ2V0QkJveC5oZWlnaHQ7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHdpZHRoOiB4ICsgX3dpZHRoLFxuICAgICAgICBoZWlnaHQ6IHkgKyBfaGVpZ2h0XG4gICAgICB9O1xuICAgIH1cbiAgfTtcblxuICB2YXIgcmVFbmNvZGUgPSBmdW5jdGlvbiByZUVuY29kZShkYXRhKSB7XG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlbmNvZGVVUklDb21wb25lbnQoZGF0YSkucmVwbGFjZSgvJShbMC05QS1GXXsyfSkvZywgZnVuY3Rpb24gKG1hdGNoLCBwMSkge1xuICAgICAgdmFyIGMgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCcweCcgKyBwMSk7XG4gICAgICByZXR1cm4gYyA9PT0gJyUnID8gJyUyNScgOiBjO1xuICAgIH0pKTtcbiAgfTtcblxuICB2YXIgdXJpVG9CbG9iID0gZnVuY3Rpb24gdXJpVG9CbG9iKHVyaSkge1xuICAgIHZhciBieXRlU3RyaW5nID0gd2luZG93LmF0b2IodXJpLnNwbGl0KCcsJylbMV0pO1xuICAgIHZhciBtaW1lU3RyaW5nID0gdXJpLnNwbGl0KCcsJylbMF0uc3BsaXQoJzonKVsxXS5zcGxpdCgnOycpWzBdO1xuICAgIHZhciBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoYnl0ZVN0cmluZy5sZW5ndGgpO1xuICAgIHZhciBpbnRBcnJheSA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlU3RyaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpbnRBcnJheVtpXSA9IGJ5dGVTdHJpbmcuY2hhckNvZGVBdChpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBCbG9iKFtidWZmZXJdLCB7IHR5cGU6IG1pbWVTdHJpbmcgfSk7XG4gIH07XG5cbiAgdmFyIHF1ZXJ5ID0gZnVuY3Rpb24gcXVlcnkoZWwsIHNlbGVjdG9yKSB7XG4gICAgaWYgKCFzZWxlY3RvcikgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZWwucXVlcnlTZWxlY3RvcihzZWxlY3RvcikgfHwgZWwucGFyZW50Tm9kZSAmJiBlbC5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKCdJbnZhbGlkIENTUyBzZWxlY3RvciBcIicgKyBzZWxlY3RvciArICdcIicsIGVycik7XG4gICAgfVxuICB9O1xuXG4gIHZhciBkZXRlY3RDc3NGb250ID0gZnVuY3Rpb24gZGV0ZWN0Q3NzRm9udChydWxlLCBocmVmKSB7XG4gICAgLy8gTWF0Y2ggQ1NTIGZvbnQtZmFjZSBydWxlcyB0byBleHRlcm5hbCBsaW5rcy5cbiAgICAvLyBAZm9udC1mYWNlIHtcbiAgICAvLyAgIHNyYzogbG9jYWwoJ0FiZWwnKSwgdXJsKGh0dHBzOi8vZm9udHMuZ3N0YXRpYy5jb20vcy9hYmVsL3Y2L1V6Ti1pZWpSMVZvWFUyT2MtN0xzYnZlc1pXMnhPUS14c05xTzQ3bTU1REEud29mZjIpO1xuICAgIC8vIH1cbiAgICB2YXIgbWF0Y2ggPSBydWxlLmNzc1RleHQubWF0Y2godXJsUmVnZXgpO1xuICAgIHZhciB1cmwgPSBtYXRjaCAmJiBtYXRjaFsxXSB8fCAnJztcbiAgICBpZiAoIXVybCB8fCB1cmwubWF0Y2goL15kYXRhOi8pIHx8IHVybCA9PT0gJ2Fib3V0OmJsYW5rJykgcmV0dXJuO1xuICAgIHZhciBmdWxsVXJsID0gdXJsLnN0YXJ0c1dpdGgoJy4uLycpID8gaHJlZiArICcvLi4vJyArIHVybCA6IHVybC5zdGFydHNXaXRoKCcuLycpID8gaHJlZiArICcvLicgKyB1cmwgOiB1cmw7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRleHQ6IHJ1bGUuY3NzVGV4dCxcbiAgICAgIGZvcm1hdDogZ2V0Rm9udE1pbWVUeXBlRnJvbVVybChmdWxsVXJsKSxcbiAgICAgIHVybDogZnVsbFVybFxuICAgIH07XG4gIH07XG5cbiAgdmFyIGlubGluZUltYWdlcyA9IGZ1bmN0aW9uIGlubGluZUltYWdlcyhlbCkge1xuICAgIHJldHVybiBQcm9taXNlLmFsbChBcnJheS5mcm9tKGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ2ltYWdlJykpLm1hcChmdW5jdGlvbiAoaW1hZ2UpIHtcbiAgICAgIHZhciBocmVmID0gaW1hZ2UuZ2V0QXR0cmlidXRlTlMoJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnLCAnaHJlZicpIHx8IGltYWdlLmdldEF0dHJpYnV0ZSgnaHJlZicpO1xuICAgICAgaWYgKCFocmVmKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICAgICAgaWYgKGlzRXh0ZXJuYWwoaHJlZikpIHtcbiAgICAgICAgaHJlZiArPSAoaHJlZi5pbmRleE9mKCc/JykgPT09IC0xID8gJz8nIDogJyYnKSArICd0PScgKyBuZXcgRGF0ZSgpLnZhbHVlT2YoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgdmFyIGltZyA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBpbWcuY3Jvc3NPcmlnaW4gPSAnYW5vbnltb3VzJztcbiAgICAgICAgaW1nLnNyYyA9IGhyZWY7XG4gICAgICAgIGltZy5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKCdDb3VsZCBub3QgbG9hZCAnICsgaHJlZikpO1xuICAgICAgICB9O1xuICAgICAgICBpbWcub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNhbnZhcy53aWR0aCA9IGltZy53aWR0aDtcbiAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaW1nLmhlaWdodDtcbiAgICAgICAgICBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKS5kcmF3SW1hZ2UoaW1nLCAwLCAwKTtcbiAgICAgICAgICBpbWFnZS5zZXRBdHRyaWJ1dGVOUygnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycsICdocmVmJywgY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvcG5nJykpO1xuICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9KSk7XG4gIH07XG5cbiAgdmFyIGNhY2hlZEZvbnRzID0ge307XG4gIHZhciBpbmxpbmVGb250cyA9IGZ1bmN0aW9uIGlubGluZUZvbnRzKGZvbnRzKSB7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKGZvbnRzLm1hcChmdW5jdGlvbiAoZm9udCkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgaWYgKGNhY2hlZEZvbnRzW2ZvbnQudXJsXSkgcmV0dXJuIHJlc29sdmUoY2FjaGVkRm9udHNbZm9udC51cmxdKTtcblxuICAgICAgICB2YXIgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIHJlcS5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIFRPRE86IGl0IG1heSBhbHNvIGJlIHdvcnRoIGl0IHRvIHdhaXQgdW50aWwgZm9udHMgYXJlIGZ1bGx5IGxvYWRlZCBiZWZvcmVcbiAgICAgICAgICAvLyBhdHRlbXB0aW5nIHRvIHJhc3Rlcml6ZSB0aGVtLiAoZS5nLiB1c2UgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ZvbnRGYWNlU2V0KVxuICAgICAgICAgIHZhciBmb250SW5CYXNlNjQgPSBhcnJheUJ1ZmZlclRvQmFzZTY0KHJlcS5yZXNwb25zZSk7XG4gICAgICAgICAgdmFyIGZvbnRVcmkgPSBmb250LnRleHQucmVwbGFjZSh1cmxSZWdleCwgJ3VybChcImRhdGE6JyArIGZvbnQuZm9ybWF0ICsgJztiYXNlNjQsJyArIGZvbnRJbkJhc2U2NCArICdcIiknKSArICdcXG4nO1xuICAgICAgICAgIGNhY2hlZEZvbnRzW2ZvbnQudXJsXSA9IGZvbnRVcmk7XG4gICAgICAgICAgcmVzb2x2ZShmb250VXJpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlcS5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gbG9hZCBmb250IGZyb206ICcgKyBmb250LnVybCwgZSk7XG4gICAgICAgICAgY2FjaGVkRm9udHNbZm9udC51cmxdID0gbnVsbDtcbiAgICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVxLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ0Fib3J0ZWQgbG9hZGluZyBmb250IGZyb206ICcgKyBmb250LnVybCwgZSk7XG4gICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlcS5vcGVuKCdHRVQnLCBmb250LnVybCk7XG4gICAgICAgIHJlcS5yZXNwb25zZVR5cGUgPSAnYXJyYXlidWZmZXInO1xuICAgICAgICByZXEuc2VuZCgpO1xuICAgICAgfSk7XG4gICAgfSkpLnRoZW4oZnVuY3Rpb24gKGZvbnRDc3MpIHtcbiAgICAgIHJldHVybiBmb250Q3NzLmZpbHRlcihmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4geDtcbiAgICAgIH0pLmpvaW4oJycpO1xuICAgIH0pO1xuICB9O1xuXG4gIHZhciBjYWNoZWRSdWxlcyA9IG51bGw7XG4gIHZhciBzdHlsZVNoZWV0UnVsZXMgPSBmdW5jdGlvbiBzdHlsZVNoZWV0UnVsZXMoKSB7XG4gICAgaWYgKGNhY2hlZFJ1bGVzKSByZXR1cm4gY2FjaGVkUnVsZXM7XG4gICAgcmV0dXJuIGNhY2hlZFJ1bGVzID0gQXJyYXkuZnJvbShkb2N1bWVudC5zdHlsZVNoZWV0cykubWFwKGZ1bmN0aW9uIChzaGVldCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHsgcnVsZXM6IHNoZWV0LmNzc1J1bGVzLCBocmVmOiBzaGVldC5ocmVmIH07XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignU3R5bGVzaGVldCBjb3VsZCBub3QgYmUgbG9hZGVkOiAnICsgc2hlZXQuaHJlZiwgZSk7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICB2YXIgaW5saW5lQ3NzID0gZnVuY3Rpb24gaW5saW5lQ3NzKGVsLCBvcHRpb25zKSB7XG4gICAgdmFyIF9yZWYgPSBvcHRpb25zIHx8IHt9LFxuICAgICAgICBzZWxlY3RvclJlbWFwID0gX3JlZi5zZWxlY3RvclJlbWFwLFxuICAgICAgICBtb2RpZnlTdHlsZSA9IF9yZWYubW9kaWZ5U3R5bGUsXG4gICAgICAgIG1vZGlmeUNzcyA9IF9yZWYubW9kaWZ5Q3NzLFxuICAgICAgICBmb250cyA9IF9yZWYuZm9udHMsXG4gICAgICAgIGV4Y2x1ZGVVbnVzZWRDc3MgPSBfcmVmLmV4Y2x1ZGVVbnVzZWRDc3M7XG5cbiAgICB2YXIgZ2VuZXJhdGVDc3MgPSBtb2RpZnlDc3MgfHwgZnVuY3Rpb24gKHNlbGVjdG9yLCBwcm9wZXJ0aWVzKSB7XG4gICAgICB2YXIgc2VsID0gc2VsZWN0b3JSZW1hcCA/IHNlbGVjdG9yUmVtYXAoc2VsZWN0b3IpIDogc2VsZWN0b3I7XG4gICAgICB2YXIgcHJvcHMgPSBtb2RpZnlTdHlsZSA/IG1vZGlmeVN0eWxlKHByb3BlcnRpZXMpIDogcHJvcGVydGllcztcbiAgICAgIHJldHVybiBzZWwgKyAneycgKyBwcm9wcyArICd9XFxuJztcbiAgICB9O1xuICAgIHZhciBjc3MgPSBbXTtcbiAgICB2YXIgZGV0ZWN0Rm9udHMgPSB0eXBlb2YgZm9udHMgPT09ICd1bmRlZmluZWQnO1xuICAgIHZhciBmb250TGlzdCA9IGZvbnRzIHx8IFtdO1xuICAgIHN0eWxlU2hlZXRSdWxlcygpLmZvckVhY2goZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgICB2YXIgcnVsZXMgPSBfcmVmMi5ydWxlcyxcbiAgICAgICAgICBocmVmID0gX3JlZjIuaHJlZjtcblxuICAgICAgaWYgKCFydWxlcykgcmV0dXJuO1xuICAgICAgQXJyYXkuZnJvbShydWxlcykuZm9yRWFjaChmdW5jdGlvbiAocnVsZSkge1xuICAgICAgICBpZiAodHlwZW9mIHJ1bGUuc3R5bGUgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBpZiAocXVlcnkoZWwsIHJ1bGUuc2VsZWN0b3JUZXh0KSkgY3NzLnB1c2goZ2VuZXJhdGVDc3MocnVsZS5zZWxlY3RvclRleHQsIHJ1bGUuc3R5bGUuY3NzVGV4dCkpO2Vsc2UgaWYgKGRldGVjdEZvbnRzICYmIHJ1bGUuY3NzVGV4dC5tYXRjaCgvXkBmb250LWZhY2UvKSkge1xuICAgICAgICAgICAgdmFyIGZvbnQgPSBkZXRlY3RDc3NGb250KHJ1bGUsIGhyZWYpO1xuICAgICAgICAgICAgaWYgKGZvbnQpIGZvbnRMaXN0LnB1c2goZm9udCk7XG4gICAgICAgICAgfSBlbHNlIGlmICghZXhjbHVkZVVudXNlZENzcykge1xuICAgICAgICAgICAgY3NzLnB1c2gocnVsZS5jc3NUZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGlubGluZUZvbnRzKGZvbnRMaXN0KS50aGVuKGZ1bmN0aW9uIChmb250Q3NzKSB7XG4gICAgICByZXR1cm4gY3NzLmpvaW4oJ1xcbicpICsgZm9udENzcztcbiAgICB9KTtcbiAgfTtcblxuICB2YXIgZG93bmxvYWRPcHRpb25zID0gZnVuY3Rpb24gZG93bmxvYWRPcHRpb25zKCkge1xuICAgIGlmICghbmF2aWdhdG9yLm1zU2F2ZU9yT3BlbkJsb2IgJiYgISgnZG93bmxvYWQnIGluIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKSkpIHtcbiAgICAgIHJldHVybiB7IHBvcHVwOiB3aW5kb3cub3BlbigpIH07XG4gICAgfVxuICB9O1xuXG4gIG91dCQucHJlcGFyZVN2ZyA9IGZ1bmN0aW9uIChlbCwgb3B0aW9ucywgZG9uZSkge1xuICAgIHJlcXVpcmVEb21Ob2RlKGVsKTtcblxuICAgIHZhciBfcmVmMyA9IG9wdGlvbnMgfHwge30sXG4gICAgICAgIF9yZWYzJGxlZnQgPSBfcmVmMy5sZWZ0LFxuICAgICAgICBsZWZ0ID0gX3JlZjMkbGVmdCA9PT0gdW5kZWZpbmVkID8gMCA6IF9yZWYzJGxlZnQsXG4gICAgICAgIF9yZWYzJHRvcCA9IF9yZWYzLnRvcCxcbiAgICAgICAgdG9wID0gX3JlZjMkdG9wID09PSB1bmRlZmluZWQgPyAwIDogX3JlZjMkdG9wLFxuICAgICAgICB3ID0gX3JlZjMud2lkdGgsXG4gICAgICAgIGggPSBfcmVmMy5oZWlnaHQsXG4gICAgICAgIF9yZWYzJHNjYWxlID0gX3JlZjMuc2NhbGUsXG4gICAgICAgIHNjYWxlID0gX3JlZjMkc2NhbGUgPT09IHVuZGVmaW5lZCA/IDEgOiBfcmVmMyRzY2FsZSxcbiAgICAgICAgX3JlZjMkcmVzcG9uc2l2ZSA9IF9yZWYzLnJlc3BvbnNpdmUsXG4gICAgICAgIHJlc3BvbnNpdmUgPSBfcmVmMyRyZXNwb25zaXZlID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IF9yZWYzJHJlc3BvbnNpdmUsXG4gICAgICAgIF9yZWYzJGV4Y2x1ZGVDc3MgPSBfcmVmMy5leGNsdWRlQ3NzLFxuICAgICAgICBleGNsdWRlQ3NzID0gX3JlZjMkZXhjbHVkZUNzcyA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBfcmVmMyRleGNsdWRlQ3NzO1xuXG4gICAgcmV0dXJuIGlubGluZUltYWdlcyhlbCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgY2xvbmUgPSBlbC5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICBjbG9uZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAob3B0aW9ucyB8fCB7fSkuYmFja2dyb3VuZENvbG9yIHx8IGVsLnN0eWxlLmJhY2tncm91bmRDb2xvcjtcblxuICAgICAgdmFyIF9nZXREaW1lbnNpb25zID0gZ2V0RGltZW5zaW9ucyhlbCwgY2xvbmUsIHcsIGgpLFxuICAgICAgICAgIHdpZHRoID0gX2dldERpbWVuc2lvbnMud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0ID0gX2dldERpbWVuc2lvbnMuaGVpZ2h0O1xuXG4gICAgICBpZiAoZWwudGFnTmFtZSAhPT0gJ3N2ZycpIHtcbiAgICAgICAgaWYgKGVsLmdldEJCb3gpIHtcbiAgICAgICAgICBpZiAoY2xvbmUuZ2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nKSAhPSBudWxsKSB7XG4gICAgICAgICAgICBjbG9uZS5zZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScsIGNsb25lLmdldEF0dHJpYnV0ZSgndHJhbnNmb3JtJykucmVwbGFjZSgvdHJhbnNsYXRlXFwoLio/XFwpLywgJycpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIHN2ZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnc3ZnJyk7XG4gICAgICAgICAgc3ZnLmFwcGVuZENoaWxkKGNsb25lKTtcbiAgICAgICAgICBjbG9uZSA9IHN2ZztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdBdHRlbXB0ZWQgdG8gcmVuZGVyIG5vbi1TVkcgZWxlbWVudCcsIGVsKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2xvbmUuc2V0QXR0cmlidXRlKCd2ZXJzaW9uJywgJzEuMScpO1xuICAgICAgY2xvbmUuc2V0QXR0cmlidXRlKCd2aWV3Qm94JywgW2xlZnQsIHRvcCwgd2lkdGgsIGhlaWdodF0uam9pbignICcpKTtcbiAgICAgIGlmICghY2xvbmUuZ2V0QXR0cmlidXRlKCd4bWxucycpKSBjbG9uZS5zZXRBdHRyaWJ1dGVOUyh4bWxOcywgJ3htbG5zJywgc3ZnTnMpO1xuICAgICAgaWYgKCFjbG9uZS5nZXRBdHRyaWJ1dGUoJ3htbG5zOnhsaW5rJykpIGNsb25lLnNldEF0dHJpYnV0ZU5TKHhtbE5zLCAneG1sbnM6eGxpbmsnLCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycpO1xuXG4gICAgICBpZiAocmVzcG9uc2l2ZSkge1xuICAgICAgICBjbG9uZS5yZW1vdmVBdHRyaWJ1dGUoJ3dpZHRoJyk7XG4gICAgICAgIGNsb25lLnJlbW92ZUF0dHJpYnV0ZSgnaGVpZ2h0Jyk7XG4gICAgICAgIGNsb25lLnNldEF0dHJpYnV0ZSgncHJlc2VydmVBc3BlY3RSYXRpbycsICd4TWluWU1pbiBtZWV0Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbG9uZS5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgd2lkdGggKiBzY2FsZSk7XG4gICAgICAgIGNsb25lLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgaGVpZ2h0ICogc2NhbGUpO1xuICAgICAgfVxuXG4gICAgICBBcnJheS5mcm9tKGNsb25lLnF1ZXJ5U2VsZWN0b3JBbGwoJ2ZvcmVpZ25PYmplY3QgPiAqJykpLmZvckVhY2goZnVuY3Rpb24gKGZvcmVpZ25PYmplY3QpIHtcbiAgICAgICAgZm9yZWlnbk9iamVjdC5zZXRBdHRyaWJ1dGVOUyh4bWxOcywgJ3htbG5zJywgZm9yZWlnbk9iamVjdC50YWdOYW1lID09PSAnc3ZnJyA/IHN2Z05zIDogeGh0bWxOcyk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGV4Y2x1ZGVDc3MpIHtcbiAgICAgICAgdmFyIG91dGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIG91dGVyLmFwcGVuZENoaWxkKGNsb25lKTtcbiAgICAgICAgdmFyIHNyYyA9IG91dGVyLmlubmVySFRNTDtcbiAgICAgICAgaWYgKHR5cGVvZiBkb25lID09PSAnZnVuY3Rpb24nKSBkb25lKHNyYywgd2lkdGgsIGhlaWdodCk7ZWxzZSByZXR1cm4geyBzcmM6IHNyYywgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGlubGluZUNzcyhlbCwgb3B0aW9ucykudGhlbihmdW5jdGlvbiAoY3NzKSB7XG4gICAgICAgICAgdmFyIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgICBzdHlsZS5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAndGV4dC9jc3MnKTtcbiAgICAgICAgICBzdHlsZS5pbm5lckhUTUwgPSAnPCFbQ0RBVEFbXFxuJyArIGNzcyArICdcXG5dXT4nO1xuXG4gICAgICAgICAgdmFyIGRlZnMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkZWZzJyk7XG4gICAgICAgICAgZGVmcy5hcHBlbmRDaGlsZChzdHlsZSk7XG4gICAgICAgICAgY2xvbmUuaW5zZXJ0QmVmb3JlKGRlZnMsIGNsb25lLmZpcnN0Q2hpbGQpO1xuXG4gICAgICAgICAgdmFyIG91dGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgb3V0ZXIuYXBwZW5kQ2hpbGQoY2xvbmUpO1xuICAgICAgICAgIHZhciBzcmMgPSBvdXRlci5pbm5lckhUTUwucmVwbGFjZSgvTlNcXGQrOmhyZWYvZ2ksICd4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4bGluazpocmVmJyk7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGRvbmUgPT09ICdmdW5jdGlvbicpIGRvbmUoc3JjLCB3aWR0aCwgaGVpZ2h0KTtlbHNlIHJldHVybiB7IHNyYzogc3JjLCB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIG91dCQuc3ZnQXNEYXRhVXJpID0gZnVuY3Rpb24gKGVsLCBvcHRpb25zLCBkb25lKSB7XG4gICAgcmVxdWlyZURvbU5vZGUoZWwpO1xuICAgIHJldHVybiBvdXQkLnByZXBhcmVTdmcoZWwsIG9wdGlvbnMpLnRoZW4oZnVuY3Rpb24gKF9yZWY0KSB7XG4gICAgICB2YXIgc3JjID0gX3JlZjQuc3JjLFxuICAgICAgICAgIHdpZHRoID0gX3JlZjQud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0ID0gX3JlZjQuaGVpZ2h0O1xuXG4gICAgICB2YXIgc3ZnWG1sID0gJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsJyArIHdpbmRvdy5idG9hKHJlRW5jb2RlKGRvY3R5cGUgKyBzcmMpKTtcbiAgICAgIGlmICh0eXBlb2YgZG9uZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBkb25lKHN2Z1htbCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3ZnWG1sO1xuICAgIH0pO1xuICB9O1xuXG4gIG91dCQuc3ZnQXNQbmdVcmkgPSBmdW5jdGlvbiAoZWwsIG9wdGlvbnMsIGRvbmUpIHtcbiAgICByZXF1aXJlRG9tTm9kZShlbCk7XG5cbiAgICB2YXIgX3JlZjUgPSBvcHRpb25zIHx8IHt9LFxuICAgICAgICBfcmVmNSRlbmNvZGVyVHlwZSA9IF9yZWY1LmVuY29kZXJUeXBlLFxuICAgICAgICBlbmNvZGVyVHlwZSA9IF9yZWY1JGVuY29kZXJUeXBlID09PSB1bmRlZmluZWQgPyAnaW1hZ2UvcG5nJyA6IF9yZWY1JGVuY29kZXJUeXBlLFxuICAgICAgICBfcmVmNSRlbmNvZGVyT3B0aW9ucyA9IF9yZWY1LmVuY29kZXJPcHRpb25zLFxuICAgICAgICBlbmNvZGVyT3B0aW9ucyA9IF9yZWY1JGVuY29kZXJPcHRpb25zID09PSB1bmRlZmluZWQgPyAwLjggOiBfcmVmNSRlbmNvZGVyT3B0aW9ucyxcbiAgICAgICAgY2FudmcgPSBfcmVmNS5jYW52ZztcblxuICAgIHZhciBjb252ZXJ0VG9QbmcgPSBmdW5jdGlvbiBjb252ZXJ0VG9QbmcoX3JlZjYpIHtcbiAgICAgIHZhciBzcmMgPSBfcmVmNi5zcmMsXG4gICAgICAgICAgd2lkdGggPSBfcmVmNi53aWR0aCxcbiAgICAgICAgICBoZWlnaHQgPSBfcmVmNi5oZWlnaHQ7XG5cbiAgICAgIHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgIHZhciBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICB2YXIgcGl4ZWxSYXRpbyA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG5cbiAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoICogcGl4ZWxSYXRpbztcbiAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQgKiBwaXhlbFJhdGlvO1xuICAgICAgY2FudmFzLnN0eWxlLndpZHRoID0gY2FudmFzLndpZHRoICsgJ3B4JztcbiAgICAgIGNhbnZhcy5zdHlsZS5oZWlnaHQgPSBjYW52YXMuaGVpZ2h0ICsgJ3B4JztcbiAgICAgIGNvbnRleHQuc2V0VHJhbnNmb3JtKHBpeGVsUmF0aW8sIDAsIDAsIHBpeGVsUmF0aW8sIDAsIDApO1xuXG4gICAgICBpZiAoY2FudmcpIGNhbnZnKGNhbnZhcywgc3JjKTtlbHNlIGNvbnRleHQuZHJhd0ltYWdlKHNyYywgMCwgMCk7XG5cbiAgICAgIHZhciBwbmcgPSB2b2lkIDA7XG4gICAgICB0cnkge1xuICAgICAgICBwbmcgPSBjYW52YXMudG9EYXRhVVJMKGVuY29kZXJUeXBlLCBlbmNvZGVyT3B0aW9ucyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgU2VjdXJpdHlFcnJvciAhPT0gJ3VuZGVmaW5lZCcgJiYgZSBpbnN0YW5jZW9mIFNlY3VyaXR5RXJyb3IgfHwgZS5uYW1lID09PSAnU2VjdXJpdHlFcnJvcicpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdSZW5kZXJlZCBTVkcgaW1hZ2VzIGNhbm5vdCBiZSBkb3dubG9hZGVkIGluIHRoaXMgYnJvd3Nlci4nKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBkb25lID09PSAnZnVuY3Rpb24nKSBkb25lKHBuZywgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocG5nKTtcbiAgICB9O1xuXG4gICAgaWYgKGNhbnZnKSByZXR1cm4gb3V0JC5wcmVwYXJlU3ZnKGVsLCBvcHRpb25zKS50aGVuKGNvbnZlcnRUb1BuZyk7ZWxzZSByZXR1cm4gb3V0JC5zdmdBc0RhdGFVcmkoZWwsIG9wdGlvbnMpLnRoZW4oZnVuY3Rpb24gKHVyaSkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdmFyIGltYWdlID0gbmV3IEltYWdlKCk7XG4gICAgICAgIGltYWdlLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShjb252ZXJ0VG9Qbmcoe1xuICAgICAgICAgICAgc3JjOiBpbWFnZSxcbiAgICAgICAgICAgIHdpZHRoOiBpbWFnZS53aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogaW1hZ2UuaGVpZ2h0XG4gICAgICAgICAgfSkpO1xuICAgICAgICB9O1xuICAgICAgICBpbWFnZS5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJlamVjdCgnVGhlcmUgd2FzIGFuIGVycm9yIGxvYWRpbmcgdGhlIGRhdGEgVVJJIGFzIGFuIGltYWdlIG9uIHRoZSBmb2xsb3dpbmcgU1ZHXFxuJyArIHdpbmRvdy5hdG9iKHVyaS5zbGljZSgyNikpICsgJ09wZW4gdGhlIGZvbGxvd2luZyBsaW5rIHRvIHNlZSBicm93c2VyXFwncyBkaWFnbm9zaXNcXG4nICsgdXJpKTtcbiAgICAgICAgfTtcbiAgICAgICAgaW1hZ2Uuc3JjID0gdXJpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgb3V0JC5kb3dubG9hZCA9IGZ1bmN0aW9uIChuYW1lLCB1cmksIG9wdGlvbnMpIHtcbiAgICBpZiAobmF2aWdhdG9yLm1zU2F2ZU9yT3BlbkJsb2IpIG5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKHVyaVRvQmxvYih1cmkpLCBuYW1lKTtlbHNlIHtcbiAgICAgIHZhciBzYXZlTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgIGlmICgnZG93bmxvYWQnIGluIHNhdmVMaW5rKSB7XG4gICAgICAgIHNhdmVMaW5rLmRvd25sb2FkID0gbmFtZTtcbiAgICAgICAgc2F2ZUxpbmsuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzYXZlTGluayk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdmFyIGJsb2IgPSB1cmlUb0Jsb2IodXJpKTtcbiAgICAgICAgICB2YXIgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgICAgICBzYXZlTGluay5ocmVmID0gdXJsO1xuICAgICAgICAgIHNhdmVMaW5rLm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH07XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgIGNvbnNvbGUud2FybignRXJyb3Igd2hpbGUgZ2V0dGluZyBvYmplY3QgVVJMLiBGYWxsaW5nIGJhY2sgdG8gc3RyaW5nIFVSTC4nKTtcbiAgICAgICAgICBzYXZlTGluay5ocmVmID0gdXJpO1xuICAgICAgICB9XG4gICAgICAgIHNhdmVMaW5rLmNsaWNrKCk7XG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoc2F2ZUxpbmspO1xuICAgICAgfSBlbHNlIGlmIChvcHRpb25zICYmIG9wdGlvbnMucG9wdXApIHtcbiAgICAgICAgb3B0aW9ucy5wb3B1cC5kb2N1bWVudC50aXRsZSA9IG5hbWU7XG4gICAgICAgIG9wdGlvbnMucG9wdXAubG9jYXRpb24ucmVwbGFjZSh1cmkpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBvdXQkLnNhdmVTdmcgPSBmdW5jdGlvbiAoZWwsIG5hbWUsIG9wdGlvbnMpIHtcbiAgICB2YXIgZG93bmxvYWRPcHRzID0gZG93bmxvYWRPcHRpb25zKCk7IC8vIGRvbid0IGlubGluZSwgY2FuJ3QgYmUgYXN5bmNcbiAgICByZXR1cm4gcmVxdWlyZURvbU5vZGVQcm9taXNlKGVsKS50aGVuKGZ1bmN0aW9uIChlbCkge1xuICAgICAgcmV0dXJuIG91dCQuc3ZnQXNEYXRhVXJpKGVsLCBvcHRpb25zIHx8IHt9KTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uICh1cmkpIHtcbiAgICAgIHJldHVybiBvdXQkLmRvd25sb2FkKG5hbWUsIHVyaSwgZG93bmxvYWRPcHRzKTtcbiAgICB9KTtcbiAgfTtcblxuICBvdXQkLnNhdmVTdmdBc1BuZyA9IGZ1bmN0aW9uIChlbCwgbmFtZSwgb3B0aW9ucykge1xuICAgIHZhciBkb3dubG9hZE9wdHMgPSBkb3dubG9hZE9wdGlvbnMoKTsgLy8gZG9uJ3QgaW5saW5lLCBjYW4ndCBiZSBhc3luY1xuICAgIHJldHVybiByZXF1aXJlRG9tTm9kZVByb21pc2UoZWwpLnRoZW4oZnVuY3Rpb24gKGVsKSB7XG4gICAgICByZXR1cm4gb3V0JC5zdmdBc1BuZ1VyaShlbCwgb3B0aW9ucyB8fCB7fSk7XG4gICAgfSkudGhlbihmdW5jdGlvbiAodXJpKSB7XG4gICAgICByZXR1cm4gb3V0JC5kb3dubG9hZChuYW1lLCB1cmksIGRvd25sb2FkT3B0cyk7XG4gICAgfSk7XG4gIH07XG59KSgpOyIsImV4cG9ydCBjb25zdCBJQ0RTID0gYERJU1BMQVlcbk5PIERBVEFcbmA7XG4iLCJleHBvcnQgY29uc3QgSURQUyA9IGBESVNQTEFZXG5OTyBEQVRBXG5gO1xuIiwiY29uc3Qgcm5hQ29sb3IgPSAncmdiKDI1NSwyMzAsMTUzKSc7XG5jb25zdCBpbnZBYmFzaWNDb2xvciA9ICdyZ2IoMjU1LDIzMCwxNTMpJztcbmV4cG9ydCBjb25zdCBheG9sYWJzTWFwID0ge1xuICAgICdSTkEnOiB7XG4gICAgICAgIGZ1bGxOYW1lOiAnUk5BIG51Y2xlb3RpZGVzJyxcbiAgICAgICAgc3ltYm9sczogWydBJywgJ0MnLCAnRycsICdVJ10sXG4gICAgICAgIGNvbG9yOiBybmFDb2xvcixcbiAgICB9LFxuICAgICdETkEnOiB7XG4gICAgICAgIGZ1bGxOYW1lOiAnRE5BIG51Y2xlb3RpZGVzJyxcbiAgICAgICAgc3ltYm9sczogWydkQScsICdkQycsICdkRycsICdkVCddLFxuICAgICAgICBjb2xvcjogJ3JnYigxOTcsMjI0LDE4MCknLFxuICAgIH0sXG4gICAgJzJcXCctRmx1b3JvJzoge1xuICAgICAgICBmdWxsTmFtZTogJzJcXCctRmx1b3JvIG51Y2xlb3RpZGVzJyxcbiAgICAgICAgc3ltYm9sczogWydBZicsICdDZicsICdHZicsICdVZiddLFxuICAgICAgICBjb2xvcjogJ3JnYig2OCwxMTQsMTk2KScsXG4gICAgfSxcbiAgICAnMlxcJy1PLU1ldGh5bCc6IHtcbiAgICAgICAgZnVsbE5hbWU6ICcyXFwnLU8tTWV0aHlsIG51Y2xlb3RpZGVzJyxcbiAgICAgICAgc3ltYm9sczogWydhJywgJ2MnLCAnZycsICd1J10sXG4gICAgICAgIGNvbG9yOiAncmdiKDE2NiwxNjYsMTY2KScsXG4gICAgfSxcbiAgICAnMlxcJy1PLU1PRSc6IHtcbiAgICAgICAgZnVsbE5hbWU6ICcyXFwnLU8tTU9FIG51Y2xlb3RpZGVzIChpbmNsdWRpbmcgNS1NZXRoeWwgQyknLFxuICAgICAgICBzeW1ib2xzOiBbJ0FtJywgJ0NtJywgJ0dtJywgJ1RtJ10sXG4gICAgICAgIGNvbG9yOiAncmdiKDExMiw0OCwxNjApJyxcbiAgICB9LFxuICAgICdHTkEnOiB7XG4gICAgICAgIGZ1bGxOYW1lOiAnR2x5Y29sIG51Y2xlaWMgYWNpZCcsXG4gICAgICAgIHN5bWJvbHM6IFsnKEdOQS1BKScsICcoR05BLUMpJywgJyhHTkEtRyknLCAnKEdOQS1UKSddLFxuICAgICAgICBjb2xvcjogJ3JnYigyNTUsMTkyLDApJyxcbiAgICB9LFxuICAgICdMTkEnOiB7XG4gICAgICAgIGZ1bGxOYW1lOiAnTG9ja2VkIG51Y2xlaWMgYWNpZCAoaW5jbHVkaW5nIDUtTWV0aHlsIEMpJyxcbiAgICAgICAgc3ltYm9sczogWydBYicsICdDYicsICdHYicsICdUYiddLFxuICAgICAgICBjb2xvcjogJ3JnYig1NCwyMjksMjM4KScsXG4gICAgfSxcbiAgICAnVU5BJzoge1xuICAgICAgICBmdWxsTmFtZTogJ1VubG9ja2VkIG51Y2xlb3RpZGVzJyxcbiAgICAgICAgc3ltYm9sczogWydBbycsICdDbycsICdHbycsICdVbyddLFxuICAgICAgICBjb2xvcjogJ3JnYigyNTUsMTkyLDApJyxcbiAgICB9LFxuICAgICdBJzoge1xuICAgICAgICBmdWxsTmFtZTogJ0FkZW5pbmUnLFxuICAgICAgICBzeW1ib2xzOiBbJ2EnLCAnYScsICdhJywgJ2EnXSxcbiAgICAgICAgY29sb3I6IHJuYUNvbG9yLFxuICAgIH0sXG4gICAgJ0MnOiB7XG4gICAgICAgIGZ1bGxOYW1lOiAnQ3l0b3NpbmUnLFxuICAgICAgICBzeW1ib2xzOiBbJ2MnLCAnYycsICdjJywgJ2MnXSxcbiAgICAgICAgY29sb3I6IHJuYUNvbG9yLFxuICAgIH0sXG4gICAgJ0cnOiB7XG4gICAgICAgIGZ1bGxOYW1lOiAnR3VhbmluZScsXG4gICAgICAgIHN5bWJvbHM6IFsnZycsICdnJywgJ2cnLCAnZyddLFxuICAgICAgICBjb2xvcjogcm5hQ29sb3IsXG4gICAgfSxcbiAgICAnVSc6IHtcbiAgICAgICAgZnVsbE5hbWU6ICdVcmFjaWwnLFxuICAgICAgICBzeW1ib2xzOiBbJ3UnLCAndScsICd1JywgJ3UnXSxcbiAgICAgICAgY29sb3I6IHJuYUNvbG9yLFxuICAgIH0sXG4gICAgJ1gtTmV3Jzoge1xuICAgICAgICBmdWxsTmFtZTogJycsXG4gICAgICAgIHN5bWJvbHM6IFsnWCcsICdYJywgJ1gnLCAnWCddLFxuICAgICAgICBjb2xvcjogJ3JnYigxMDgsMCwwKScsXG4gICAgfSxcbiAgICAnWS1OZXcnOiB7XG4gICAgICAgIGZ1bGxOYW1lOiAnJyxcbiAgICAgICAgc3ltYm9sczogWydZJywgJ1knLCAnWScsICdZJ10sXG4gICAgICAgIGNvbG9yOiAncmdiKDIxMCwxNDYsMTQ2KScsXG4gICAgfSxcbiAgICAnWi1OZXcnOiB7XG4gICAgICAgIGZ1bGxOYW1lOiAnJyxcbiAgICAgICAgc3ltYm9sczogWydaJywgJ1onLCAnWicsICdaJ10sXG4gICAgICAgIGNvbG9yOiAncmdiKDE1NSwxMDgsMTMyKScsXG4gICAgfSxcbiAgICAnSW52QWJhc2ljJzoge1xuICAgICAgICBmdWxsTmFtZTogJ0ludmVydGVkIGFiYXNpYyBjYXBwZWQnLFxuICAgICAgICBzeW1ib2xzOiBbJyhpbnZhYmFzaWMpJywgJyhpbnZhYmFzaWMpJywgJyhpbnZhYmFzaWMpJywgJyhpbnZhYmFzaWMpJ10sXG4gICAgICAgIGNvbG9yOiBpbnZBYmFzaWNDb2xvcixcbiAgICB9LFxuICAgICc1XFwnLXZpbnlscHMnOiB7XG4gICAgICAgIGZ1bGxOYW1lOiAnNVxcJy12aW55bHBob3NwaG9uYXRlLTJcXCctT01lLXVyaWRpbmUnLFxuICAgICAgICBzeW1ib2xzOiBbJyh2aW51KScsICcodmludSknLCAnKHZpbnUpJywgJyh2aW51KSddLFxuICAgICAgICBjb2xvcjogJ3JnYigwLDAsMTM5KScsXG4gICAgfSxcbiAgICAnSW52QWJhc2ljKG8pJzoge1xuICAgICAgICBmdWxsTmFtZTogJ0ludmVydGVkIGFiYXNpYyBjYXBwZWQgKG92ZXJoYW5nKScsXG4gICAgICAgIHN5bWJvbHM6IFsnKGludmFiYXNpYyknLCAnKGludmFiYXNpYyknLCAnKGludmFiYXNpYyknLCAnKGludmFiYXNpYyknXSxcbiAgICAgICAgY29sb3I6IGludkFiYXNpY0NvbG9yLFxuICAgIH0sXG4gICAgJzJcXCctT01lLVUobyknOiB7XG4gICAgICAgIGZ1bGxOYW1lOiAnTnVjbGVvdGlkZSBVcmlkaW5lIHdpdGggMuKAmU8tTWV0aHlsIHByb3RlY3Rpb24gKG92ZXJoYW5nKScsXG4gICAgICAgIHN5bWJvbHM6IFsnbVUnLCAnbVUnLCAnbVUnLCAnbVUnXSxcbiAgICAgICAgY29sb3I6ICdyZ2IoNjUsMjMzLDgwKScsXG4gICAgfSxcbn07XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbi8qIERvIG5vdCBjaGFuZ2UgdGhlc2UgaW1wb3J0IGxpbmVzLiBEYXRhZ3JvayB3aWxsIGltcG9ydCBBUEkgbGlicmFyeSBpbiBleGFjdGx5IHRoZSBzYW1lIG1hbm5lciAqL1xuaW1wb3J0ICogYXMgZ3JvayBmcm9tICdkYXRhZ3Jvay1hcGkvZ3Jvayc7XG5pbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCAqIGFzIHN2ZyBmcm9tICdzYXZlLXN2Zy1hcy1wbmcnO1xuaW1wb3J0ICQgZnJvbSAnY2FzaC1kb20nO1xuaW1wb3J0IHsgZHJhd0F4b2xhYnNQYXR0ZXJuIH0gZnJvbSAnLi9kcmF3QXhvbGFic1BhdHRlcm4nO1xuaW1wb3J0IHsgYXhvbGFic01hcCB9IGZyb20gJy4vYXhvbGFic01hcCc7XG5jb25zdCBiYXNlQ2hvaWNlcyA9IE9iamVjdC5rZXlzKGF4b2xhYnNNYXApO1xuY29uc3QgZGVmYXVsdEJhc2UgPSBiYXNlQ2hvaWNlc1swXTtcbmNvbnN0IGRlZmF1bHRQdG8gPSB0cnVlO1xuY29uc3QgZGVmYXVsdFNlcXVlbmNlTGVuZ3RoID0gMjM7XG5jb25zdCBtYXhpbWFsVmFsaWRTZXF1ZW5jZUxlbmd0aCA9IDM1O1xuY29uc3QgdXNlclN0b3JhZ2VLZXkgPSAnU2VxdWVuY2VUcmFuc2xhdG9yJztcbmNvbnN0IGV4YW1wbGVNaW5XaWR0aCA9ICc0MDBweCc7XG5mdW5jdGlvbiBnZW5lcmF0ZUV4YW1wbGUoc2VxdWVuY2VMZW5ndGgsIHNlcXVlbmNlQmFzaXMpIHtcbiAgICBjb25zdCB1bmlxdWVTeW1ib2xzID0gYXhvbGFic01hcFtzZXF1ZW5jZUJhc2lzXS5zeW1ib2xzLmpvaW4oJycpO1xuICAgIHJldHVybiB1bmlxdWVTeW1ib2xzLnJlcGVhdChNYXRoLmZsb29yKHNlcXVlbmNlTGVuZ3RoIC8gNCkpICsgdW5pcXVlU3ltYm9scy5zbGljZSgwLCBzZXF1ZW5jZUxlbmd0aCAlIDQpO1xufVxuZnVuY3Rpb24gZmluZER1cGxpY2F0ZXMoZGF0YSkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoZGF0YSkpLmZpbHRlcigodmFsdWUpID0+IGRhdGEuaW5kZXhPZih2YWx1ZSkgIT09IGRhdGEubGFzdEluZGV4T2YodmFsdWUpKTtcbn1cbmZ1bmN0aW9uIGlzQ3VycmVudFVzZXJDcmVhdGVkVGhpc1BhdHRlcm4ocGF0dGVybk5hbWUpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICByZXR1cm4geWllbGQgZ3Jvay5kYXBpLnVzZXJzLmN1cnJlbnQoKS50aGVuKCh1c2VyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBbZmlyc3ROYW1lLCBsYXN0TmFtZV0gPSBnZXRVc2VyTmFtZShwYXR0ZXJuTmFtZSk7XG4gICAgICAgICAgICByZXR1cm4gKHVzZXIuZmlyc3ROYW1lICE9IGZpcnN0TmFtZSB8fCB1c2VyLmxhc3ROYW1lICE9IGxhc3ROYW1lKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBnZXRTaG9ydE5hbWUocGF0dGVybk5hbWUpIHtcbiAgICBsZXQgZmlyc3QgPSBwYXR0ZXJuTmFtZS5sZW5ndGggKyAxO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVybk5hbWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHBhdHRlcm5OYW1lW2ldID09ICcoJykge1xuICAgICAgICAgICAgZmlyc3QgPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhdHRlcm5OYW1lLnNsaWNlKDAsIGZpcnN0IC0gMSk7XG59XG5mdW5jdGlvbiBnZXRVc2VyTmFtZShwYXR0ZXJuTmFtZSkge1xuICAgIGxldCBmaXJzdCA9IC0xO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVybk5hbWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHBhdHRlcm5OYW1lW2ldID09ICcoJykge1xuICAgICAgICAgICAgZmlyc3QgPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIChmaXJzdCA9PSAtMSkgPyBbJycsICcnXSA6IHBhdHRlcm5OYW1lLnNsaWNlKGZpcnN0ICsgOSwgcGF0dGVybk5hbWUubGVuZ3RoIC0gMSkuc3BsaXQoJyAnKS5zbGljZSgxKTtcbn1cbmZ1bmN0aW9uIHRyYW5zbGF0ZVNlcXVlbmNlKHNlcXVlbmNlLCBiYXNlcywgcHRvTGlua2FnZXMsIHN0YXJ0TW9kaWZpY2F0aW9uLCBlbmRNb2RpZmljYXRpb24sIGZpcnN0UHRvRXhpc3QpIHtcbiAgICBsZXQgY291bnRlciA9IC0xO1xuICAgIGxldCBtYWluU2VxdWVuY2UgPSBzZXF1ZW5jZS5yZXBsYWNlKC9bQVVHQ10vZywgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgY291bnRlcisrO1xuICAgICAgICBjb25zdCBpbmRleE9mU3ltYm9sID0gYXhvbGFic01hcFsnUk5BJ11bJ3N5bWJvbHMnXS5pbmRleE9mKHgpO1xuICAgICAgICBjb25zdCBzeW1ib2wgPSBheG9sYWJzTWFwW2Jhc2VzW2NvdW50ZXJdLnZhbHVlXVsnc3ltYm9scyddW2luZGV4T2ZTeW1ib2xdO1xuICAgICAgICByZXR1cm4gKHB0b0xpbmthZ2VzW2NvdW50ZXJdLnZhbHVlKSA/IHN5bWJvbCArICdzJyA6IHN5bWJvbDtcbiAgICB9KTtcbiAgICBpZiAobWFpblNlcXVlbmNlLnNsaWNlKDAsIDUpLnNwbGl0KCdtVScpLmxlbmd0aCA9PSAzKVxuICAgICAgICBtYWluU2VxdWVuY2UgPSAnKHV1KScgKyBtYWluU2VxdWVuY2Uuc2xpY2UoNCk7XG4gICAgaWYgKG1haW5TZXF1ZW5jZS5zbGljZShtYWluU2VxdWVuY2UubGVuZ3RoIC0gNykuc3BsaXQoJ21VJykubGVuZ3RoID09IDMpXG4gICAgICAgIG1haW5TZXF1ZW5jZSA9IG1haW5TZXF1ZW5jZS5zbGljZSgwLCBtYWluU2VxdWVuY2UubGVuZ3RoIC0gNCkgKyAnKHV1KSc7XG4gICAgcmV0dXJuIHN0YXJ0TW9kaWZpY2F0aW9uLnZhbHVlICsgKGZpcnN0UHRvRXhpc3QgPyAncycgOiAnJykgKyBtYWluU2VxdWVuY2UgKyBlbmRNb2RpZmljYXRpb24udmFsdWU7XG59XG5mdW5jdGlvbiBhZGRDb2x1bW5XaXRoSWRzKHRhYmxlTmFtZSwgY29sdW1uTmFtZSwgcGF0dGVybk5hbWUpIHtcbiAgICBjb25zdCBuYW1lT2ZOZXdDb2x1bW4gPSAnSUQgJyArIHBhdHRlcm5OYW1lO1xuICAgIGNvbnN0IGNvbHVtbnMgPSBncm9rLnNoZWxsLnRhYmxlKHRhYmxlTmFtZSkuY29sdW1ucztcbiAgICBpZiAoY29sdW1ucy5jb250YWlucyhuYW1lT2ZOZXdDb2x1bW4pKVxuICAgICAgICBjb2x1bW5zLnJlbW92ZShuYW1lT2ZOZXdDb2x1bW4pO1xuICAgIGNvbnN0IGNvbHVtbldpdGhJZHMgPSBjb2x1bW5zLmJ5TmFtZShjb2x1bW5OYW1lKTtcbiAgICByZXR1cm4gY29sdW1ucy5hZGROZXdTdHJpbmcobmFtZU9mTmV3Q29sdW1uKS5pbml0KChpKSA9PiBjb2x1bW5XaXRoSWRzLmdldChpKSArICdfJyArIHBhdHRlcm5OYW1lKTtcbn1cbmZ1bmN0aW9uIGFkZENvbHVtbldpdGhUcmFuc2xhdGVkU2VxdWVuY2VzKHRhYmxlTmFtZSwgY29sdW1uTmFtZSwgYmFzZXMsIHB0b0xpbmthZ2VzLCBzdGFydE1vZGlmaWNhdGlvbiwgZW5kTW9kaWZpY2F0aW9uLCBmaXJzdFB0b0V4aXN0KSB7XG4gICAgY29uc3QgbmFtZU9mTmV3Q29sdW1uID0gJ0F4b2xhYnMgJyArIGNvbHVtbk5hbWU7XG4gICAgY29uc3QgY29sdW1ucyA9IGdyb2suc2hlbGwudGFibGUodGFibGVOYW1lKS5jb2x1bW5zO1xuICAgIGlmIChjb2x1bW5zLmNvbnRhaW5zKG5hbWVPZk5ld0NvbHVtbikpXG4gICAgICAgIGNvbHVtbnMucmVtb3ZlKG5hbWVPZk5ld0NvbHVtbik7XG4gICAgY29uc3QgY29sdW1uV2l0aElucHV0U2VxdWVuY2VzID0gY29sdW1ucy5ieU5hbWUoY29sdW1uTmFtZSk7XG4gICAgcmV0dXJuIGNvbHVtbnMuYWRkTmV3U3RyaW5nKG5hbWVPZk5ld0NvbHVtbikuaW5pdCgoaSkgPT4ge1xuICAgICAgICByZXR1cm4gdHJhbnNsYXRlU2VxdWVuY2UoY29sdW1uV2l0aElucHV0U2VxdWVuY2VzLmdldFN0cmluZyhpKSwgYmFzZXMsIHB0b0xpbmthZ2VzLCBzdGFydE1vZGlmaWNhdGlvbiwgZW5kTW9kaWZpY2F0aW9uLCBmaXJzdFB0b0V4aXN0KTtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVBeG9sYWJzUGF0dGVybigpIHtcbiAgICBjb25zdCBlbnVtZXJhdGVNb2RpZmljYXRpb25zID0gW2RlZmF1bHRCYXNlXTtcbiAgICBsZXQgbWF4aW1hbFNzTGVuZ3RoID0gZGVmYXVsdFNlcXVlbmNlTGVuZ3RoO1xuICAgIGxldCBtYXhpbWFsQXNMZW5ndGggPSBkZWZhdWx0U2VxdWVuY2VMZW5ndGg7XG4gICAgZnVuY3Rpb24gdXBkYXRlQXNNb2RpZmljYXRpb24oKSB7XG4gICAgICAgIGFzTW9kaWZpY2F0aW9uSXRlbXMuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIGFzUHRvTGlua2FnZXMgPSBhc1B0b0xpbmthZ2VzLmNvbmNhdChBcnJheShtYXhpbWFsQXNMZW5ndGggLSBhc0Jhc2VzLmxlbmd0aCkuZmlsbChmdWxseVB0bykpO1xuICAgICAgICBhc0Jhc2VzID0gYXNCYXNlcy5jb25jYXQoQXJyYXkobWF4aW1hbEFzTGVuZ3RoIC0gYXNCYXNlcy5sZW5ndGgpLmZpbGwoc2VxdWVuY2VCYXNlKSk7XG4gICAgICAgIGxldCBudWNsZW90aWRlQ291bnRlciA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXNMZW5ndGgudmFsdWU7IGkrKykge1xuICAgICAgICAgICAgYXNQdG9MaW5rYWdlc1tpXSA9IHVpLmJvb2xJbnB1dCgnJywgYXNQdG9MaW5rYWdlc1tpXS52YWx1ZSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHVwZGF0ZVN2Z1NjaGVtZSgpO1xuICAgICAgICAgICAgICAgIHVwZGF0ZU91dHB1dEV4YW1wbGVzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGFzQmFzZXNbaV0gPSB1aS5jaG9pY2VJbnB1dCgnJywgYXNCYXNlc1tpXS52YWx1ZSwgYmFzZUNob2ljZXMsICh2KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFlbnVtZXJhdGVNb2RpZmljYXRpb25zLmluY2x1ZGVzKHYpKSB7XG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmF0ZU1vZGlmaWNhdGlvbnMucHVzaCh2KTtcbiAgICAgICAgICAgICAgICAgICAgaXNFbnVtZXJhdGVNb2RpZmljYXRpb25zRGl2LmFwcGVuZCh1aS5ib29sSW5wdXQodiwgdHJ1ZSwgKGJvb2xWKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYm9vbFYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVudW1lcmF0ZU1vZGlmaWNhdGlvbnMuaW5jbHVkZXModikpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmF0ZU1vZGlmaWNhdGlvbnMucHVzaCh2KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZW51bWVyYXRlTW9kaWZpY2F0aW9ucy5pbmRleE9mKHYsIDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhdGVNb2RpZmljYXRpb25zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVTdmdTY2hlbWUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSkucm9vdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHVwZGF0ZUFzTW9kaWZpY2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgdXBkYXRlU3ZnU2NoZW1lKCk7XG4gICAgICAgICAgICAgICAgdXBkYXRlT3V0cHV0RXhhbXBsZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGFzQmFzZXNbaV0udmFsdWUuc2xpY2UoLTMpICE9ICcobyknKVxuICAgICAgICAgICAgICAgIG51Y2xlb3RpZGVDb3VudGVyKys7XG4gICAgICAgICAgICBhc01vZGlmaWNhdGlvbkl0ZW1zLmFwcGVuZCh1aS5kaXZIKFtcbiAgICAgICAgICAgICAgICB1aS5kaXYoW3VpLmxhYmVsKGFzQmFzZXNbaV0udmFsdWUuc2xpY2UoLTMpID09ICcobyknID8gJycgOiBTdHJpbmcobnVjbGVvdGlkZUNvdW50ZXIpKV0sIHsgc3R5bGU6IHsgd2lkdGg6ICcyMHB4JyB9IH0pLFxuICAgICAgICAgICAgICAgIHVpLmJsb2NrNzUoW2FzQmFzZXNbaV1dKSxcbiAgICAgICAgICAgICAgICB1aS5kaXYoW2FzUHRvTGlua2FnZXNbaV1dKSxcbiAgICAgICAgICAgIF0sIHsgc3R5bGU6IHsgYWxpZ25JdGVtczogJ2NlbnRlcicgfSB9KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlU3NNb2RpZmljYXRpb24oKSB7XG4gICAgICAgIHNzTW9kaWZpY2F0aW9uSXRlbXMuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIHNzUHRvTGlua2FnZXMgPSBzc1B0b0xpbmthZ2VzLmNvbmNhdChBcnJheShtYXhpbWFsU3NMZW5ndGggLSBzc0Jhc2VzLmxlbmd0aCkuZmlsbChmdWxseVB0bykpO1xuICAgICAgICBzc0Jhc2VzID0gc3NCYXNlcy5jb25jYXQoQXJyYXkobWF4aW1hbFNzTGVuZ3RoIC0gc3NCYXNlcy5sZW5ndGgpLmZpbGwoc2VxdWVuY2VCYXNlKSk7XG4gICAgICAgIGxldCBudWNsZW90aWRlQ291bnRlciA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3NMZW5ndGgudmFsdWU7IGkrKykge1xuICAgICAgICAgICAgc3NQdG9MaW5rYWdlc1tpXSA9IHVpLmJvb2xJbnB1dCgnJywgc3NQdG9MaW5rYWdlc1tpXS52YWx1ZSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHVwZGF0ZVN2Z1NjaGVtZSgpO1xuICAgICAgICAgICAgICAgIHVwZGF0ZU91dHB1dEV4YW1wbGVzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNzQmFzZXNbaV0gPSB1aS5jaG9pY2VJbnB1dCgnJywgc3NCYXNlc1tpXS52YWx1ZSwgYmFzZUNob2ljZXMsICh2KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFlbnVtZXJhdGVNb2RpZmljYXRpb25zLmluY2x1ZGVzKHYpKSB7XG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmF0ZU1vZGlmaWNhdGlvbnMucHVzaCh2KTtcbiAgICAgICAgICAgICAgICAgICAgaXNFbnVtZXJhdGVNb2RpZmljYXRpb25zRGl2LmFwcGVuZCh1aS5ib29sSW5wdXQodiwgdHJ1ZSwgKGJvb2xWKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYm9vbFYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVudW1lcmF0ZU1vZGlmaWNhdGlvbnMuaW5jbHVkZXModikpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmF0ZU1vZGlmaWNhdGlvbnMucHVzaCh2KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZW51bWVyYXRlTW9kaWZpY2F0aW9ucy5pbmRleE9mKHYsIDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhdGVNb2RpZmljYXRpb25zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVTdmdTY2hlbWUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSkucm9vdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHVwZGF0ZVNzTW9kaWZpY2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgdXBkYXRlU3ZnU2NoZW1lKCk7XG4gICAgICAgICAgICAgICAgdXBkYXRlT3V0cHV0RXhhbXBsZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHNzQmFzZXNbaV0udmFsdWUuc2xpY2UoLTMpICE9ICcobyknKVxuICAgICAgICAgICAgICAgIG51Y2xlb3RpZGVDb3VudGVyKys7XG4gICAgICAgICAgICBzc01vZGlmaWNhdGlvbkl0ZW1zLmFwcGVuZCh1aS5kaXZIKFtcbiAgICAgICAgICAgICAgICB1aS5kaXYoW3VpLmxhYmVsKHNzQmFzZXNbaV0udmFsdWUuc2xpY2UoLTMpID09ICcobyknID8gJycgOiBTdHJpbmcobnVjbGVvdGlkZUNvdW50ZXIpKV0sIHsgc3R5bGU6IHsgd2lkdGg6ICcyMHB4JyB9IH0pLFxuICAgICAgICAgICAgICAgIHVpLmJsb2NrNzUoW3NzQmFzZXNbaV1dKSxcbiAgICAgICAgICAgICAgICB1aS5kaXYoW3NzUHRvTGlua2FnZXNbaV1dKSxcbiAgICAgICAgICAgIF0sIHsgc3R5bGU6IHsgYWxpZ25JdGVtczogJ2NlbnRlcicgfSB9KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlVWlGb3JOZXdTZXF1ZW5jZUxlbmd0aCgpIHtcbiAgICAgICAgaWYgKHNzTGVuZ3RoLnZhbHVlIDwgbWF4aW1hbFZhbGlkU2VxdWVuY2VMZW5ndGggJiYgYXNMZW5ndGgudmFsdWUgPCBtYXhpbWFsVmFsaWRTZXF1ZW5jZUxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKHNzTGVuZ3RoLnZhbHVlID4gbWF4aW1hbFNzTGVuZ3RoKVxuICAgICAgICAgICAgICAgIG1heGltYWxTc0xlbmd0aCA9IHNzTGVuZ3RoLnZhbHVlO1xuICAgICAgICAgICAgaWYgKGFzTGVuZ3RoLnZhbHVlID4gbWF4aW1hbEFzTGVuZ3RoKVxuICAgICAgICAgICAgICAgIG1heGltYWxBc0xlbmd0aCA9IGFzTGVuZ3RoLnZhbHVlO1xuICAgICAgICAgICAgdXBkYXRlU3NNb2RpZmljYXRpb24oKTtcbiAgICAgICAgICAgIHVwZGF0ZUFzTW9kaWZpY2F0aW9uKCk7XG4gICAgICAgICAgICB1cGRhdGVTdmdTY2hlbWUoKTtcbiAgICAgICAgICAgIHVwZGF0ZUlucHV0RXhhbXBsZXMoKTtcbiAgICAgICAgICAgIHVwZGF0ZU91dHB1dEV4YW1wbGVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1aS5kaWFsb2coJ1NlcXVlbmNlIGxlbmd0aCBpcyBvdXQgb2YgcmFuZ2UnKVxuICAgICAgICAgICAgICAgIC5hZGQodWkuZGl2VGV4dCgnU2VxdWVuY2UgbGVuZ3RoIHNob3VsZCBiZSBsZXNzIHRoYW4gJyArXG4gICAgICAgICAgICAgICAgbWF4aW1hbFZhbGlkU2VxdWVuY2VMZW5ndGgudG9TdHJpbmcoKSArICcgZHVlIHRvIFVJIGNvbnN0cmFpbnMuJykpXG4gICAgICAgICAgICAgICAgLmFkZCh1aS5kaXZUZXh0KCdQbGVhc2UgY2hhbmdlIHNlcXVlbmNlIGxlbmd0aCBpbiBvcmRlciB0byBkZWZpbmUgbmV3IHBhdHRlcm4uJykpXG4gICAgICAgICAgICAgICAgLnNob3coKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVQdG8obmV3UHRvVmFsdWUpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzc1B0b0xpbmthZ2VzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgc3NQdG9MaW5rYWdlc1tpXS52YWx1ZSA9IG5ld1B0b1ZhbHVlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFzUHRvTGlua2FnZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBhc1B0b0xpbmthZ2VzW2ldLnZhbHVlID0gbmV3UHRvVmFsdWU7XG4gICAgICAgIHVwZGF0ZVN2Z1NjaGVtZSgpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVCYXNlcyhuZXdCYXNpc1ZhbHVlKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3NCYXNlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHNzQmFzZXNbaV0udmFsdWUgPSBuZXdCYXNpc1ZhbHVlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFzQmFzZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBhc0Jhc2VzW2ldLnZhbHVlID0gbmV3QmFzaXNWYWx1ZTtcbiAgICAgICAgdXBkYXRlU3ZnU2NoZW1lKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZUlucHV0RXhhbXBsZXMoKSB7XG4gICAgICAgIHNzSW5wdXRFeGFtcGxlLnZhbHVlID0gZ2VuZXJhdGVFeGFtcGxlKHNzTGVuZ3RoLnZhbHVlLCBzZXF1ZW5jZUJhc2UudmFsdWUpO1xuICAgICAgICBpZiAoY3JlYXRlQXNTdHJhbmQudmFsdWUpXG4gICAgICAgICAgICBhc0lucHV0RXhhbXBsZS52YWx1ZSA9IGdlbmVyYXRlRXhhbXBsZShhc0xlbmd0aC52YWx1ZSwgc2VxdWVuY2VCYXNlLnZhbHVlKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlT3V0cHV0RXhhbXBsZXMoKSB7XG4gICAgICAgIHNzT3V0cHV0RXhhbXBsZS52YWx1ZSA9IHRyYW5zbGF0ZVNlcXVlbmNlKHNzSW5wdXRFeGFtcGxlLnZhbHVlLCBzc0Jhc2VzLCBzc1B0b0xpbmthZ2VzLCBzc0ZpdmVNb2RpZmljYXRpb24sIHNzVGhyZWVNb2RpZmljYXRpb24sIGZpcnN0U3NQdG8udmFsdWUpO1xuICAgICAgICBpZiAoY3JlYXRlQXNTdHJhbmQudmFsdWUpIHtcbiAgICAgICAgICAgIGFzT3V0cHV0RXhhbXBsZS52YWx1ZSA9IHRyYW5zbGF0ZVNlcXVlbmNlKGFzSW5wdXRFeGFtcGxlLnZhbHVlLCBhc0Jhc2VzLCBhc1B0b0xpbmthZ2VzLCBhc0ZpdmVNb2RpZmljYXRpb24sIGFzVGhyZWVNb2RpZmljYXRpb24sIGZpcnN0QXNQdG8udmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZVN2Z1NjaGVtZSgpIHtcbiAgICAgICAgc3ZnRGl2LmlubmVySFRNTCA9ICcnO1xuICAgICAgICBzdmdEaXYuYXBwZW5kKHVpLnNwYW4oW1xuICAgICAgICAgICAgZHJhd0F4b2xhYnNQYXR0ZXJuKGdldFNob3J0TmFtZShzYXZlQXMudmFsdWUpLCBjcmVhdGVBc1N0cmFuZC52YWx1ZSwgc3NCYXNlcy5zbGljZSgwLCBzc0xlbmd0aC52YWx1ZSkubWFwKChlKSA9PiBlLnZhbHVlKSwgYXNCYXNlcy5zbGljZSgwLCBhc0xlbmd0aC52YWx1ZSkubWFwKChlKSA9PiBlLnZhbHVlKSwgW2ZpcnN0U3NQdG8udmFsdWVdLmNvbmNhdChzc1B0b0xpbmthZ2VzLnNsaWNlKDAsIHNzTGVuZ3RoLnZhbHVlKS5tYXAoKGUpID0+IGUudmFsdWUpKSwgW2ZpcnN0QXNQdG8udmFsdWVdLmNvbmNhdChhc1B0b0xpbmthZ2VzLnNsaWNlKDAsIGFzTGVuZ3RoLnZhbHVlKS5tYXAoKGUpID0+IGUudmFsdWUpKSwgc3NUaHJlZU1vZGlmaWNhdGlvbi52YWx1ZSwgc3NGaXZlTW9kaWZpY2F0aW9uLnZhbHVlLCBhc1RocmVlTW9kaWZpY2F0aW9uLnZhbHVlLCBhc0ZpdmVNb2RpZmljYXRpb24udmFsdWUsIGNvbW1lbnQudmFsdWUsIGVudW1lcmF0ZU1vZGlmaWNhdGlvbnMpLFxuICAgICAgICBdKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRldGVjdERlZmF1bHRCYXNpcyhhcnJheSkge1xuICAgICAgICBjb25zdCBtb2RlTWFwID0ge307XG4gICAgICAgIGxldCBtYXhFbCA9IGFycmF5WzBdO1xuICAgICAgICBsZXQgbWF4Q291bnQgPSAxO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBlbCA9IGFycmF5W2ldO1xuICAgICAgICAgICAgaWYgKG1vZGVNYXBbZWxdID09IG51bGwpXG4gICAgICAgICAgICAgICAgbW9kZU1hcFtlbF0gPSAxO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIG1vZGVNYXBbZWxdKys7XG4gICAgICAgICAgICBpZiAobW9kZU1hcFtlbF0gPiBtYXhDb3VudCkge1xuICAgICAgICAgICAgICAgIG1heEVsID0gZWw7XG4gICAgICAgICAgICAgICAgbWF4Q291bnQgPSBtb2RlTWFwW2VsXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF4RWw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBhcnNlUGF0dGVybkFuZFVwZGF0ZVVpKG5ld05hbWUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IHBpID0gREcuVGFza0JhclByb2dyZXNzSW5kaWNhdG9yLmNyZWF0ZSgnTG9hZGluZyBwYXR0ZXJuLi4uJyk7XG4gICAgICAgICAgICB5aWVsZCBncm9rLmRhcGkudXNlckRhdGFTdG9yYWdlLmdldCh1c2VyU3RvcmFnZUtleSwgZmFsc2UpLnRoZW4oKGVudGl0aWVzKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2JqID0gSlNPTi5wYXJzZShlbnRpdGllc1tuZXdOYW1lXSk7XG4gICAgICAgICAgICAgICAgc2VxdWVuY2VCYXNlLnZhbHVlID0gZGV0ZWN0RGVmYXVsdEJhc2lzKG9ialsnYXNCYXNlcyddLmNvbmNhdChvYmpbJ3NzQmFzZXMnXSkpO1xuICAgICAgICAgICAgICAgIGNyZWF0ZUFzU3RyYW5kLnZhbHVlID0gKG9ialsnYXNCYXNlcyddLmxlbmd0aCA+IDApO1xuICAgICAgICAgICAgICAgIHNhdmVBcy52YWx1ZSA9IG5ld05hbWU7XG4gICAgICAgICAgICAgICAgc3NCYXNlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2JqWydzc0Jhc2VzJ10ubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgICAgIHNzQmFzZXMucHVzaCh1aS5jaG9pY2VJbnB1dCgnJywgb2JqWydzc0Jhc2VzJ11baV0sIGJhc2VDaG9pY2VzKSk7XG4gICAgICAgICAgICAgICAgYXNCYXNlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2JqWydhc0Jhc2VzJ10ubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgICAgIGFzQmFzZXMucHVzaCh1aS5jaG9pY2VJbnB1dCgnJywgb2JqWydhc0Jhc2VzJ11baV0sIGJhc2VDaG9pY2VzKSk7XG4gICAgICAgICAgICAgICAgZmlyc3RTc1B0by52YWx1ZSA9IG9ialsnc3NQdG9MaW5rYWdlcyddWzBdO1xuICAgICAgICAgICAgICAgIHNzUHRvTGlua2FnZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG9ialsnc3NQdG9MaW5rYWdlcyddLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICBzc1B0b0xpbmthZ2VzLnB1c2godWkuYm9vbElucHV0KCcnLCBvYmpbJ3NzUHRvTGlua2FnZXMnXVtpXSkpO1xuICAgICAgICAgICAgICAgIGZpcnN0QXNQdG8udmFsdWUgPSBvYmpbJ2FzUHRvTGlua2FnZXMnXVswXTtcbiAgICAgICAgICAgICAgICBhc1B0b0xpbmthZ2VzID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBvYmpbJ2FzUHRvTGlua2FnZXMnXS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgYXNQdG9MaW5rYWdlcy5wdXNoKHVpLmJvb2xJbnB1dCgnJywgb2JqWydhc1B0b0xpbmthZ2VzJ11baV0pKTtcbiAgICAgICAgICAgICAgICBzc0xlbmd0aC52YWx1ZSA9IG9ialsnc3NCYXNlcyddLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBhc0xlbmd0aC52YWx1ZSA9IG9ialsnYXNCYXNlcyddLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBzc1RocmVlTW9kaWZpY2F0aW9uLnZhbHVlID0gb2JqWydzc1RocmVlTW9kaWZpY2F0aW9uJ107XG4gICAgICAgICAgICAgICAgc3NGaXZlTW9kaWZpY2F0aW9uLnZhbHVlID0gb2JqWydzc0ZpdmVNb2RpZmljYXRpb24nXTtcbiAgICAgICAgICAgICAgICBhc1RocmVlTW9kaWZpY2F0aW9uLnZhbHVlID0gb2JqWydhc1RocmVlTW9kaWZpY2F0aW9uJ107XG4gICAgICAgICAgICAgICAgYXNGaXZlTW9kaWZpY2F0aW9uLnZhbHVlID0gb2JqWydhc0ZpdmVNb2RpZmljYXRpb24nXTtcbiAgICAgICAgICAgICAgICBjb21tZW50LnZhbHVlID0gb2JqWydjb21tZW50J107XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHBpLmNsb3NlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjaGVja1doZXRoZXJBbGxWYWx1ZXNJbkNvbHVtbkhhdmVUaGVTYW1lTGVuZ3RoKGNvbE5hbWUpIHtcbiAgICAgICAgY29uc3QgY29sID0gdGFibGVzLnZhbHVlLmNvbHVtbnMuYnlOYW1lKGNvbE5hbWUpO1xuICAgICAgICBsZXQgYWxsTGVuZ3Roc0FyZVRoZVNhbWUgPSB0cnVlO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGNvbC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGNvbC5nZXQoaSAtIDEpLmxlbmd0aCAhPSBjb2wuZ2V0KGkpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGFsbExlbmd0aHNBcmVUaGVTYW1lID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhbGxMZW5ndGhzQXJlVGhlU2FtZSkge1xuICAgICAgICAgICAgY29uc3QgZGlhbG9nID0gdWkuZGlhbG9nKCdTZXF1ZW5jZXMgbGVuZ3RocyBtaXNtYXRjaCcpO1xuICAgICAgICAgICAgJChkaWFsb2cuZ2V0QnV0dG9uKCdPSycpKS5oaWRlKCk7XG4gICAgICAgICAgICBkaWFsb2dcbiAgICAgICAgICAgICAgICAuYWRkKHVpLmRpdlRleHQoJ1RoZSBzZXF1ZW5jZSBsZW5ndGggc2hvdWxkIG1hdGNoIHRoZSBudW1iZXIgb2YgUmF3IHNlcXVlbmNlcyBpbiB0aGUgaW5wdXQgZmlsZScpKVxuICAgICAgICAgICAgICAgIC5hZGQodWkuZGl2VGV4dCgnXFwnQUREIENPTFVNTlxcJyB0byBzZWUgc2VxdWVuY2VzIGxlbmd0aHMnKSlcbiAgICAgICAgICAgICAgICAuYWRkQnV0dG9uKCdBREQgQ09MVU1OJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRhYmxlcy52YWx1ZS5jb2x1bW5zLmFkZE5ld0ludCgnU2VxdWVuY2VzIGxlbmd0aHMgaW4gJyArIGNvbE5hbWUpLmluaXQoKGopID0+IGNvbC5nZXQoaikubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBncm9rLnNoZWxsLmluZm8oJ0NvbHVtbiB3aXRoIGxlbmd0aHMgYWRkZWQgdG8gXFwnJyArIHRhYmxlcy52YWx1ZS5uYW1lICsgJ1xcJycpO1xuICAgICAgICAgICAgICAgIGRpYWxvZy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIGdyb2suc2hlbGwudiA9IGdyb2suc2hlbGwuZ2V0VGFibGVWaWV3KHRhYmxlcy52YWx1ZS5uYW1lKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnNob3coKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWxsTGVuZ3Roc0FyZVRoZVNhbWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldEN1cnJlbnRVc2VyTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiB5aWVsZCBncm9rLmRhcGkudXNlcnMuY3VycmVudCgpLnRoZW4oKHVzZXIpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJyAoY3JlYXRlZCBieSAnICsgdXNlci5maXJzdE5hbWUgKyAnICcgKyB1c2VyLmxhc3ROYW1lICsgJyknO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwb3N0UGF0dGVyblRvVXNlclN0b3JhZ2UoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBhdXRob3IgPSB5aWVsZCBnZXRDdXJyZW50VXNlck5hbWUoKTtcbiAgICAgICAgICAgIGlmICghc2F2ZUFzLnN0cmluZ1ZhbHVlLmluY2x1ZGVzKCcoY3JlYXRlZCBieSAnKSlcbiAgICAgICAgICAgICAgICBzYXZlQXMudmFsdWUgPSBzYXZlQXMuc3RyaW5nVmFsdWUgKyBhdXRob3I7XG4gICAgICAgICAgICByZXR1cm4gZ3Jvay5kYXBpLnVzZXJEYXRhU3RvcmFnZS5wb3N0VmFsdWUodXNlclN0b3JhZ2VLZXksIHNhdmVBcy5zdHJpbmdWYWx1ZSwgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICdzc0Jhc2VzJzogc3NCYXNlcy5zbGljZSgwLCBzc0xlbmd0aC52YWx1ZSkubWFwKChlKSA9PiBlLnZhbHVlKSxcbiAgICAgICAgICAgICAgICAnYXNCYXNlcyc6IGFzQmFzZXMuc2xpY2UoMCwgYXNMZW5ndGgudmFsdWUpLm1hcCgoZSkgPT4gZS52YWx1ZSksXG4gICAgICAgICAgICAgICAgJ3NzUHRvTGlua2FnZXMnOiBbZmlyc3RTc1B0by52YWx1ZV0uY29uY2F0KHNzUHRvTGlua2FnZXMuc2xpY2UoMCwgc3NMZW5ndGgudmFsdWUpLm1hcCgoZSkgPT4gZS52YWx1ZSkpLFxuICAgICAgICAgICAgICAgICdhc1B0b0xpbmthZ2VzJzogW2ZpcnN0QXNQdG8udmFsdWVdLmNvbmNhdChhc1B0b0xpbmthZ2VzLnNsaWNlKDAsIGFzTGVuZ3RoLnZhbHVlKS5tYXAoKGUpID0+IGUudmFsdWUpKSxcbiAgICAgICAgICAgICAgICAnc3NUaHJlZU1vZGlmaWNhdGlvbic6IHNzVGhyZWVNb2RpZmljYXRpb24udmFsdWUsXG4gICAgICAgICAgICAgICAgJ3NzRml2ZU1vZGlmaWNhdGlvbic6IHNzRml2ZU1vZGlmaWNhdGlvbi52YWx1ZSxcbiAgICAgICAgICAgICAgICAnYXNUaHJlZU1vZGlmaWNhdGlvbic6IGFzVGhyZWVNb2RpZmljYXRpb24udmFsdWUsXG4gICAgICAgICAgICAgICAgJ2FzRml2ZU1vZGlmaWNhdGlvbic6IGFzRml2ZU1vZGlmaWNhdGlvbi52YWx1ZSxcbiAgICAgICAgICAgICAgICAnY29tbWVudCc6IGNvbW1lbnQudmFsdWUsXG4gICAgICAgICAgICB9KSwgZmFsc2UpLnRoZW4oKCkgPT4gZ3Jvay5zaGVsbC5pbmZvKCdQYXR0ZXJuIFxcJycgKyBzYXZlQXMudmFsdWUgKyAnXFwnIHdhcyBzdWNjZXNzZnVsbHkgdXBsb2FkZWQhJykpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlUGF0dGVybnNMaXN0KCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgZ3Jvay5kYXBpLnVzZXJEYXRhU3RvcmFnZS5nZXQodXNlclN0b3JhZ2VLZXksIGZhbHNlKS50aGVuKChlbnRpdGllcykgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxzdE15ID0gW107XG4gICAgICAgICAgICAgICAgY29uc3QgbHN0T3RoZXJzID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBlbnQgb2YgT2JqZWN0LmtleXMoZW50aXRpZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh5aWVsZCBpc0N1cnJlbnRVc2VyQ3JlYXRlZFRoaXNQYXR0ZXJuKGVudCkpXG4gICAgICAgICAgICAgICAgICAgICAgICBsc3RPdGhlcnMucHVzaChlbnQpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBsc3RNeS5wdXNoKGdldFNob3J0TmFtZShlbnQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGxvYWRQYXR0ZXJuID0gdWkuY2hvaWNlSW5wdXQoJ0xvYWQgUGF0dGVybicsICcnLCBsc3RNeSwgKHYpID0+IHBhcnNlUGF0dGVybkFuZFVwZGF0ZVVpKHYpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBteU9yT3RoZXJzUGF0dGVybkxpc3QgPSB1aS5jaG9pY2VJbnB1dCgnJywgJ01pbmUnLCBbJ01pbmUnLCAnT3RoZXJzJ10sICh2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRMaXN0ID0gdiA9PSAnTWluZScgPyBsc3RNeSA6IGxzdE90aGVycztcbiAgICAgICAgICAgICAgICAgICAgbG9hZFBhdHRlcm4gPSB1aS5jaG9pY2VJbnB1dCgnTG9hZCBQYXR0ZXJuJywgJycsIGN1cnJlbnRMaXN0LCAodikgPT4gcGFyc2VQYXR0ZXJuQW5kVXBkYXRlVWkodikpO1xuICAgICAgICAgICAgICAgICAgICBsb2FkUGF0dGVybi5yb290LmFwcGVuZChteU9yT3RoZXJzUGF0dGVybkxpc3QuaW5wdXQpO1xuICAgICAgICAgICAgICAgICAgICBsb2FkUGF0dGVybi5yb290LmFwcGVuZChsb2FkUGF0dGVybi5pbnB1dCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgbG9hZFBhdHRlcm4uaW5wdXQuc3R5bGUubWF4V2lkdGggPSAnMTAwcHgnO1xuICAgICAgICAgICAgICAgICAgICBsb2FkUGF0dGVybi5zZXRUb29sdGlwKCdBcHBseSBFeGlzdGluZyBQYXR0ZXJuJyk7XG4gICAgICAgICAgICAgICAgICAgIGxvYWRQYXR0ZXJuRGl2LmlubmVySFRNTCA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBsb2FkUGF0dGVybkRpdi5hcHBlbmQobG9hZFBhdHRlcm4ucm9vdCk7XG4gICAgICAgICAgICAgICAgICAgIGxvYWRQYXR0ZXJuLnJvb3QuYXBwZW5kKHVpLmRpdihbXG4gICAgICAgICAgICAgICAgICAgICAgICB1aS5idXR0b24odWkuaWNvbkZBKCd0cmFzaC1hbHQnLCAoKSA9PiB7IH0pLCAoKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRQYXR0ZXJuLnZhbHVlID09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb2suc2hlbGwud2FybmluZygnQ2hvb3NlIHBhdHRlcm4gdG8gZGVsZXRlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoeWllbGQgaXNDdXJyZW50VXNlckNyZWF0ZWRUaGlzUGF0dGVybihzYXZlQXMudmFsdWUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm9rLnNoZWxsLndhcm5pbmcoJ0Nhbm5vdCBkZWxldGUgcGF0dGVybiwgY3JlYXRlZCBieSBvdGhlciB1c2VyJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGdyb2suZGFwaS51c2VyRGF0YVN0b3JhZ2UucmVtb3ZlKHVzZXJTdG9yYWdlS2V5LCBsb2FkUGF0dGVybi52YWx1ZSwgZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiBncm9rLnNoZWxsLmluZm8oJ1BhdHRlcm4gXFwnJyArIGxvYWRQYXR0ZXJuLnZhbHVlICsgJ1xcJyBkZWxldGVkJykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCB1cGRhdGVQYXR0ZXJuc0xpc3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICAgICAgXSwgJ3VpLWlucHV0LW9wdGlvbnMnKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbG9hZFBhdHRlcm4ucm9vdC5hcHBlbmQobXlPck90aGVyc1BhdHRlcm5MaXN0LmlucHV0KTtcbiAgICAgICAgICAgICAgICBsb2FkUGF0dGVybi5yb290LmFwcGVuZChsb2FkUGF0dGVybi5pbnB1dCk7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIGxvYWRQYXR0ZXJuLmlucHV0LnN0eWxlLm1heFdpZHRoID0gJzEwMHB4JztcbiAgICAgICAgICAgICAgICBsb2FkUGF0dGVybi5zZXRUb29sdGlwKCdBcHBseSBFeGlzdGluZyBQYXR0ZXJuJyk7XG4gICAgICAgICAgICAgICAgbG9hZFBhdHRlcm5EaXYuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgICAgICAgICAgbG9hZFBhdHRlcm5EaXYuYXBwZW5kKGxvYWRQYXR0ZXJuLnJvb3QpO1xuICAgICAgICAgICAgICAgIGxvYWRQYXR0ZXJuLnJvb3QuYXBwZW5kKHVpLmRpdihbXG4gICAgICAgICAgICAgICAgICAgIHVpLmJ1dHRvbih1aS5pY29uRkEoJ3RyYXNoLWFsdCcsICgpID0+IHsgfSksICgpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkUGF0dGVybi52YWx1ZSA9PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb2suc2hlbGwud2FybmluZygnQ2hvb3NlIHBhdHRlcm4gdG8gZGVsZXRlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh5aWVsZCBpc0N1cnJlbnRVc2VyQ3JlYXRlZFRoaXNQYXR0ZXJuKHNhdmVBcy52YWx1ZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3Jvay5zaGVsbC53YXJuaW5nKCdDYW5ub3QgZGVsZXRlIHBhdHRlcm4sIGNyZWF0ZWQgYnkgb3RoZXIgdXNlcicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgZ3Jvay5kYXBpLnVzZXJEYXRhU3RvcmFnZS5yZW1vdmUodXNlclN0b3JhZ2VLZXksIGxvYWRQYXR0ZXJuLnZhbHVlLCBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gZ3Jvay5zaGVsbC5pbmZvKCdQYXR0ZXJuIFxcJycgKyBsb2FkUGF0dGVybi52YWx1ZSArICdcXCcgZGVsZXRlZCcpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHVwZGF0ZVBhdHRlcm5zTGlzdCgpO1xuICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgXSwgJ3VpLWlucHV0LW9wdGlvbnMnKSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzYXZlUGF0dGVybigpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHlpZWxkIGdyb2suZGFwaS51c2VyRGF0YVN0b3JhZ2UuZ2V0KHVzZXJTdG9yYWdlS2V5LCBmYWxzZSlcbiAgICAgICAgICAgICAgICAudGhlbigoZW50aXRpZXMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoZW50aXRpZXMpLmluY2x1ZGVzKHNhdmVBcy52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlhbG9nID0gdWkuZGlhbG9nKCdQYXR0ZXJuIGFscmVhZHkgZXhpc3RzJyk7XG4gICAgICAgICAgICAgICAgICAgICQoZGlhbG9nLmdldEJ1dHRvbignT0snKSkuaGlkZSgpO1xuICAgICAgICAgICAgICAgICAgICBkaWFsb2dcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQodWkuZGl2VGV4dCgnUGF0dGVybiBuYW1lIFxcJycgKyBzYXZlQXMudmFsdWUgKyAnXFwnIGFscmVhZHkgZXhpc3RzLicpKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmFkZCh1aS5kaXZUZXh0KCdSZXBsYWNlIHBhdHRlcm4/JykpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYWRkQnV0dG9uKCdZRVMnLCAoKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBncm9rLmRhcGkudXNlckRhdGFTdG9yYWdlLnJlbW92ZSh1c2VyU3RvcmFnZUtleSwgc2F2ZUFzLnZhbHVlLCBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiBwb3N0UGF0dGVyblRvVXNlclN0b3JhZ2UoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaWFsb2cuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAuc2hvdygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHBvc3RQYXR0ZXJuVG9Vc2VyU3RvcmFnZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB5aWVsZCB1cGRhdGVQYXR0ZXJuc0xpc3QoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0U3NDb2x1bW5EaXYgPSB1aS5kaXYoW10pO1xuICAgIGNvbnN0IGlucHV0QXNDb2x1bW5EaXYgPSB1aS5kaXYoW10pO1xuICAgIGNvbnN0IGlucHV0SWRDb2x1bW5EaXYgPSB1aS5kaXYoW10pO1xuICAgIGNvbnN0IHNzTW9kaWZpY2F0aW9uSXRlbXMgPSB1aS5kaXYoW10pO1xuICAgIGNvbnN0IGFzTW9kaWZpY2F0aW9uSXRlbXMgPSB1aS5kaXYoW10pO1xuICAgIGNvbnN0IHN2Z0RpdiA9IHVpLmRpdihbXSk7XG4gICAgY29uc3QgYXNFeGFtcGxlRGl2ID0gdWkuZGl2KFtdKTtcbiAgICBjb25zdCBhcHBBeG9sYWJzRGVzY3JpcHRpb24gPSB1aS5kaXYoW10pO1xuICAgIGNvbnN0IGxvYWRQYXR0ZXJuRGl2ID0gdWkuZGl2KFtdKTtcbiAgICBjb25zdCBhc01vZGlmaWNhdGlvbkRpdiA9IHVpLmRpdihbXSk7XG4gICAgY29uc3QgZmlyc3RBc1B0b0RpdiA9IHVpLmRpdihbXSk7XG4gICAgY29uc3QgaXNFbnVtZXJhdGVNb2RpZmljYXRpb25zRGl2ID0gdWkuZGl2SChbdWkuYm9vbElucHV0KGRlZmF1bHRCYXNlLCB0cnVlLCAodikgPT4ge1xuICAgICAgICAgICAgaWYgKHYpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWVudW1lcmF0ZU1vZGlmaWNhdGlvbnMuaW5jbHVkZXMoZGVmYXVsdEJhc2UpKVxuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhdGVNb2RpZmljYXRpb25zLnB1c2goZGVmYXVsdEJhc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBlbnVtZXJhdGVNb2RpZmljYXRpb25zLmluZGV4T2YoZGVmYXVsdEJhc2UsIDApO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKVxuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhdGVNb2RpZmljYXRpb25zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1cGRhdGVTdmdTY2hlbWUoKTtcbiAgICAgICAgICAgIHVwZGF0ZU91dHB1dEV4YW1wbGVzKCk7XG4gICAgICAgIH0pLnJvb3RdKTtcbiAgICBsZXQgc3NCYXNlcyA9IEFycmF5KGRlZmF1bHRTZXF1ZW5jZUxlbmd0aCkuZmlsbCh1aS5jaG9pY2VJbnB1dCgnJywgZGVmYXVsdEJhc2UsIGJhc2VDaG9pY2VzKSk7XG4gICAgbGV0IGFzQmFzZXMgPSBBcnJheShkZWZhdWx0U2VxdWVuY2VMZW5ndGgpLmZpbGwodWkuY2hvaWNlSW5wdXQoJycsIGRlZmF1bHRCYXNlLCBiYXNlQ2hvaWNlcykpO1xuICAgIGxldCBzc1B0b0xpbmthZ2VzID0gQXJyYXkoZGVmYXVsdFNlcXVlbmNlTGVuZ3RoKS5maWxsKHVpLmJvb2xJbnB1dCgnJywgZGVmYXVsdFB0bykpO1xuICAgIGxldCBhc1B0b0xpbmthZ2VzID0gQXJyYXkoZGVmYXVsdFNlcXVlbmNlTGVuZ3RoKS5maWxsKHVpLmJvb2xJbnB1dCgnJywgZGVmYXVsdFB0bykpO1xuICAgIGNvbnN0IHNzTGVuZ3RoID0gdWkuaW50SW5wdXQoJ1NTIExlbmd0aCcsIGRlZmF1bHRTZXF1ZW5jZUxlbmd0aCwgKCkgPT4gdXBkYXRlVWlGb3JOZXdTZXF1ZW5jZUxlbmd0aCgpKTtcbiAgICBjb25zdCBhc0xlbmd0aCA9IHVpLmludElucHV0KCdBUyBMZW5ndGgnLCBkZWZhdWx0U2VxdWVuY2VMZW5ndGgsICgpID0+IHVwZGF0ZVVpRm9yTmV3U2VxdWVuY2VMZW5ndGgoKSk7XG4gICAgY29uc3QgYXNMZW5ndGhEaXYgPSB1aS5kaXYoW2FzTGVuZ3RoLnJvb3RdKTtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZVNzQ29sdW1uKGNvbE5hbWUpIHtcbiAgICAgICAgY29uc3QgYWxsTGVuZ3Roc0FyZVRoZVNhbWUgPSBjaGVja1doZXRoZXJBbGxWYWx1ZXNJbkNvbHVtbkhhdmVUaGVTYW1lTGVuZ3RoKGNvbE5hbWUpO1xuICAgICAgICBjb25zdCBmaXJzdFNlcXVlbmNlID0gdGFibGVzLnZhbHVlLmNvbHVtbnMuYnlOYW1lKGNvbE5hbWUpLmdldCgwKTtcbiAgICAgICAgaWYgKGFsbExlbmd0aHNBcmVUaGVTYW1lICYmIGZpcnN0U2VxdWVuY2UubGVuZ3RoICE9IHNzTGVuZ3RoLnZhbHVlKVxuICAgICAgICAgICAgc3NMZW5ndGgudmFsdWUgPSB0YWJsZXMudmFsdWUuY29sdW1ucy5ieU5hbWUoY29sTmFtZSkuZ2V0KDApLmxlbmd0aDtcbiAgICAgICAgc3NJbnB1dEV4YW1wbGUudmFsdWUgPSBmaXJzdFNlcXVlbmNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZUFzQ29sdW1uKGNvbE5hbWUpIHtcbiAgICAgICAgY29uc3QgYWxsTGVuZ3Roc0FyZVRoZVNhbWUgPSBjaGVja1doZXRoZXJBbGxWYWx1ZXNJbkNvbHVtbkhhdmVUaGVTYW1lTGVuZ3RoKGNvbE5hbWUpO1xuICAgICAgICBjb25zdCBmaXJzdFNlcXVlbmNlID0gdGFibGVzLnZhbHVlLmNvbHVtbnMuYnlOYW1lKGNvbE5hbWUpLmdldCgwKTtcbiAgICAgICAgaWYgKGFsbExlbmd0aHNBcmVUaGVTYW1lICYmIGZpcnN0U2VxdWVuY2UubGVuZ3RoICE9IGFzTGVuZ3RoLnZhbHVlKVxuICAgICAgICAgICAgYXNMZW5ndGgudmFsdWUgPSB0YWJsZXMudmFsdWUuY29sdW1ucy5ieU5hbWUoY29sTmFtZSkuZ2V0KDApLmxlbmd0aDtcbiAgICAgICAgYXNMZW5ndGhEaXYuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIGFzTGVuZ3RoRGl2LmFwcGVuZChhc0xlbmd0aC5yb290KTtcbiAgICAgICAgYXNJbnB1dEV4YW1wbGUudmFsdWUgPSBmaXJzdFNlcXVlbmNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZUlkc0NvbHVtbihjb2xOYW1lKSB7XG4gICAgICAgIGNvbnN0IGNvbCA9IHRhYmxlcy52YWx1ZS5jb2x1bW5zLmJ5TmFtZShjb2xOYW1lKTtcbiAgICAgICAgaWYgKGNvbC50eXBlICE9IERHLlRZUEUuSU5UKVxuICAgICAgICAgICAgZ3Jvay5zaGVsbC5lcnJvcignQ29sdW1uIHNob3VsZCBjb250YWluIGludGVnZXJzIG9ubHknKTtcbiAgICAgICAgZWxzZSBpZiAoY29sLmNhdGVnb3JpZXMubGVuZ3RoIDwgY29sLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZHVwbGljYXRlcyA9IGZpbmREdXBsaWNhdGVzKGNvbC5nZXRSYXdEYXRhKCkpO1xuICAgICAgICAgICAgdWkuZGlhbG9nKCdOb24tdW5pcXVlIElEcycpXG4gICAgICAgICAgICAgICAgLmFkZCh1aS5kaXZUZXh0KCdQcmVzcyBcXCdPS1xcJyB0byBzZWxlY3Qgcm93cyB3aXRoIG5vbi11bmlxdWUgdmFsdWVzJykpXG4gICAgICAgICAgICAgICAgLm9uT0soKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRhYmxlcy52YWx1ZS5zZWxlY3Rpb247XG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uLmluaXQoKGkpID0+IGR1cGxpY2F0ZXMuaW5kZXhPZihjb2wuZ2V0KGkpKSA+IC0xKTtcbiAgICAgICAgICAgICAgICBncm9rLnNoZWxsLnYgPSBncm9rLnNoZWxsLmdldFRhYmxlVmlldyh0YWJsZXMudmFsdWUubmFtZSk7XG4gICAgICAgICAgICAgICAgZ3Jvay5zaGVsbC5pbmZvKCdSb3dzIGFyZSBzZWxlY3RlZCBpbiB0YWJsZSBcXCcnICsgdGFibGVzLnZhbHVlLm5hbWUgKyAnXFwnJyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5zaG93KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgdGFibGVzID0gdWkudGFibGVJbnB1dCgnVGFibGVzJywgZ3Jvay5zaGVsbC50YWJsZXNbMF0sIGdyb2suc2hlbGwudGFibGVzLCAodCkgPT4ge1xuICAgICAgICBpbnB1dFNzQ29sdW1uID0gdWkuY2hvaWNlSW5wdXQoJ1NTIENvbHVtbicsICcnLCB0LmNvbHVtbnMubmFtZXMoKSwgKGNvbE5hbWUpID0+IHZhbGlkYXRlU3NDb2x1bW4oY29sTmFtZSkpO1xuICAgICAgICBpbnB1dFNzQ29sdW1uRGl2LmlubmVySFRNTCA9ICcnO1xuICAgICAgICBpbnB1dFNzQ29sdW1uRGl2LmFwcGVuZChpbnB1dFNzQ29sdW1uLnJvb3QpO1xuICAgICAgICBpbnB1dEFzQ29sdW1uID0gdWkuY2hvaWNlSW5wdXQoJ0FTIENvbHVtbicsICcnLCB0LmNvbHVtbnMubmFtZXMoKSwgKGNvbE5hbWUpID0+IHZhbGlkYXRlQXNDb2x1bW4oY29sTmFtZSkpO1xuICAgICAgICBpbnB1dEFzQ29sdW1uRGl2LmlubmVySFRNTCA9ICcnO1xuICAgICAgICBpbnB1dEFzQ29sdW1uRGl2LmFwcGVuZChpbnB1dEFzQ29sdW1uLnJvb3QpO1xuICAgICAgICBpbnB1dElkQ29sdW1uID0gdWkuY2hvaWNlSW5wdXQoJ0lEIENvbHVtbicsICcnLCB0LmNvbHVtbnMubmFtZXMoKSwgKGNvbE5hbWUpID0+IHZhbGlkYXRlSWRzQ29sdW1uKGNvbE5hbWUpKTtcbiAgICAgICAgaW5wdXRJZENvbHVtbkRpdi5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgaW5wdXRJZENvbHVtbkRpdi5hcHBlbmQoaW5wdXRJZENvbHVtbi5yb290KTtcbiAgICB9KTtcbiAgICBsZXQgaW5wdXRTc0NvbHVtbiA9IHVpLmNob2ljZUlucHV0KCdTUyBDb2x1bW4nLCAnJywgW10pO1xuICAgIGlucHV0U3NDb2x1bW5EaXYuYXBwZW5kKGlucHV0U3NDb2x1bW4ucm9vdCk7XG4gICAgbGV0IGlucHV0QXNDb2x1bW4gPSB1aS5jaG9pY2VJbnB1dCgnQVMgQ29sdW1uJywgJycsIFtdKTtcbiAgICBpbnB1dEFzQ29sdW1uRGl2LmFwcGVuZChpbnB1dEFzQ29sdW1uLnJvb3QpO1xuICAgIGxldCBpbnB1dElkQ29sdW1uID0gdWkuY2hvaWNlSW5wdXQoJ0lEIENvbHVtbicsICcnLCBbXSk7XG4gICAgaW5wdXRJZENvbHVtbkRpdi5hcHBlbmQoaW5wdXRJZENvbHVtbi5yb290KTtcbiAgICB1cGRhdGVQYXR0ZXJuc0xpc3QoKTtcbiAgICBjb25zdCBzZXF1ZW5jZUJhc2UgPSB1aS5jaG9pY2VJbnB1dCgnU2VxdWVuY2UgQmFzaXMnLCBkZWZhdWx0QmFzZSwgYmFzZUNob2ljZXMsICh2KSA9PiB7XG4gICAgICAgIHVwZGF0ZUJhc2VzKHYpO1xuICAgICAgICB1cGRhdGVPdXRwdXRFeGFtcGxlcygpO1xuICAgIH0pO1xuICAgIGNvbnN0IGZ1bGx5UHRvID0gdWkuYm9vbElucHV0KCdGdWxseSBQVE8nLCBkZWZhdWx0UHRvLCAodikgPT4ge1xuICAgICAgICBmaXJzdFNzUHRvLnZhbHVlID0gdjtcbiAgICAgICAgZmlyc3RBc1B0by52YWx1ZSA9IHY7XG4gICAgICAgIHVwZGF0ZVB0byh2KTtcbiAgICAgICAgdXBkYXRlT3V0cHV0RXhhbXBsZXMoKTtcbiAgICB9KTtcbiAgICBjb25zdCBmaXJzdFNzUHRvID0gdWkuYm9vbElucHV0KCdGaXJzdCBTUyBQVE8nLCBmdWxseVB0by52YWx1ZSwgKCkgPT4gdXBkYXRlU3ZnU2NoZW1lKCkpO1xuICAgIGNvbnN0IGZpcnN0QXNQdG8gPSB1aS5ib29sSW5wdXQoJ0ZpcnN0IEFTIFBUTycsIGZ1bGx5UHRvLnZhbHVlLCAoKSA9PiB1cGRhdGVTdmdTY2hlbWUoKSk7XG4gICAgZmlyc3RBc1B0b0Rpdi5hcHBlbmQoZmlyc3RBc1B0by5yb290KTtcbiAgICBjb25zdCBjcmVhdGVBc1N0cmFuZCA9IHVpLmJvb2xJbnB1dCgnQ3JlYXRlIEFTIFN0cmFuZCcsIHRydWUsICh2KSA9PiB7XG4gICAgICAgIGFzTW9kaWZpY2F0aW9uU2VjdGlvbi5oaWRkZW4gPSAoIXYpO1xuICAgICAgICBpbnB1dEFzQ29sdW1uRGl2LmhpZGRlbiA9ICghdik7XG4gICAgICAgIGFzTGVuZ3RoRGl2LmhpZGRlbiA9ICghdik7XG4gICAgICAgIGFzTW9kaWZpY2F0aW9uRGl2LmhpZGRlbiA9ICghdik7XG4gICAgICAgIGFzRXhhbXBsZURpdi5oaWRkZW4gPSAoIXYpO1xuICAgICAgICBmaXJzdEFzUHRvRGl2LmhpZGRlbiA9ICghdik7XG4gICAgICAgIHVwZGF0ZVN2Z1NjaGVtZSgpO1xuICAgIH0pO1xuICAgIGNvbnN0IHNhdmVBcyA9IHVpLnRleHRJbnB1dCgnU2F2ZSBBcycsICdQYXR0ZXJuIE5hbWUnLCAoKSA9PiB1cGRhdGVTdmdTY2hlbWUoKSk7XG4gICAgc2F2ZUFzLnNldFRvb2x0aXAoJ05hbWUgT2YgTmV3IFBhdHRlcm4nKTtcbiAgICBjb25zdCBzc1RocmVlTW9kaWZpY2F0aW9uID0gdWkuc3RyaW5nSW5wdXQoJ1NTIDNcXCcgTW9kaWZpY2F0aW9uJywgJycsICgpID0+IHtcbiAgICAgICAgdXBkYXRlU3ZnU2NoZW1lKCk7XG4gICAgICAgIHVwZGF0ZU91dHB1dEV4YW1wbGVzKCk7XG4gICAgfSk7XG4gICAgc3NUaHJlZU1vZGlmaWNhdGlvbi5zZXRUb29sdGlwKCdBZGRpdGlvbmFsIFNTIDNcXCcgTW9kaWZpY2F0aW9uJyk7XG4gICAgY29uc3Qgc3NGaXZlTW9kaWZpY2F0aW9uID0gdWkuc3RyaW5nSW5wdXQoJ1NTIDVcXCcgTW9kaWZpY2F0aW9uJywgJycsICgpID0+IHtcbiAgICAgICAgdXBkYXRlU3ZnU2NoZW1lKCk7XG4gICAgICAgIHVwZGF0ZU91dHB1dEV4YW1wbGVzKCk7XG4gICAgfSk7XG4gICAgc3NGaXZlTW9kaWZpY2F0aW9uLnNldFRvb2x0aXAoJ0FkZGl0aW9uYWwgU1MgNVxcJyBNb2RpZmljYXRpb24nKTtcbiAgICBjb25zdCBhc1RocmVlTW9kaWZpY2F0aW9uID0gdWkuc3RyaW5nSW5wdXQoJ0FTIDNcXCcgTW9kaWZpY2F0aW9uJywgJycsICgpID0+IHtcbiAgICAgICAgdXBkYXRlU3ZnU2NoZW1lKCk7XG4gICAgICAgIHVwZGF0ZU91dHB1dEV4YW1wbGVzKCk7XG4gICAgfSk7XG4gICAgYXNUaHJlZU1vZGlmaWNhdGlvbi5zZXRUb29sdGlwKCdBZGRpdGlvbmFsIEFTIDNcXCcgTW9kaWZpY2F0aW9uJyk7XG4gICAgY29uc3QgYXNGaXZlTW9kaWZpY2F0aW9uID0gdWkuc3RyaW5nSW5wdXQoJ0FTIDVcXCcgTW9kaWZpY2F0aW9uJywgJycsICgpID0+IHtcbiAgICAgICAgdXBkYXRlU3ZnU2NoZW1lKCk7XG4gICAgICAgIHVwZGF0ZU91dHB1dEV4YW1wbGVzKCk7XG4gICAgfSk7XG4gICAgYXNGaXZlTW9kaWZpY2F0aW9uLnNldFRvb2x0aXAoJ0FkZGl0aW9uYWwgQVMgNVxcJyBNb2RpZmljYXRpb24nKTtcbiAgICBhc01vZGlmaWNhdGlvbkRpdi5hcHBlbmQoYXNUaHJlZU1vZGlmaWNhdGlvbi5yb290KTtcbiAgICBhc01vZGlmaWNhdGlvbkRpdi5hcHBlbmQoYXNGaXZlTW9kaWZpY2F0aW9uLnJvb3QpO1xuICAgIGNvbnN0IGNvbW1lbnQgPSB1aS50ZXh0SW5wdXQoJ0NvbW1lbnQnLCAnJywgKCkgPT4gdXBkYXRlU3ZnU2NoZW1lKCkpO1xuICAgIGNvbnN0IHNhdmVQYXR0ZXJuQnV0dG9uID0gdWkuYnV0dG9uKCdTYXZlJywgKCkgPT4ge1xuICAgICAgICBpZiAoc2F2ZUFzLnZhbHVlICE9ICcnKVxuICAgICAgICAgICAgc2F2ZVBhdHRlcm4oKS50aGVuKChyKSA9PiBncm9rLnNoZWxsLmluZm8oJ1BhdHRlcm4gc2F2ZWQnKSk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IHVpLnN0cmluZ0lucHV0KCdFbnRlciBOYW1lJywgJycpO1xuICAgICAgICAgICAgdWkuZGlhbG9nKCdQYXR0ZXJuIE5hbWUnKVxuICAgICAgICAgICAgICAgIC5hZGQobmFtZS5yb290KVxuICAgICAgICAgICAgICAgIC5vbk9LKCgpID0+IHtcbiAgICAgICAgICAgICAgICBzYXZlQXMudmFsdWUgPSBuYW1lLnZhbHVlO1xuICAgICAgICAgICAgICAgIHNhdmVQYXR0ZXJuKCkudGhlbigocikgPT4gZ3Jvay5zaGVsbC5pbmZvKCdQYXR0ZXJuIHNhdmVkJykpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuc2hvdygpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgY29udmVydFNlcXVlbmNlQnV0dG9uID0gdWkuYnV0dG9uKCdDb252ZXJ0IFNlcXVlbmNlcycsICgpID0+IHtcbiAgICAgICAgaWYgKGlucHV0U3NDb2x1bW4udmFsdWUgPT0gbnVsbCB8fCAoY3JlYXRlQXNTdHJhbmQudmFsdWUgJiYgaW5wdXRBc0NvbHVtbi52YWx1ZSA9PSBudWxsKSlcbiAgICAgICAgICAgIGdyb2suc2hlbGwuaW5mbygnUGxlYXNlIHNlbGVjdCB0YWJsZSBhbmQgY29sdW1ucyBvbiB3aGljaCB0byBhcHBseSBwYXR0ZXJuJyk7XG4gICAgICAgIGVsc2UgaWYgKHNzTGVuZ3RoLnZhbHVlICE9IHNzSW5wdXRFeGFtcGxlLnZhbHVlLmxlbmd0aCB8fCBhc0xlbmd0aC52YWx1ZSAhPSBhc0lucHV0RXhhbXBsZS52YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpYWxvZyA9IHVpLmRpYWxvZygnTGVuZ3RoIE1pc21hdGNoJyk7XG4gICAgICAgICAgICAkKGRpYWxvZy5nZXRCdXR0b24oJ09LJykpLmhpZGUoKTtcbiAgICAgICAgICAgIGRpYWxvZ1xuICAgICAgICAgICAgICAgIC5hZGQodWkuZGl2VGV4dCgnTGVuZ3RoIG9mIHNlcXVlbmNlcyBpbiBjb2x1bW5zIGRvZXNuXFwndCBtYXRjaCBlbnRlcmVkIGxlbmd0aC4gVXBkYXRlIGxlbmd0aCB2YWx1ZT8nKSlcbiAgICAgICAgICAgICAgICAuYWRkQnV0dG9uKCdZRVMnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgc3NMZW5ndGgudmFsdWUgPSB0YWJsZXMudmFsdWUuY29sdW1ucy5ieU5hbWUoaW5wdXRTc0NvbHVtbi52YWx1ZSkuZ2V0U3RyaW5nKDApLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBhc0xlbmd0aC52YWx1ZSA9IHRhYmxlcy52YWx1ZS5jb2x1bW5zLmJ5TmFtZShpbnB1dEFzQ29sdW1uLnZhbHVlKS5nZXRTdHJpbmcoMCkubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGRpYWxvZy5jbG9zZSgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuc2hvdygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGlucHV0SWRDb2x1bW4udmFsdWUgIT0gbnVsbClcbiAgICAgICAgICAgICAgICBhZGRDb2x1bW5XaXRoSWRzKHRhYmxlcy52YWx1ZS5uYW1lLCBpbnB1dElkQ29sdW1uLnZhbHVlLCBnZXRTaG9ydE5hbWUoc2F2ZUFzLnZhbHVlKSk7XG4gICAgICAgICAgICBhZGRDb2x1bW5XaXRoVHJhbnNsYXRlZFNlcXVlbmNlcyh0YWJsZXMudmFsdWUubmFtZSwgaW5wdXRTc0NvbHVtbi52YWx1ZSwgc3NCYXNlcywgc3NQdG9MaW5rYWdlcywgc3NGaXZlTW9kaWZpY2F0aW9uLCBzc1RocmVlTW9kaWZpY2F0aW9uLCBmaXJzdFNzUHRvLnZhbHVlKTtcbiAgICAgICAgICAgIGlmIChjcmVhdGVBc1N0cmFuZC52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGFkZENvbHVtbldpdGhUcmFuc2xhdGVkU2VxdWVuY2VzKHRhYmxlcy52YWx1ZS5uYW1lLCBpbnB1dEFzQ29sdW1uLnZhbHVlLCBhc0Jhc2VzLCBhc1B0b0xpbmthZ2VzLCBhc0ZpdmVNb2RpZmljYXRpb24sIGFzVGhyZWVNb2RpZmljYXRpb24sIGZpcnN0QXNQdG8udmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ3Jvay5zaGVsbC52ID0gZ3Jvay5zaGVsbC5nZXRUYWJsZVZpZXcodGFibGVzLnZhbHVlLm5hbWUpO1xuICAgICAgICAgICAgZ3Jvay5zaGVsbC5pbmZvKCgoY3JlYXRlQXNTdHJhbmQudmFsdWUpID8gJ0NvbHVtbnMgd2VyZScgOiAnQ29sdW1uIHdhcycpICtcbiAgICAgICAgICAgICAgICAnIGFkZGVkIHRvIHRhYmxlIFxcJycgKyB0YWJsZXMudmFsdWUubmFtZSArICdcXCcnKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHNzSW5wdXRFeGFtcGxlID0gdWkudGV4dElucHV0KCdTZW5zZSBTdHJhbmQnLCBnZW5lcmF0ZUV4YW1wbGUoc3NMZW5ndGgudmFsdWUsIHNlcXVlbmNlQmFzZS52YWx1ZSksICgpID0+IHtcbiAgICAgICAgc3NPdXRwdXRFeGFtcGxlLnZhbHVlID0gdHJhbnNsYXRlU2VxdWVuY2Uoc3NJbnB1dEV4YW1wbGUudmFsdWUsIHNzQmFzZXMsIHNzUHRvTGlua2FnZXMsIHNzRml2ZU1vZGlmaWNhdGlvbiwgc3NUaHJlZU1vZGlmaWNhdGlvbiwgZmlyc3RTc1B0by52YWx1ZSk7XG4gICAgfSk7XG4gICAgY29uc3Qgc3NPdXRwdXRFeGFtcGxlID0gdWkudGV4dElucHV0KCcgJywgdHJhbnNsYXRlU2VxdWVuY2Uoc3NJbnB1dEV4YW1wbGUudmFsdWUsIHNzQmFzZXMsIHNzUHRvTGlua2FnZXMsIHNzVGhyZWVNb2RpZmljYXRpb24sIHNzRml2ZU1vZGlmaWNhdGlvbiwgZmlyc3RTc1B0by52YWx1ZSkpO1xuICAgIHNzSW5wdXRFeGFtcGxlLmlucHV0LnN0eWxlLnJlc2l6ZSA9ICdub25lJztcbiAgICBzc0lucHV0RXhhbXBsZS5pbnB1dC5zdHlsZS5taW5XaWR0aCA9IGV4YW1wbGVNaW5XaWR0aDtcbiAgICBzc091dHB1dEV4YW1wbGUuaW5wdXQuc3R5bGUucmVzaXplID0gJ25vbmUnO1xuICAgIHNzT3V0cHV0RXhhbXBsZS5pbnB1dC5zdHlsZS5taW5XaWR0aCA9IGV4YW1wbGVNaW5XaWR0aDtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgc3NPdXRwdXRFeGFtcGxlLmlucHV0LmRpc2FibGVkID0gJ3RydWUnO1xuICAgIHNzT3V0cHV0RXhhbXBsZS5yb290LmFwcGVuZCh1aS5kaXYoW1xuICAgICAgICB1aS5idXR0b24odWkuaWNvbkZBKCdjb3B5JywgKCkgPT4geyB9KSwgKCkgPT4ge1xuICAgICAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoc3NPdXRwdXRFeGFtcGxlLnZhbHVlKS50aGVuKCgpID0+IGdyb2suc2hlbGwuaW5mbygnU2VxdWVuY2Ugd2FzIGNvcGllZCB0byBjbGlwYm9hcmQnKSk7XG4gICAgICAgIH0pLFxuICAgIF0sICd1aS1pbnB1dC1vcHRpb25zJykpO1xuICAgIGNvbnN0IGFzSW5wdXRFeGFtcGxlID0gdWkudGV4dElucHV0KCdBbnRpc2Vuc2UgU3RyYW5kJywgZ2VuZXJhdGVFeGFtcGxlKGFzTGVuZ3RoLnZhbHVlLCBzZXF1ZW5jZUJhc2UudmFsdWUpLCAoKSA9PiB7XG4gICAgICAgIGFzT3V0cHV0RXhhbXBsZS52YWx1ZSA9IHRyYW5zbGF0ZVNlcXVlbmNlKGFzSW5wdXRFeGFtcGxlLnZhbHVlLCBhc0Jhc2VzLCBhc1B0b0xpbmthZ2VzLCBhc0ZpdmVNb2RpZmljYXRpb24sIGFzVGhyZWVNb2RpZmljYXRpb24sIGZpcnN0U3NQdG8udmFsdWUpO1xuICAgIH0pO1xuICAgIGNvbnN0IGFzT3V0cHV0RXhhbXBsZSA9IHVpLnRleHRJbnB1dCgnICcsIHRyYW5zbGF0ZVNlcXVlbmNlKGFzSW5wdXRFeGFtcGxlLnZhbHVlLCBhc0Jhc2VzLCBhc1B0b0xpbmthZ2VzLCBhc0ZpdmVNb2RpZmljYXRpb24sIGFzVGhyZWVNb2RpZmljYXRpb24sIGZpcnN0U3NQdG8udmFsdWUpKTtcbiAgICBhc0lucHV0RXhhbXBsZS5pbnB1dC5zdHlsZS5yZXNpemUgPSAnbm9uZSc7XG4gICAgYXNJbnB1dEV4YW1wbGUuaW5wdXQuc3R5bGUubWluV2lkdGggPSBleGFtcGxlTWluV2lkdGg7XG4gICAgYXNPdXRwdXRFeGFtcGxlLmlucHV0LnN0eWxlLnJlc2l6ZSA9ICdub25lJztcbiAgICBhc091dHB1dEV4YW1wbGUuaW5wdXQuc3R5bGUubWluV2lkdGggPSBleGFtcGxlTWluV2lkdGg7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGFzT3V0cHV0RXhhbXBsZS5pbnB1dC5kaXNhYmxlZCA9ICd0cnVlJztcbiAgICBhc091dHB1dEV4YW1wbGUucm9vdC5hcHBlbmQodWkuZGl2KFtcbiAgICAgICAgdWkuYnV0dG9uKHVpLmljb25GQSgnY29weScsICgpID0+IHsgfSksICgpID0+IHtcbiAgICAgICAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGFzT3V0cHV0RXhhbXBsZS52YWx1ZSkudGhlbigoKSA9PiBncm9rLnNoZWxsLmluZm8oJ1NlcXVlbmNlIHdhcyBjb3BpZWQgdG8gY2xpcGJvYXJkJykpO1xuICAgICAgICB9KSxcbiAgICBdLCAndWktaW5wdXQtb3B0aW9ucycpKTtcbiAgICBhc0V4YW1wbGVEaXYuYXBwZW5kKGFzSW5wdXRFeGFtcGxlLnJvb3QpO1xuICAgIGFzRXhhbXBsZURpdi5hcHBlbmQoYXNPdXRwdXRFeGFtcGxlLnJvb3QpO1xuICAgIHVwZGF0ZVVpRm9yTmV3U2VxdWVuY2VMZW5ndGgoKTtcbiAgICBjb25zdCBleGFtcGxlU2VjdGlvbiA9IHVpLmRpdihbXG4gICAgICAgIHVpLmgxKCdFeGFtcGxlJyksXG4gICAgICAgIHNzSW5wdXRFeGFtcGxlLnJvb3QsXG4gICAgICAgIHNzT3V0cHV0RXhhbXBsZS5yb290LFxuICAgICAgICBhc0V4YW1wbGVEaXYsXG4gICAgXSwgJ3VpLWZvcm0nKTtcbiAgICBjb25zdCBpbnB1dHNTZWN0aW9uID0gdWkuZGl2KFtcbiAgICAgICAgdWkuaDEoJ0lucHV0cycpLFxuICAgICAgICB1aS5kaXZIKFtcbiAgICAgICAgICAgIHRhYmxlcy5yb290LFxuICAgICAgICAgICAgaW5wdXRTc0NvbHVtbkRpdixcbiAgICAgICAgXSksXG4gICAgICAgIHVpLmRpdkgoW1xuICAgICAgICAgICAgaW5wdXRBc0NvbHVtbkRpdixcbiAgICAgICAgICAgIGlucHV0SWRDb2x1bW5EaXYsXG4gICAgICAgIF0pLFxuICAgICAgICB1aS5idXR0b25zSW5wdXQoW1xuICAgICAgICAgICAgY29udmVydFNlcXVlbmNlQnV0dG9uLFxuICAgICAgICBdKSxcbiAgICBdLCAndWktZm9ybScpO1xuICAgIGNvbnN0IG1haW5TZWN0aW9uID0gdWkucGFuZWwoW1xuICAgICAgICB1aS5ibG9jayhbXG4gICAgICAgICAgICBzdmdEaXYsXG4gICAgICAgIF0sIHsgc3R5bGU6IHsgb3ZlcmZsb3dYOiAnc2Nyb2xsJyB9IH0pLFxuICAgICAgICB1aS5idXR0b24oJ0Rvd25sb2FkJywgKCkgPT4gc3ZnLnNhdmVTdmdBc1BuZyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXlTdmcnKSwgc2F2ZUFzLnZhbHVlKSksXG4gICAgICAgIGlzRW51bWVyYXRlTW9kaWZpY2F0aW9uc0RpdixcbiAgICAgICAgdWkuZGl2KFtcbiAgICAgICAgICAgIHVpLmRpdihbXG4gICAgICAgICAgICAgICAgdWkuZGl2SChbXG4gICAgICAgICAgICAgICAgICAgIHVpLmgxKCdQYXR0ZXJuJyksXG4gICAgICAgICAgICAgICAgICAgIHVpLmRpdihbXG4gICAgICAgICAgICAgICAgICAgICAgICB1aS5pY29uRkEoJ3F1ZXN0aW9uLWNpcmNsZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBBeG9sYWJzRGVzY3JpcHRpb24uaW5uZXJIVE1MID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwQXhvbGFic0Rlc2NyaXB0aW9uLmFwcGVuZChpbmZvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBdLCB7IHN0eWxlOiB7IHBhZGRpbmc6ICcycHgnIH0gfSksXG4gICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgICAgdWkuZGl2SChbXG4gICAgICAgICAgICAgICAgICAgIHVpLmRpdihbXG4gICAgICAgICAgICAgICAgICAgICAgICBzc0xlbmd0aC5yb290LFxuICAgICAgICAgICAgICAgICAgICAgICAgYXNMZW5ndGhEaXYsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUJhc2Uucm9vdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQucm9vdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRQYXR0ZXJuRGl2LFxuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUFzLnJvb3QsXG4gICAgICAgICAgICAgICAgICAgICAgICB1aS5idXR0b25zSW5wdXQoW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVQYXR0ZXJuQnV0dG9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgICAgICAgIF0sICd1aS1mb3JtJyksXG4gICAgICAgICAgICAgICAgICAgIHVpLmRpdihbXG4gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVBc1N0cmFuZC5yb290LFxuICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHlQdG8ucm9vdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0U3NQdG8ucm9vdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0QXNQdG9EaXYsXG4gICAgICAgICAgICAgICAgICAgICAgICBzc0ZpdmVNb2RpZmljYXRpb24ucm9vdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNzVGhyZWVNb2RpZmljYXRpb24ucm9vdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzTW9kaWZpY2F0aW9uRGl2LFxuICAgICAgICAgICAgICAgICAgICBdLCAndWktZm9ybScpLFxuICAgICAgICAgICAgICAgIF0sICd1aS1mb3JtJyksXG4gICAgICAgICAgICBdLCAndWktZm9ybScpLFxuICAgICAgICAgICAgaW5wdXRzU2VjdGlvbixcbiAgICAgICAgICAgIGV4YW1wbGVTZWN0aW9uLFxuICAgICAgICBdLCB7IHN0eWxlOiB7IGZsZXhXcmFwOiAnd3JhcCcgfSB9KSxcbiAgICBdKTtcbiAgICBjb25zdCBzc01vZGlmaWNhdGlvblNlY3Rpb24gPSB1aS5wYW5lbChbXG4gICAgICAgIHVpLmgxKCdTZW5zZSBTdHJhbmQnKSxcbiAgICAgICAgdWkuZGl2SChbXG4gICAgICAgICAgICB1aS5kaXYoW3VpLmRpdlRleHQoJyMnKV0sIHsgc3R5bGU6IHsgd2lkdGg6ICcyMHB4JyB9IH0pLFxuICAgICAgICAgICAgdWkuYmxvY2s3NShbdWkuZGl2VGV4dCgnTW9kaWZpY2F0aW9uJyldKSxcbiAgICAgICAgICAgIHVpLmRpdihbdWkuZGl2VGV4dCgnUFRPJyldLCB7IHN0eWxlOiB7IHBhZGRpbmdSaWdodDogJzhweCcgfSB9KSxcbiAgICAgICAgXSksXG4gICAgICAgIHNzTW9kaWZpY2F0aW9uSXRlbXMsXG4gICAgXSk7XG4gICAgY29uc3QgYXNNb2RpZmljYXRpb25TZWN0aW9uID0gdWkucGFuZWwoW1xuICAgICAgICB1aS5oMSgnQW50aXNlbnNlIFN0cmFuZCcpLFxuICAgICAgICB1aS5kaXZIKFtcbiAgICAgICAgICAgIHVpLmRpdihbdWkuZGl2VGV4dCgnIycpXSwgeyBzdHlsZTogeyB3aWR0aDogJzIwcHgnIH0gfSksXG4gICAgICAgICAgICB1aS5ibG9jazc1KFt1aS5kaXZUZXh0KCdNb2RpZmljYXRpb24nKV0pLFxuICAgICAgICAgICAgdWkuZGl2KFt1aS5kaXZUZXh0KCdQVE8nKV0sIHsgc3R5bGU6IHsgcGFkZGluZ1JpZ2h0OiAnOHB4JyB9IH0pLFxuICAgICAgICBdKSxcbiAgICAgICAgYXNNb2RpZmljYXRpb25JdGVtcyxcbiAgICBdKTtcbiAgICBjb25zdCBpbmZvID0gdWkuaW5mbyhbXG4gICAgICAgIHVpLmRpdlRleHQoJ1xcbiBIb3cgdG8gZGVmaW5lIG5ldyBwYXR0ZXJuOicsIHsgc3R5bGU6IHsgJ2ZvbnQtd2VpZ2h0JzogJ2JvbGRlcicgfSB9KSxcbiAgICAgICAgdWkuZGl2VGV4dCgnMS4gQ2hvb3NlIHRhYmxlIGFuZCBjb2x1bW5zIHdpdGggc2Vuc2UgYW5kIGFudGlzZW5zZSBzdHJhbmRzJyksXG4gICAgICAgIHVpLmRpdlRleHQoJzIuIENob29zZSBsZW5ndGhzIG9mIGJvdGggc3RyYW5kcyBieSBlZGl0aW5nIGNoZWNrYm94ZXMgYmVsb3cnKSxcbiAgICAgICAgdWkuZGl2VGV4dCgnMy4gQ2hvb3NlIGJhc2lzIGFuZCBQVE8gc3RhdHVzIGZvciBlYWNoIG51Y2xlb3RpZGUnKSxcbiAgICAgICAgdWkuZGl2VGV4dCgnNC4gU2V0IGFkZGl0aW9uYWwgbW9kaWZpY2F0aW9ucyBmb3Igc2VxdWVuY2UgZWRnZXMnKSxcbiAgICAgICAgdWkuZGl2VGV4dCgnNS4gUHJlc3MgXFwnQ29udmVydCBTZXF1ZW5jZXNcXCcgYnV0dG9uJyksXG4gICAgICAgIHVpLmRpdlRleHQoJ1RoaXMgd2lsbCBhZGQgdGhlIHJlc3VsdCBjb2x1bW4ocykgdG8gdGhlIHJpZ2h0IG9mIHRoZSB0YWJsZScpLFxuICAgIF0sICdDcmVhdGUgYW5kIGFwcGx5IEF4b2xhYnMgdHJhbnNsYXRpb24gcGF0dGVybnMuJyk7XG4gICAgcmV0dXJuIHVpLnNwbGl0SChbXG4gICAgICAgIHVpLmRpdihbXG4gICAgICAgICAgICBhcHBBeG9sYWJzRGVzY3JpcHRpb24sXG4gICAgICAgICAgICBtYWluU2VjdGlvbixcbiAgICAgICAgXSksXG4gICAgICAgIHVpLmJveCh1aS5kaXZIKFtcbiAgICAgICAgICAgIHNzTW9kaWZpY2F0aW9uU2VjdGlvbixcbiAgICAgICAgICAgIGFzTW9kaWZpY2F0aW9uU2VjdGlvbixcbiAgICAgICAgXSksIHsgc3R5bGU6IHsgbWF4V2lkdGg6ICczNjBweCcgfSB9KSxcbiAgICBdKTtcbn1cbiIsImltcG9ydCB7IGF4b2xhYnNNYXAgfSBmcm9tICcuL2F4b2xhYnNNYXAnO1xuLy8gaHR0cHM6Ly91eGRlc2lnbi5jYy9zdGFyLXJhdGluZy1tYWtlLXN2Zy1ncmVhdC1hZ2Fpbi1kNGNlNDczMTM0N2VcbmZ1bmN0aW9uIGdldFBvaW50c1RvRHJhd1N0YXIoY2VudGVyWCwgY2VudGVyWSkge1xuICAgIGNvbnN0IGlubmVyQ2lyY2xlUG9pbnRzID0gNTsgLy8gYSA1IHBvaW50IHN0YXJcbiAgICBjb25zdCBpbm5lclJhZGl1cyA9IDE1IC8gaW5uZXJDaXJjbGVQb2ludHM7XG4gICAgY29uc3QgaW5uZXJPdXRlclJhZGl1c1JhdGlvID0gMjsgLy8gb3V0dGVyIGNpcmNsZSBpcyB4MiB0aGUgaW5uZXJcbiAgICBjb25zdCBvdXRlclJhZGl1cyA9IGlubmVyUmFkaXVzICogaW5uZXJPdXRlclJhZGl1c1JhdGlvO1xuICAgIGNvbnN0IGFuZ2xlID0gTWF0aC5QSSAvIGlubmVyQ2lyY2xlUG9pbnRzO1xuICAgIGNvbnN0IGFuZ2xlT2Zmc2V0VG9DZW50ZXJTdGFyID0gNjA7XG4gICAgY29uc3QgdG90YWxOdW1iZXJPZlBvaW50cyA9IGlubmVyQ2lyY2xlUG9pbnRzICogMjsgLy8gMTAgaW4gYSA1LXBvaW50cyBzdGFyXG4gICAgbGV0IHBvaW50cyA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG90YWxOdW1iZXJPZlBvaW50czsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHIgPSAoaSAlIDIgPT0gMCkgPyBvdXRlclJhZGl1cyA6IGlubmVyUmFkaXVzO1xuICAgICAgICBjb25zdCBjdXJyZW50WCA9IGNlbnRlclggKyBNYXRoLmNvcyhpICogYW5nbGUgKyBhbmdsZU9mZnNldFRvQ2VudGVyU3RhcikgKiByO1xuICAgICAgICBjb25zdCBjdXJyZW50WSA9IGNlbnRlclkgKyBNYXRoLnNpbihpICogYW5nbGUgKyBhbmdsZU9mZnNldFRvQ2VudGVyU3RhcikgKiByO1xuICAgICAgICBwb2ludHMgKz0gY3VycmVudFggKyAnLCcgKyBjdXJyZW50WSArICcgJztcbiAgICB9XG4gICAgcmV0dXJuIHBvaW50cztcbn1cbmZ1bmN0aW9uIGNvdW50T3ZlcmhhbmdzT25UaGVSaWdodEVkZ2UobW9kaWZpY2F0aW9ucykge1xuICAgIGxldCBpID0gMDtcbiAgICB3aGlsZSAoaSA8IG1vZGlmaWNhdGlvbnMubGVuZ3RoICYmIG1vZGlmaWNhdGlvbnNbaV0uc2xpY2UoLTMpID09ICcobyknKVxuICAgICAgICBpKys7XG4gICAgcmV0dXJuIChpID09IG1vZGlmaWNhdGlvbnMubGVuZ3RoIC0gMSkgPyAwIDogaTtcbn1cbmZ1bmN0aW9uIGdldFRleHRXaWR0aCh0ZXh0LCBmb250KSB7XG4gICAgY29uc3QgY29udGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpLmdldENvbnRleHQoJzJkJyk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnRleHQuZm9udCA9IFN0cmluZyhmb250KTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmV0dXJuIDIgKiBjb250ZXh0Lm1lYXN1cmVUZXh0KHRleHQpLndpZHRoO1xufVxuZnVuY3Rpb24gZ2V0VGV4dEluc2lkZUNpcmNsZShiYXNlcywgaW5kZXgsIG51Y2xlb3RpZGVDb3VudGVyLCBudW1iZXJPZk51Y2xlb3RpZGVzLCBlbnVtZXJhdGVNb2RpZmljYXRpb25zKSB7XG4gICAgcmV0dXJuIChiYXNlc1tpbmRleF0uc2xpY2UoLTMpID09ICcobyknKSB8fCAhZW51bWVyYXRlTW9kaWZpY2F0aW9ucy5pbmNsdWRlcyhiYXNlc1tpbmRleF0pID8gJycgOlxuICAgICAgICBbJ0EnLCAnRycsICdDJywgJ1UnLCAnVCddLmluY2x1ZGVzKGJhc2VzW2luZGV4XSkgPyBiYXNlc1tpbmRleF0gOiBTdHJpbmcobnVtYmVyT2ZOdWNsZW90aWRlcyAtIG51Y2xlb3RpZGVDb3VudGVyKTtcbn1cbmZ1bmN0aW9uIGdldEZvbnRDb2xvclZpc2libGVPbkJhY2tncm91bmQocmdiU3RyaW5nKSB7XG4gICAgY29uc3QgcmdiSW50TGlzdCA9IHJnYlN0cmluZy5tYXRjaCgvXFxkKy9nKS5tYXAoKGUpID0+IE51bWJlcihlKSk7XG4gICAgcmV0dXJuIChyZ2JJbnRMaXN0WzBdICogMC4yOTkgKyByZ2JJbnRMaXN0WzFdICogMC41ODcgKyByZ2JJbnRMaXN0WzJdICogMC4xMTQpID4gMTg2ID8gJyMzMzMzMycgOiAnI2ZmZmZmZic7XG59XG5mdW5jdGlvbiBnZXRCYXNlQ29sb3IoYmFzZSkge1xuICAgIHJldHVybiBheG9sYWJzTWFwW2Jhc2VdWydjb2xvciddO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRyYXdBeG9sYWJzUGF0dGVybihwYXR0ZXJuTmFtZSwgYXNFeGlzdHMsIHNzQmFzZXMsIGFzQmFzZXMsIHNzUHRvU3RhdHVzZXMsIGFzUHRvU3RhdHVzZXMsIHNzVGhyZWVNb2RpZmljYXRpb24sIHNzRml2ZU1vZGlmaWNhdGlvbiwgYXNUaHJlZU1vZGlmaWNhdGlvbiwgYXNGaXZlTW9kaWZpY2F0aW9uLCBjb21tZW50LCBlbnVtZXJhdGVNb2RpZmljYXRpb25zKSB7XG4gICAgZnVuY3Rpb24gZ2V0RXF1aWRpc3RhbnRYRm9yTGVnZW5kKGluZGV4KSB7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKChpbmRleCArIHN0YXJ0RnJvbSkgKiB3aWR0aCAvICh1bmlxdWVCYXNlcy5sZW5ndGggKyBzdGFydEZyb20pICsgbGVnZW5kUmFkaXVzKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0WE9mQmFzZUNpcmNsZXMoaW5kZXgsIHJpZ2h0T3ZlcmhhbmdzKSB7XG4gICAgICAgIHJldHVybiB3aWR0aE9mUmlnaHRNb2RpZmljYXRpb24gK1xuICAgICAgICAgICAgKHJlc3VsdGluZ051bWJlck9mTnVjbGVvdGlkZXNJblN0cmFuZHMgLSBpbmRleCArIHJpZ2h0T3ZlcmhhbmdzICsgMSkgKiBiYXNlRGlhbWV0ZXI7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldFNoaWZ0VG9BbGlnbk51bWJlckluc2lkZUNpcmNsZShiYXNlcywgZ2VuZXJhbEluZGV4LCBudWNsZW90aWRlSW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIChudWNsZW90aWRlSW5kZXggPCAxMCB8fCBbJ0EnLCAnRycsICdDJywgJ1UnLCAnVCddLlxuICAgICAgICAgICAgaW5jbHVkZXMoYmFzZXNbZ2VuZXJhbEluZGV4XSkpID8gc2hpZnRUb0FsaWduT25lRGlnaXROdW1iZXJJbnNpZGVDaXJjbGUgOiBzaGlmdFRvQWxpZ25Ud29EaWdpdE51bWJlckluc2lkZUNpcmNsZTtcbiAgICB9XG4gICAgY29uc3Qgc3ZnID0ge1xuICAgICAgICB4bWxuczogJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyxcbiAgICAgICAgcmVuZGVyOiBmdW5jdGlvbiAod2lkdGgsIGhlaWdodCkge1xuICAgICAgICAgICAgY29uc3QgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh0aGlzLnhtbG5zLCAnc3ZnJyk7XG4gICAgICAgICAgICBlLnNldEF0dHJpYnV0ZSgnaWQnLCAnbXlTdmcnKTtcbiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCd3aWR0aCcsIFN0cmluZyh3aWR0aCkpO1xuICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIFN0cmluZyhoZWlnaHQpKTtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICB9LFxuICAgICAgICBjaXJjbGU6IGZ1bmN0aW9uICh4LCB5LCByYWRpdXMsIGNvbG9yKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHRoaXMueG1sbnMsICdjaXJjbGUnKTtcbiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCdjeCcsIFN0cmluZyh4KSk7XG4gICAgICAgICAgICBlLnNldEF0dHJpYnV0ZSgnY3knLCBTdHJpbmcoeSkpO1xuICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ3InLCBTdHJpbmcocmFkaXVzKSk7XG4gICAgICAgICAgICBlLnNldEF0dHJpYnV0ZSgnZmlsbCcsIGNvbG9yKTtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICB9LFxuICAgICAgICB0ZXh0OiBmdW5jdGlvbiAodGV4dCwgeCwgeSwgZm9udFNpemUsIGNvbG9yKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHRoaXMueG1sbnMsICd0ZXh0Jyk7XG4gICAgICAgICAgICBlLnNldEF0dHJpYnV0ZSgneCcsIFN0cmluZyh4KSk7XG4gICAgICAgICAgICBlLnNldEF0dHJpYnV0ZSgneScsIFN0cmluZyh5KSk7XG4gICAgICAgICAgICBlLnNldEF0dHJpYnV0ZSgnZm9udC1zaXplJywgU3RyaW5nKGZvbnRTaXplKSk7XG4gICAgICAgICAgICBlLnNldEF0dHJpYnV0ZSgnZm9udC13ZWlnaHQnLCAnbm9ybWFsJyk7XG4gICAgICAgICAgICBlLnNldEF0dHJpYnV0ZSgnZm9udC1mYW1pbHknLCAnQXJpYWwnKTtcbiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCdmaWxsJywgY29sb3IpO1xuICAgICAgICAgICAgZS5pbm5lckhUTUwgPSB0ZXh0O1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgIH0sXG4gICAgICAgIHN0YXI6IGZ1bmN0aW9uICh4LCB5LCBmaWxsKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHRoaXMueG1sbnMsICdwb2x5Z29uJyk7XG4gICAgICAgICAgICBlLnNldEF0dHJpYnV0ZSgncG9pbnRzJywgZ2V0UG9pbnRzVG9EcmF3U3Rhcih4LCB5KSk7XG4gICAgICAgICAgICBlLnNldEF0dHJpYnV0ZSgnZmlsbCcsIGZpbGwpO1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgIH0sXG4gICAgfTtcbiAgICBzc0Jhc2VzID0gc3NCYXNlcy5yZXZlcnNlKCk7XG4gICAgc3NQdG9TdGF0dXNlcyA9IHNzUHRvU3RhdHVzZXMucmV2ZXJzZSgpO1xuICAgIGNvbnN0IGJhc2VSYWRpdXMgPSAxNTtcbiAgICBjb25zdCBzaGlmdFRvQWxpZ25Ud29EaWdpdE51bWJlckluc2lkZUNpcmNsZSA9IC0xMDtcbiAgICBjb25zdCBzaGlmdFRvQWxpZ25PbmVEaWdpdE51bWJlckluc2lkZUNpcmNsZSA9IC01O1xuICAgIGNvbnN0IGxlZ2VuZFJhZGl1cyA9IDY7XG4gICAgY29uc3QgcHNMaW5rYWdlUmFkaXVzID0gNTtcbiAgICBjb25zdCBiYXNlRm9udFNpemUgPSAxNztcbiAgICBjb25zdCBsZWdlbmRGb250U2l6ZSA9IDE0O1xuICAgIGNvbnN0IHBzTGlua2FnZUNvbG9yID0gJ3JlZCc7XG4gICAgY29uc3QgZm9udENvbG9yID0gJ3ZhcigtLWdyZXktNiknO1xuICAgIGNvbnN0IHRpdGxlRm9udENvbG9yID0gJ2JsYWNrJztcbiAgICBjb25zdCBtb2RpZmljYXRpb25zQ29sb3IgPSAncmVkJztcbiAgICBjb25zdCBzc0xlZnRUZXh0ID0gJ1NTOiA1XFwnJztcbiAgICBjb25zdCBhc0xlZnRUZXh0ID0gJ0FTOiAzXFwnJztcbiAgICBjb25zdCBzc1JpZ2h0VGV4dCA9ICczXFwnJztcbiAgICBjb25zdCBhc1JpZ2h0VGV4dCA9ICc1XFwnJztcbiAgICBjb25zdCBzc1JpZ2h0T3ZlcmhhbmdzID0gY291bnRPdmVyaGFuZ3NPblRoZVJpZ2h0RWRnZShzc0Jhc2VzKTtcbiAgICBjb25zdCBhc1JpZ2h0T3ZlcmhhbmdzID0gY291bnRPdmVyaGFuZ3NPblRoZVJpZ2h0RWRnZShhc0Jhc2VzKTtcbiAgICBjb25zdCByZXN1bHRpbmdOdW1iZXJPZk51Y2xlb3RpZGVzSW5TdHJhbmRzID0gTWF0aC5tYXgoc3NCYXNlcy5sZW5ndGggLSBzc1JpZ2h0T3ZlcmhhbmdzLCBhc0Jhc2VzLmxlbmd0aCAtIGFzUmlnaHRPdmVyaGFuZ3MpO1xuICAgIGNvbnN0IGJhc2VEaWFtZXRlciA9IDIgKiBiYXNlUmFkaXVzO1xuICAgIGNvbnN0IHdpZHRoT2ZCYXNlcyA9IGJhc2VEaWFtZXRlciAqIChyZXN1bHRpbmdOdW1iZXJPZk51Y2xlb3RpZGVzSW5TdHJhbmRzICsgTWF0aC5tYXgoc3NSaWdodE92ZXJoYW5ncywgYXNSaWdodE92ZXJoYW5ncykpO1xuICAgIGNvbnN0IHdpZHRoT2ZMZWZ0TW9kaWZpY2F0aW9uID0gTWF0aC5tYXgoZ2V0VGV4dFdpZHRoKHNzVGhyZWVNb2RpZmljYXRpb24sIGJhc2VGb250U2l6ZSksIGdldFRleHRXaWR0aChhc0ZpdmVNb2RpZmljYXRpb24sIGJhc2VGb250U2l6ZSkpO1xuICAgIGNvbnN0IHdpZHRoT2ZSaWdodE1vZGlmaWNhdGlvbiA9IE1hdGgubWF4KGdldFRleHRXaWR0aChzc0ZpdmVNb2RpZmljYXRpb24sIGJhc2VGb250U2l6ZSksIGdldFRleHRXaWR0aChhc1RocmVlTW9kaWZpY2F0aW9uLCBiYXNlRm9udFNpemUpKTtcbiAgICBjb25zdCB3aWR0aE9mTGVmdFRleHQgPSBNYXRoLm1heChnZXRUZXh0V2lkdGgoc3NMZWZ0VGV4dCwgYmFzZUZvbnRTaXplKSwgZ2V0VGV4dFdpZHRoKGFzTGVmdFRleHQsIGJhc2VGb250U2l6ZSkpO1xuICAgIGNvbnN0IHdpZHRoT2ZSaWdodFRleHQgPSBNYXRoLm1heChnZXRUZXh0V2lkdGgoc3NSaWdodFRleHQsIGJhc2VGb250U2l6ZSksIGdldFRleHRXaWR0aChhc1JpZ2h0VGV4dCwgYmFzZUZvbnRTaXplKSk7XG4gICAgY29uc3Qgd2lkdGggPSB3aWR0aE9mTGVmdFRleHQgKyB3aWR0aE9mTGVmdE1vZGlmaWNhdGlvbiArIHdpZHRoT2ZCYXNlcyArXG4gICAgICAgIHdpZHRoT2ZSaWdodE1vZGlmaWNhdGlvbiArIHdpZHRoT2ZSaWdodFRleHQgKyBiYXNlRGlhbWV0ZXI7XG4gICAgY29uc3QgaGVpZ2h0ID0gYXNFeGlzdHMgPyAxMSAqIGJhc2VSYWRpdXMgOiA5ICogYmFzZVJhZGl1cztcbiAgICBjb25zdCB4T2ZUaXRsZSA9IGJhc2VSYWRpdXM7IC8vIE1hdGgucm91bmQod2lkdGggLyA0KSxcbiAgICBjb25zdCB1bmlxdWVCYXNlcyA9IGFzRXhpc3RzID8gWy4uLm5ldyBTZXQoc3NCYXNlcy5jb25jYXQoYXNCYXNlcykpXSA6IFsuLi5uZXcgU2V0KHNzQmFzZXMpXTtcbiAgICBjb25zdCBpc1B0b0V4aXN0ID0gYXNFeGlzdHMgPyBbLi4ubmV3IFNldChzc1B0b1N0YXR1c2VzLmNvbmNhdChhc1B0b1N0YXR1c2VzKSldLmluY2x1ZGVzKHRydWUpIDpcbiAgICAgICAgWy4uLm5ldyBTZXQoc3NQdG9TdGF0dXNlcyldLmluY2x1ZGVzKHRydWUpO1xuICAgIGNvbnN0IHN0YXJ0RnJvbSA9IGlzUHRvRXhpc3QgPyAxIDogMDtcbiAgICBjb25zdCB4T2ZMZWZ0VGV4dHMgPSAwO1xuICAgIGNvbnN0IHhPZkxlZnRNb2RpZmljYXRpb25zID0geE9mTGVmdFRleHRzICsgd2lkdGhPZkxlZnRUZXh0IC0gNTtcbiAgICBjb25zdCB4T2ZTc1JpZ2h0TW9kaWZpY2F0aW9ucyA9IHNzUmlnaHRPdmVyaGFuZ3MgKiBiYXNlRGlhbWV0ZXIgKyBnZXRYT2ZCYXNlQ2lyY2xlcygtMC41LCAwKTtcbiAgICBjb25zdCB4T2ZBc1JpZ2h0TW9kaWZpY2F0aW9ucyA9IGFzUmlnaHRPdmVyaGFuZ3MgKiBiYXNlRGlhbWV0ZXIgKyBnZXRYT2ZCYXNlQ2lyY2xlcygtMC41LCAwKTtcbiAgICBjb25zdCB4T2ZSaWdodFRleHRzID0gTWF0aC5tYXgoeE9mU3NSaWdodE1vZGlmaWNhdGlvbnMsIHhPZkFzUmlnaHRNb2RpZmljYXRpb25zKSArXG4gICAgICAgIHdpZHRoT2ZMZWZ0TW9kaWZpY2F0aW9uICsgYmFzZURpYW1ldGVyICogKE1hdGgubWF4KHNzUmlnaHRPdmVyaGFuZ3MsIGFzUmlnaHRPdmVyaGFuZ3MpKTtcbiAgICBjb25zdCB5T2ZUaXRsZSA9IGJhc2VSYWRpdXM7XG4gICAgY29uc3QgeU9mU3NUZXh0cyA9IDQgKiBiYXNlUmFkaXVzO1xuICAgIGNvbnN0IHlPZkFzVGV4dHMgPSA3ICogYmFzZVJhZGl1cztcbiAgICBjb25zdCB5T2ZDb21tZW50ID0gYXNFeGlzdHMgPyAxMSAqIGJhc2VSYWRpdXMgOiA4LjUgKiBiYXNlUmFkaXVzO1xuICAgIGNvbnN0IHlPZlNzQ2lyY2xlcyA9IDMuNSAqIGJhc2VSYWRpdXM7XG4gICAgY29uc3QgeU9mQXNDaXJjbGVzID0gNi41ICogYmFzZVJhZGl1cztcbiAgICBjb25zdCB5T2ZDaXJjbGVzSW5MZWdlbmRzID0gYXNFeGlzdHMgPyA5ICogYmFzZVJhZGl1cyA6IDYgKiBiYXNlUmFkaXVzO1xuICAgIGNvbnN0IHlPZlRleHRMZWdlbmQgPSBhc0V4aXN0cyA/IDkuNSAqIGJhc2VSYWRpdXMgLSAzIDogeU9mQXNDaXJjbGVzIC0gMztcbiAgICBjb25zdCBpbWFnZSA9IHN2Zy5yZW5kZXIod2lkdGgsIGhlaWdodCk7XG4gICAgaW1hZ2UuYXBwZW5kKHN2Zy50ZXh0KHNzTGVmdFRleHQsIHhPZkxlZnRUZXh0cywgeU9mU3NUZXh0cywgYmFzZUZvbnRTaXplLCBmb250Q29sb3IpLCBhc0V4aXN0cyA/IHN2Zy50ZXh0KGFzTGVmdFRleHQsIHhPZkxlZnRUZXh0cywgeU9mQXNUZXh0cywgYmFzZUZvbnRTaXplLCBmb250Q29sb3IpIDogJycsIHN2Zy50ZXh0KHNzUmlnaHRUZXh0LCB4T2ZSaWdodFRleHRzLCB5T2ZTc1RleHRzLCBiYXNlRm9udFNpemUsIGZvbnRDb2xvciksIGFzRXhpc3RzID8gc3ZnLnRleHQoYXNSaWdodFRleHQsIHhPZlJpZ2h0VGV4dHMsIHlPZkFzVGV4dHMsIGJhc2VGb250U2l6ZSwgZm9udENvbG9yKSA6ICcnLCBzdmcudGV4dChzc0ZpdmVNb2RpZmljYXRpb24sIHhPZkxlZnRNb2RpZmljYXRpb25zLCB5T2ZTc1RleHRzLCBiYXNlRm9udFNpemUsIG1vZGlmaWNhdGlvbnNDb2xvciksIGFzRXhpc3RzID8gc3ZnLnRleHQoYXNUaHJlZU1vZGlmaWNhdGlvbiwgeE9mTGVmdE1vZGlmaWNhdGlvbnMsIHlPZkFzVGV4dHMsIGJhc2VGb250U2l6ZSwgbW9kaWZpY2F0aW9uc0NvbG9yKSA6ICcnLCBzdmcudGV4dChzc1RocmVlTW9kaWZpY2F0aW9uLCB4T2ZTc1JpZ2h0TW9kaWZpY2F0aW9ucywgeU9mU3NUZXh0cywgYmFzZUZvbnRTaXplLCBtb2RpZmljYXRpb25zQ29sb3IpLCBhc0V4aXN0cyA/IHN2Zy50ZXh0KGFzRml2ZU1vZGlmaWNhdGlvbiwgeE9mQXNSaWdodE1vZGlmaWNhdGlvbnMsIHlPZkFzVGV4dHMsIGJhc2VGb250U2l6ZSwgbW9kaWZpY2F0aW9uc0NvbG9yKSA6ICcnLCBzdmcudGV4dChjb21tZW50LCB4T2ZMZWZ0VGV4dHMsIHlPZkNvbW1lbnQsIGxlZ2VuZEZvbnRTaXplLCBmb250Q29sb3IpLCBpc1B0b0V4aXN0ID8gc3ZnLnN0YXIoYmFzZVJhZGl1cywgeU9mQ2lyY2xlc0luTGVnZW5kcywgcHNMaW5rYWdlQ29sb3IpIDogJycsIGlzUHRvRXhpc3QgPyBzdmcudGV4dCgncHMgbGlua2FnZScsIDIgKiBiYXNlUmFkaXVzIC0gOCwgeU9mVGV4dExlZ2VuZCwgbGVnZW5kRm9udFNpemUsIGZvbnRDb2xvcikgOiAnJyk7XG4gICAgbGV0IG51bWJlck9mU3NOdWNsZW90aWRlcyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzc0Jhc2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChzc0Jhc2VzW2ldLnNsaWNlKC0zKSAhPSAnKG8pJylcbiAgICAgICAgICAgIG51bWJlck9mU3NOdWNsZW90aWRlcysrO1xuICAgIH1cbiAgICBsZXQgbnVjbGVvdGlkZUNvdW50ZXIgPSBudW1iZXJPZlNzTnVjbGVvdGlkZXM7XG4gICAgZm9yIChsZXQgaSA9IHNzQmFzZXMubGVuZ3RoIC0gMTsgaSA+IC0xOyBpLS0pIHtcbiAgICAgICAgaWYgKHNzQmFzZXNbaV0uc2xpY2UoLTMpICE9ICcobyknKVxuICAgICAgICAgICAgbnVjbGVvdGlkZUNvdW50ZXItLTtcbiAgICAgICAgaW1hZ2UuYXBwZW5kKHN2Zy5jaXJjbGUoZ2V0WE9mQmFzZUNpcmNsZXMoaSwgc3NSaWdodE92ZXJoYW5ncyksIHlPZlNzQ2lyY2xlcywgYmFzZVJhZGl1cywgZ2V0QmFzZUNvbG9yKHNzQmFzZXNbaV0pKSwgc3ZnLnRleHQoZ2V0VGV4dEluc2lkZUNpcmNsZShzc0Jhc2VzLCBpLCBudWNsZW90aWRlQ291bnRlciwgbnVtYmVyT2ZTc051Y2xlb3RpZGVzLCBlbnVtZXJhdGVNb2RpZmljYXRpb25zKSwgZ2V0WE9mQmFzZUNpcmNsZXMoaSwgc3NSaWdodE92ZXJoYW5ncykgK1xuICAgICAgICAgICAgZ2V0U2hpZnRUb0FsaWduTnVtYmVySW5zaWRlQ2lyY2xlKHNzQmFzZXMsIHNzQmFzZXMubGVuZ3RoIC0gaSwgbnVtYmVyT2ZTc051Y2xlb3RpZGVzIC0gbnVjbGVvdGlkZUNvdW50ZXIpLCB5T2ZTc1RleHRzLCBiYXNlRm9udFNpemUsIGdldEZvbnRDb2xvclZpc2libGVPbkJhY2tncm91bmQoYXhvbGFic01hcFtzc0Jhc2VzW2ldXVsnY29sb3InXSkpLCBzc1B0b1N0YXR1c2VzW2ldID9cbiAgICAgICAgICAgIHN2Zy5zdGFyKGdldFhPZkJhc2VDaXJjbGVzKGksIHNzUmlnaHRPdmVyaGFuZ3MpICsgYmFzZVJhZGl1cywgeU9mU3NUZXh0cyArIHBzTGlua2FnZVJhZGl1cywgcHNMaW5rYWdlQ29sb3IpIDpcbiAgICAgICAgICAgICcnKTtcbiAgICB9XG4gICAgaW1hZ2UuYXBwZW5kKHNzUHRvU3RhdHVzZXNbc3NCYXNlcy5sZW5ndGhdID9cbiAgICAgICAgc3ZnLnN0YXIoZ2V0WE9mQmFzZUNpcmNsZXMoc3NCYXNlcy5sZW5ndGgsIHNzUmlnaHRPdmVyaGFuZ3MpICtcbiAgICAgICAgICAgIGJhc2VSYWRpdXMsIHlPZlNzVGV4dHMgKyBwc0xpbmthZ2VSYWRpdXMsIHBzTGlua2FnZUNvbG9yKSA6ICcnKTtcbiAgICBsZXQgbnVtYmVyT2ZBc051Y2xlb3RpZGVzID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFzQmFzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGFzQmFzZXNbaV0uc2xpY2UoLTMpICE9ICcobyknKVxuICAgICAgICAgICAgbnVtYmVyT2ZBc051Y2xlb3RpZGVzKys7XG4gICAgfVxuICAgIGlmIChhc0V4aXN0cykge1xuICAgICAgICBsZXQgbnVjbGVvdGlkZUNvdW50ZXIgPSBudW1iZXJPZkFzTnVjbGVvdGlkZXM7XG4gICAgICAgIGZvciAobGV0IGkgPSBhc0Jhc2VzLmxlbmd0aCAtIDE7IGkgPiAtMTsgaS0tKSB7XG4gICAgICAgICAgICBpZiAoYXNCYXNlc1tpXS5zbGljZSgtMykgIT0gJyhvKScpXG4gICAgICAgICAgICAgICAgbnVjbGVvdGlkZUNvdW50ZXItLTtcbiAgICAgICAgICAgIGltYWdlLmFwcGVuZChzdmcuY2lyY2xlKGdldFhPZkJhc2VDaXJjbGVzKGksIGFzUmlnaHRPdmVyaGFuZ3MpLCB5T2ZBc0NpcmNsZXMsIGJhc2VSYWRpdXMsIGdldEJhc2VDb2xvcihhc0Jhc2VzW2ldKSksIHN2Zy50ZXh0KGdldFRleHRJbnNpZGVDaXJjbGUoYXNCYXNlcywgaSwgbnVtYmVyT2ZBc051Y2xlb3RpZGVzIC0gbnVjbGVvdGlkZUNvdW50ZXIgLSAxLCBudW1iZXJPZkFzTnVjbGVvdGlkZXMsIGVudW1lcmF0ZU1vZGlmaWNhdGlvbnMpLCBnZXRYT2ZCYXNlQ2lyY2xlcyhpLCBhc1JpZ2h0T3ZlcmhhbmdzKSArXG4gICAgICAgICAgICAgICAgZ2V0U2hpZnRUb0FsaWduTnVtYmVySW5zaWRlQ2lyY2xlKGFzQmFzZXMsIGksIG51Y2xlb3RpZGVDb3VudGVyICsgMSksIHlPZkFzVGV4dHMsIGJhc2VGb250U2l6ZSwgZ2V0Rm9udENvbG9yVmlzaWJsZU9uQmFja2dyb3VuZChheG9sYWJzTWFwW2FzQmFzZXNbaV1dWydjb2xvciddKSksIGFzUHRvU3RhdHVzZXNbaV0gPyBzdmcuc3RhcihnZXRYT2ZCYXNlQ2lyY2xlcyhpLCBhc1JpZ2h0T3ZlcmhhbmdzKSArXG4gICAgICAgICAgICAgICAgYmFzZVJhZGl1cywgeU9mQXNUZXh0cyArIHBzTGlua2FnZVJhZGl1cywgcHNMaW5rYWdlQ29sb3IpIDogJycpO1xuICAgICAgICB9XG4gICAgICAgIGltYWdlLmFwcGVuZChhc1B0b1N0YXR1c2VzW2FzQmFzZXMubGVuZ3RoXSA/XG4gICAgICAgICAgICBzdmcuc3RhcihnZXRYT2ZCYXNlQ2lyY2xlcyhhc0Jhc2VzLmxlbmd0aCwgYXNSaWdodE92ZXJoYW5ncykgK1xuICAgICAgICAgICAgICAgIGJhc2VSYWRpdXMsIHlPZkFzVGV4dHMgKyBwc0xpbmthZ2VSYWRpdXMsIHBzTGlua2FnZUNvbG9yKSA6ICcnKTtcbiAgICB9XG4gICAgY29uc3QgdGl0bGUgPSBwYXR0ZXJuTmFtZSArICcgZm9yICcgK1xuICAgICAgICBTdHJpbmcobnVtYmVyT2ZTc051Y2xlb3RpZGVzKSArIChhc0V4aXN0cyA/ICcvJyArIFN0cmluZyhudW1iZXJPZkFzTnVjbGVvdGlkZXMpIDogJycpICsgJ21lcic7XG4gICAgaW1hZ2UuYXBwZW5kKHN2Zy50ZXh0KHRpdGxlLCB4T2ZUaXRsZSwgeU9mVGl0bGUsIGJhc2VGb250U2l6ZSwgdGl0bGVGb250Q29sb3IpKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVuaXF1ZUJhc2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGltYWdlLmFwcGVuZChzdmcuY2lyY2xlKGdldEVxdWlkaXN0YW50WEZvckxlZ2VuZChpKSwgeU9mQ2lyY2xlc0luTGVnZW5kcywgbGVnZW5kUmFkaXVzLCBnZXRCYXNlQ29sb3IodW5pcXVlQmFzZXNbaV0pKSwgc3ZnLnRleHQodW5pcXVlQmFzZXNbaV0sIGdldEVxdWlkaXN0YW50WEZvckxlZ2VuZChpKSArXG4gICAgICAgICAgICBsZWdlbmRSYWRpdXMgKyA0LCB5T2ZUZXh0TGVnZW5kLCBsZWdlbmRGb250U2l6ZSwgZm9udENvbG9yKSk7XG4gICAgfVxuICAgIHJldHVybiBpbWFnZTtcbn1cbiIsImV4cG9ydCBjb25zdCBTQUxUU19DU1YgPSBgRElTUExBWSxNT0xXRUlHSFRcbm5vIERhdGEgQWRkZWQsMTAwYDtcbiIsImV4cG9ydCBjb25zdCBTT1VSQ0VTID0gYERJU1BMQVlcbk5PIERBVEFcbmA7XG4iLCIvL25hbWU6IGFzb0dhcG1lcnNOdWNsZW90aWRlc1RvQmlvU3ByaW5nXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEROQSBudWNsZW90aWRlc31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBCaW9TcHJpbmcgLyBHYXBtZXJzfVxuZXhwb3J0IGZ1bmN0aW9uIGFzb0dhcG1lcnNOdWNsZW90aWRlc1RvQmlvU3ByaW5nKG51Y2xlb3RpZGVzKSB7XG4gICAgbGV0IGNvdW50ID0gLTE7XG4gICAgY29uc3Qgb2JqRm9yRWRnZXMgPSB7XG4gICAgICAgICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsICdUJzogJzUqJywgJ0EnOiAnNionLCAnQyc6ICc3KicsICdHJzogJzgqJ1xuICAgIH07XG4gICAgY29uc3Qgb2JqRm9yQ2VudGVyID0ge1xuICAgICAgICAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLCAnVCc6ICdUKicsICdBJzogJ0EqJywgJ0MnOiAnOSonLCAnRyc6ICdHKidcbiAgICB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxBfFR8Q3xHKS9nLCBmdW5jdGlvbiAoeCkge1xuICAgICAgICBjb3VudCsrO1xuICAgICAgICByZXR1cm4gKGNvdW50ID4gNCAmJiBjb3VudCA8IDE1KSA/IG9iakZvckNlbnRlclt4XSA6IG9iakZvckVkZ2VzW3hdO1xuICAgIH0pLnNsaWNlKDAsIChudWNsZW90aWRlcy5lbmRzV2l0aCgnKGludmFiYXNpYyknKSB8fCBudWNsZW90aWRlcy5lbmRzV2l0aCgnKEdhbE5BYy0yLUpOSiknKSkgP1xuICAgICAgICBudWNsZW90aWRlcy5sZW5ndGggOiAyICogY291bnQgKyAxKTtcbn1cbi8vbmFtZTogYXNvR2FwbWVyc051Y2xlb3RpZGVzVG9HY3JzXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEROQSBudWNsZW90aWRlc31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBHQ1JTIC8gR2FwbWVyc31cbmV4cG9ydCBmdW5jdGlvbiBhc29HYXBtZXJzTnVjbGVvdGlkZXNUb0djcnMobnVjbGVvdGlkZXMpIHtcbiAgICBsZXQgY291bnQgPSAtMTtcbiAgICBjb25zdCBvYmpGb3JFZGdlcyA9IHtcbiAgICAgICAgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJywgJ1QnOiAnbW9lVW5wcycsXG4gICAgICAgICdBJzogJ21vZUFucHMnLCAnQyc6ICdtb2U1bUNucHMnLCAnRyc6ICdtb2VHbnBzJ1xuICAgIH07XG4gICAgY29uc3Qgb2JqRm9yQ2VudGVyID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnQyc6ICc1bUNwcycsICdBJzogJ0FwcycsICdUJzogJ1RwcycsICdHJzogJ0dwcycgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8QXxUfEN8RykvZywgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgY291bnQrKztcbiAgICAgICAgaWYgKGNvdW50IDwgNSlcbiAgICAgICAgICAgIHJldHVybiAoY291bnQgPT0gNCkgPyBvYmpGb3JFZGdlc1t4XS5zbGljZSgwLCAtMykgKyAncHMnIDogb2JqRm9yRWRnZXNbeF07XG4gICAgICAgIGlmIChjb3VudCA8IDE1KVxuICAgICAgICAgICAgcmV0dXJuIChjb3VudCA9PSAxNCkgPyBvYmpGb3JDZW50ZXJbeF0uc2xpY2UoMCwgLTIpICsgJ25wcycgOiBvYmpGb3JDZW50ZXJbeF07XG4gICAgICAgIHJldHVybiBvYmpGb3JFZGdlc1t4XTtcbiAgICB9KS5zbGljZSgwLCAobnVjbGVvdGlkZXMuZW5kc1dpdGgoJyhpbnZhYmFzaWMpJykgfHwgbnVjbGVvdGlkZXMuZW5kc1dpdGgoJyhHYWxOQWMtMi1KTkopJykpID9cbiAgICAgICAgbnVjbGVvdGlkZXMubGVuZ3RoIDogLTMpO1xufVxuLy9uYW1lOiBhc29HYXBtZXJzQmlvU3ByaW5nVG9OdWNsZW90aWRlc1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBCaW9TcHJpbmcgLyBHYXBtZXJzfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEROQSBudWNsZW90aWRlc31cbmV4cG9ydCBmdW5jdGlvbiBhc29HYXBtZXJzQmlvU3ByaW5nVG9OdWNsZW90aWRlcyhudWNsZW90aWRlcykge1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJyonOiAnJywgJzUnOiAnVCcsICc2JzogJ0EnLCAnNyc6ICdDJywgJzgnOiAnRycsICc5JzogJ0MnIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfFxcKnw1fDZ8N3w4fDkpL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuLy9uYW1lOiBhc29HYXBtZXJzQmlvU3ByaW5nVG9HY3JzXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEJpb1NwcmluZyAvIEdhcG1lcnN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogR0NSUyAvIEdhcG1lcnN9XG5leHBvcnQgZnVuY3Rpb24gYXNvR2FwbWVyc0Jpb1NwcmluZ1RvR2NycyhudWNsZW90aWRlcykge1xuICAgIGxldCBjb3VudCA9IC0xO1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJzUqJzogJ21vZVVucHMnLCAnNionOiAnbW9lQW5wcycsICc3Kic6ICdtb2U1bUNucHMnLCAnOConOiAnbW9lR25wcycsICc5Kic6ICc1bUNwcycsICdBKic6ICdBcHMnLCAnVConOiAnVHBzJyxcbiAgICAgICAgJ0cqJzogJ0dwcycsICdDKic6ICdDcHMnLCAnNSc6ICdtb2VVJywgJzYnOiAnbW9lQScsICc3JzogJ21vZTVtQycsICc4JzogJ21vZUcnLFxuICAgIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfDVcXCp8NlxcKnw3XFwqfDhcXCp8OVxcKnxBXFwqfFRcXCp8R1xcKnxDXFwqfDV8Nnw3fDgpL2csIGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIHJldHVybiAoY291bnQgPT0gNCkgPyBvYmpbeF0uc2xpY2UoMCwgLTMpICsgJ3BzJyA6IChjb3VudCA9PSAxNCkgPyBvYmpbeF0uc2xpY2UoMCwgLTIpICsgJ25wcycgOiBvYmpbeF07XG4gICAgfSk7XG59XG4vL25hbWU6IGFzb0dhcG1lcnNHY3JzVG9CaW9TcHJpbmdcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogR0NSUyAvIEdhcG1lcnN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogQmlvU3ByaW5nIC8gR2FwbWVyc31cbmV4cG9ydCBmdW5jdGlvbiBhc29HYXBtZXJzR2Nyc1RvQmlvU3ByaW5nKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnbW9lVCc6ICc1JywgJ21vZUEnOiAnNicsICdtb2U1bUMnOiAnNycsICdtb2VHJzogJzgnLCAnbW9lVSc6ICc1JywgJzVtQyc6ICc5JywgJ25wcyc6ICcqJywgJ3BzJzogJyonLCAnVSc6ICdUJyxcbiAgICB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxtb2VUfG1vZUF8bW9lNW1DfG1vZUd8bW9lVXw1bUN8bnBzfHBzfFUpL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuLy9uYW1lOiBhc29HYXBtZXJzR2Nyc1RvTnVjbGVvdGlkZXNcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogR0NSUyAvIEdhcG1lcnN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogRE5BIG51Y2xlb3RpZGVzfVxuZXhwb3J0IGZ1bmN0aW9uIGFzb0dhcG1lcnNHY3JzVG9OdWNsZW90aWRlcyhudWNsZW90aWRlcykge1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ21vZSc6ICcnLCAnNW0nOiAnJywgJ24nOiAnJywgJ3BzJzogJycsICdVJzogJ1QnIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfG1vZXw1bXxufHBzfFUpL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuLy9uYW1lOiBzaVJuYUJpb1NwcmluZ1RvTnVjbGVvdGlkZXNcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogQmlvU3ByaW5nIC8gc2lSTkF9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogUk5BIG51Y2xlb3RpZGVzfVxuZXhwb3J0IGZ1bmN0aW9uIHNpUm5hQmlvU3ByaW5nVG9OdWNsZW90aWRlcyhudWNsZW90aWRlcykge1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJzEnOiAnVScsICcyJzogJ0EnLCAnMyc6ICdDJywgJzQnOiAnRycsICc1JzogJ1UnLCAnNic6ICdBJywgJzcnOiAnQycsICc4JzogJ0cnLCAnKic6ICcnIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfDF8MnwzfDR8NXw2fDd8OHxcXCopL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuLy9uYW1lOiBzaVJuYUJpb1NwcmluZ1RvQXhvbGFic1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBCaW9TcHJpbmcgLyBzaVJOQX1cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBBeG9sYWJzIC8gc2lSTkF9XG5leHBvcnQgZnVuY3Rpb24gc2lSbmFCaW9TcHJpbmdUb0F4b2xhYnMobnVjbGVvdGlkZXMpIHtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICcxJzogJ1VmJywgJzInOiAnQWYnLCAnMyc6ICdDZicsICc0JzogJ0dmJywgJzUnOiAndScsICc2JzogJ2EnLCAnNyc6ICdjJywgJzgnOiAnZycsICcqJzogJ3MnIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfDF8MnwzfDR8NXw2fDd8OHxcXCopL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuLy9uYW1lOiBzaVJuYUJpb1NwcmluZ1RvR2Nyc1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBCaW9TcHJpbmcgLyBzaVJOQX1cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBHQ1JTfVxuZXhwb3J0IGZ1bmN0aW9uIHNpUm5hQmlvU3ByaW5nVG9HY3JzKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnMSc6ICdmVScsICcyJzogJ2ZBJywgJzMnOiAnZkMnLCAnNCc6ICdmRycsICc1JzogJ21VJywgJzYnOiAnbUEnLCAnNyc6ICdtQycsICc4JzogJ21HJywgJyonOiAncHMnIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfDF8MnwzfDR8NXw2fDd8OHxcXCopL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuLy9uYW1lOiBzaVJuYUF4b2xhYnNUb0djcnNcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogQXhvbGFicyAvIHNpUk5BfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEdDUlN9XG5leHBvcnQgZnVuY3Rpb24gc2lSbmFBeG9sYWJzVG9HY3JzKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnVWYnOiAnZlUnLCAnQWYnOiAnZkEnLCAnQ2YnOiAnZkMnLCAnR2YnOiAnZkcnLCAndSc6ICdtVScsICdhJzogJ21BJywgJ2MnOiAnbUMnLCAnZyc6ICdtRycsICdzJzogJ3BzJyxcbiAgICB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxVZnxBZnxDZnxHZnx1fGF8Y3xnfHMpL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuLy9uYW1lOiBzaVJuYUF4b2xhYnNUb0Jpb1NwcmluZ1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBBeG9sYWJzIC8gc2lSTkF9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogQmlvU3ByaW5nIC8gc2lSTkF9XG5leHBvcnQgZnVuY3Rpb24gc2lSbmFBeG9sYWJzVG9CaW9TcHJpbmcobnVjbGVvdGlkZXMpIHtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdVZic6ICcxJywgJ0FmJzogJzInLCAnQ2YnOiAnMycsICdHZic6ICc0JywgJ3UnOiAnNScsICdhJzogJzYnLCAnYyc6ICc3JywgJ2cnOiAnOCcsICdzJzogJyonLFxuICAgIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfFVmfEFmfENmfEdmfHV8YXxjfGd8cykvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IHNpUm5hQXhvbGFic1RvTnVjbGVvdGlkZXNcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogQXhvbGFicyAvIHNpUk5BfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IFJOQSBudWNsZW90aWRlc31cbmV4cG9ydCBmdW5jdGlvbiBzaVJuYUF4b2xhYnNUb051Y2xlb3RpZGVzKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnVWYnOiAnVScsICdBZic6ICdBJywgJ0NmJzogJ0MnLCAnR2YnOiAnRycsICd1JzogJ1UnLCAnYSc6ICdBJywgJ2MnOiAnQycsICdnJzogJ0cnLCAncyc6ICcnLFxuICAgIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfFVmfEFmfENmfEdmfHV8YXxjfGd8cykvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IHNpUm5hR2Nyc1RvTnVjbGVvdGlkZXNcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogR0NSU31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBSTkEgbnVjbGVvdGlkZXN9XG5leHBvcnQgZnVuY3Rpb24gc2lSbmFHY3JzVG9OdWNsZW90aWRlcyhudWNsZW90aWRlcykge1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ2ZVJzogJ1UnLCAnZkEnOiAnQScsICdmQyc6ICdDJywgJ2ZHJzogJ0cnLCAnbVUnOiAnVScsICdtQSc6ICdBJywgJ21DJzogJ0MnLCAnbUcnOiAnRycsICdwcyc6ICcnLFxuICAgIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfGZVfGZBfGZDfGZHfG1VfG1BfG1DfG1HfHBzKS9nLCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gb2JqW3hdOyB9KTtcbn1cbi8vbmFtZTogc2lSbmFHY3JzVG9CaW9TcHJpbmdcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogR0NSU31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBCaW9TcHJpbmcgLyBzaVJOQX1cbmV4cG9ydCBmdW5jdGlvbiBzaVJuYUdjcnNUb0Jpb1NwcmluZyhudWNsZW90aWRlcykge1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ2ZVJzogJzEnLCAnZkEnOiAnMicsICdmQyc6ICczJywgJ2ZHJzogJzQnLCAnbVUnOiAnNScsICdtQSc6ICc2JywgJ21DJzogJzcnLCAnbUcnOiAnOCcsICdwcyc6ICcqJyxcbiAgICB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxmVXxmQXxmQ3xmR3xtVXxtQXxtQ3xtR3xwcykvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IHNpUm5hR2Nyc1RvQXhvbGFic1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBHQ1JTfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEF4b2xhYnMgLyBzaVJOQX1cbmV4cG9ydCBmdW5jdGlvbiBzaVJuYUdjcnNUb0F4b2xhYnMobnVjbGVvdGlkZXMpIHtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdmVSc6ICdVZicsICdmQSc6ICdBZicsICdmQyc6ICdDZicsICdmRyc6ICdHZicsICdtVSc6ICd1JywgJ21BJzogJ2EnLCAnbUMnOiAnYycsICdtRyc6ICdnJywgJ3BzJzogJ3MnLFxuICAgIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfGZVfGZBfGZDfGZHfG1VfG1BfG1DfG1HfHBzKS9nLCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gb2JqW3hdOyB9KTtcbn1cbi8vbmFtZTogc2lSbmFOdWNsZW90aWRlVG9CaW9TcHJpbmdTZW5zZVN0cmFuZFxuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBSTkEgbnVjbGVvdGlkZXN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogQmlvU3ByaW5nIC8gc2lSTkF9XG5leHBvcnQgZnVuY3Rpb24gc2lSbmFOdWNsZW90aWRlVG9CaW9TcHJpbmdTZW5zZVN0cmFuZChudWNsZW90aWRlcykge1xuICAgIGxldCBjb3VudCA9IC0xO1xuICAgIGNvbnN0IG9iakZvckxlZnRFZGdlID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnQSc6ICc2KicsICdVJzogJzUqJywgJ0cnOiAnOConLCAnQyc6ICc3KicgfTtcbiAgICBjb25zdCBvYmpGb3JSaWdodEVkZ2UgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdBJzogJyo2JywgJ1UnOiAnKjUnLCAnRyc6ICcqOCcsICdDJzogJyo3JyB9O1xuICAgIGNvbnN0IG9iakZvck9kZEluZGljZXMgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdBJzogJzYnLCAnVSc6ICc1JywgJ0cnOiAnOCcsICdDJzogJzcnIH07XG4gICAgY29uc3Qgb2JqRm9yRXZlbkluZGljZXMgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsXG4gICAgICAgICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsICdBJzogJzInLCAnVSc6ICcxJywgJ0cnOiAnNCcsICdDJzogJzMnIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfEF8VXxHfEMpL2csIGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIGlmIChjb3VudCA8IDIpXG4gICAgICAgICAgICByZXR1cm4gb2JqRm9yTGVmdEVkZ2VbeF07XG4gICAgICAgIGlmIChjb3VudCA+IG51Y2xlb3RpZGVzLmxlbmd0aCAtIDMpXG4gICAgICAgICAgICByZXR1cm4gb2JqRm9yUmlnaHRFZGdlW3hdO1xuICAgICAgICByZXR1cm4gKGNvdW50ICUgMiA9PSAwKSA/IG9iakZvckV2ZW5JbmRpY2VzW3hdIDogb2JqRm9yT2RkSW5kaWNlc1t4XTtcbiAgICB9KTtcbn1cbi8vbmFtZTogc2lSbmFOdWNsZW90aWRlc1RvR2Nyc1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBSTkEgbnVjbGVvdGlkZXN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogR0NSU31cbmV4cG9ydCBmdW5jdGlvbiBzaVJuYU51Y2xlb3RpZGVzVG9HY3JzKG51Y2xlb3RpZGVzKSB7XG4gICAgbGV0IGNvdW50ID0gLTE7XG4gICAgY29uc3Qgb2JqRm9yTGVmdEVkZ2UgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdBJzogJ21BcHMnLCAnVSc6ICdtVXBzJywgJ0cnOiAnbUdwcycsICdDJzogJ21DcHMnIH07XG4gICAgY29uc3Qgb2JqRm9yUmlnaHRFZGdlID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnQSc6ICdwc21BJywgJ1UnOiAncHNtVScsICdHJzogJ3BzbUcnLCAnQyc6ICdwc21DJyB9O1xuICAgIGNvbnN0IG9iakZvckV2ZW5JbmRpY2VzID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLFxuICAgICAgICAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLCAnQSc6ICdmQScsICdVJzogJ2ZVJywgJ0cnOiAnZkcnLCAnQyc6ICdmQycgfTtcbiAgICBjb25zdCBvYmpGb3JPZGRJbmRpY2VzID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLFxuICAgICAgICAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLCAnQSc6ICdtQScsICdVJzogJ21VJywgJ0cnOiAnbUcnLCAnQyc6ICdtQycgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8QXxVfEd8QykvZywgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgY291bnQrKztcbiAgICAgICAgaWYgKGNvdW50IDwgMilcbiAgICAgICAgICAgIHJldHVybiBvYmpGb3JMZWZ0RWRnZVt4XTtcbiAgICAgICAgaWYgKGNvdW50ID4gbnVjbGVvdGlkZXMubGVuZ3RoIC0gMylcbiAgICAgICAgICAgIHJldHVybiBvYmpGb3JSaWdodEVkZ2VbeF07XG4gICAgICAgIHJldHVybiAoY291bnQgJSAyID09IDApID8gb2JqRm9yRXZlbkluZGljZXNbeF0gOiBvYmpGb3JPZGRJbmRpY2VzW3hdO1xuICAgIH0pO1xufVxuLy9uYW1lOiBzaVJuYU51Y2xlb3RpZGVUb0F4b2xhYnNTZW5zZVN0cmFuZFxuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBSTkEgbnVjbGVvdGlkZXN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogQXhvbGFic31cbmV4cG9ydCBmdW5jdGlvbiBzaVJuYU51Y2xlb3RpZGVUb0F4b2xhYnNTZW5zZVN0cmFuZChudWNsZW90aWRlcykge1xuICAgIGxldCBjb3VudCA9IC0xO1xuICAgIGNvbnN0IG9iakZvckxlZnRFZGdlID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnQSc6ICdhcycsICdVJzogJ3VzJywgJ0cnOiAnZ3MnLCAnQyc6ICdjcycgfTtcbiAgICBjb25zdCBvYmpGb3JTb21lSW5kaWNlcyA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJyxcbiAgICAgICAgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJywgJ0EnOiAnQWYnLCAnVSc6ICdVZicsICdHJzogJ0dmJywgJ0MnOiAnQ2YnIH07XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnQSc6ICdhJywgJ1UnOiAndScsICdHJzogJ2cnLCAnQyc6ICdjJyB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxBfFV8R3xDKS9nLCBmdW5jdGlvbiAoeCkge1xuICAgICAgICBjb3VudCsrO1xuICAgICAgICBpZiAoY291bnQgPCAyKVxuICAgICAgICAgICAgcmV0dXJuIG9iakZvckxlZnRFZGdlW3hdO1xuICAgICAgICBpZiAoY291bnQgPT0gNiB8fCAoY291bnQgPiA3ICYmIGNvdW50IDwgMTEpKVxuICAgICAgICAgICAgcmV0dXJuIG9iakZvclNvbWVJbmRpY2VzW3hdO1xuICAgICAgICBpZiAoY291bnQgPT0gbnVjbGVvdGlkZXMubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgIHJldHVybiAnYSc7XG4gICAgICAgIHJldHVybiBvYmpbeF07XG4gICAgfSk7XG59XG4vL25hbWU6IHNpUm5hTnVjbGVvdGlkZVRvQXhvbGFic0FudGlzZW5zZVN0cmFuZFxuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBSTkEgbnVjbGVvdGlkZXN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogQXhvbGFic31cbmV4cG9ydCBmdW5jdGlvbiBzaVJuYU51Y2xlb3RpZGVUb0F4b2xhYnNBbnRpc2Vuc2VTdHJhbmQobnVjbGVvdGlkZXMpIHtcbiAgICBsZXQgY291bnQgPSAtMTtcbiAgICBjb25zdCBvYmpGb3JTbWFsbExpbmthZ2VzID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLFxuICAgICAgICAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLCAnQSc6ICdhcycsICdVJzogJ3VzJywgJ0cnOiAnZ3MnLCAnQyc6ICdjcycgfTtcbiAgICBjb25zdCBvYmpGb3JCaWdMaW5rYWdlcyA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJyxcbiAgICAgICAgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJywgJ0EnOiAnQWZzJywgJ1UnOiAnVWZzJywgJ0cnOiAnR2ZzJywgJ0MnOiAnQ2ZzJyB9O1xuICAgIGNvbnN0IG9iakZvclNvbWVJbmRpY2VzID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLFxuICAgICAgICAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLCAnQSc6ICdBZicsICdVJzogJ1VmJywgJ0cnOiAnR2YnLCAnQyc6ICdDZicgfTtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsXG4gICAgICAgICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsICdBJzogJ2EnLCAnVSc6ICd1JywgJ0cnOiAnZycsICdDJzogJ2MnIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfEF8VXxHfEMpL2csIGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIGlmIChjb3VudCA+IDE5ICYmIGNvdW50IDwgMjIpXG4gICAgICAgICAgICByZXR1cm4gb2JqRm9yU21hbGxMaW5rYWdlc1t4XTtcbiAgICAgICAgaWYgKGNvdW50ID09IDApXG4gICAgICAgICAgICByZXR1cm4gJ3VzJztcbiAgICAgICAgaWYgKGNvdW50ID09IDEpXG4gICAgICAgICAgICByZXR1cm4gb2JqRm9yQmlnTGlua2FnZXNbeF07XG4gICAgICAgIHJldHVybiAoY291bnQgPT0gNSB8fCBjb3VudCA9PSA3IHx8IGNvdW50ID09IDggfHwgY291bnQgPT0gMTMgfHwgY291bnQgPT0gMTUpID8gb2JqRm9yU29tZUluZGljZXNbeF0gOiBvYmpbeF07XG4gICAgfSk7XG59XG4vL25hbWU6IGdjcnNUb051Y2xlb3RpZGVzXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEdDUlN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogUk5BIG51Y2xlb3RpZGVzfVxuZXhwb3J0IGZ1bmN0aW9uIGdjcnNUb051Y2xlb3RpZGVzKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnbUFwcyc6ICdBJywgJ21VcHMnOiAnVScsICdtR3BzJzogJ0cnLCAnbUNwcyc6ICdDJywgJ2ZBcHMnOiAnQScsICdmVXBzJzogJ1UnLCAnZkdwcyc6ICdHJywgJ2ZDcHMnOiAnQycsXG4gICAgICAgICdmVSc6ICdVJywgJ2ZBJzogJ0EnLCAnZkMnOiAnQycsICdmRyc6ICdHJywgJ21VJzogJ1UnLCAnbUEnOiAnQScsICdtQyc6ICdDJywgJ21HJzogJ0cnLFxuICAgIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfG1BcHN8bVVwc3xtR3BzfG1DcHN8ZkFwc3xmVXBzfGZHcHN8ZkNwc3xmVXxmQXxmQ3xmR3xtVXxtQXxtQ3xtRykvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IGdjcnNUb01lcm1hZGUxMlxuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBHQ1JTfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IE1lcm1hZGUgMTIgLyBzaVJOQX1cbmV4cG9ydCBmdW5jdGlvbiBnY3JzVG9NZXJtYWRlMTIobnVjbGVvdGlkZXMpIHtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdtQXBzJzogJ2UnLCAnbVVwcyc6ICdoJywgJ21HcHMnOiAnZycsICdtQ3BzJzogJ2YnLCAnZkFwcyc6ICdpJywgJ2ZVcHMnOiAnbCcsICdmR3BzJzogJ2snLCAnZkNwcyc6ICdqJywgJ2ZVJzogJ0wnLFxuICAgICAgICAnZkEnOiAnSScsICdmQyc6ICdKJywgJ2ZHJzogJ0snLCAnbVUnOiAnSCcsICdtQSc6ICdFJywgJ21DJzogJ0YnLCAnbUcnOiAnRycsXG4gICAgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8bUFwc3xtVXBzfG1HcHN8bUNwc3xmQXBzfGZVcHN8Zkdwc3xmQ3BzfGZVfGZBfGZDfGZHfG1VfG1BfG1DfG1HKS9nLCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gb2JqW3hdOyB9KTtcbn1cbiIsImltcG9ydCB7IG1hcCwgc3RhZGFyZFBob3NwaGF0ZUxpbmtTbWlsZXMsIFNZTlRIRVNJWkVSUywgVEVDSE5PTE9HSUVTLCBNT0RJRklDQVRJT05TIH0gZnJvbSAnLi9tYXAnO1xuaW1wb3J0IHsgaXNWYWxpZFNlcXVlbmNlIH0gZnJvbSAnLi9zZXF1ZW5jZS1jb2Rlcy10b29scyc7XG5pbXBvcnQgeyBnZXROdWNsZW90aWRlc01vbCB9IGZyb20gJy4vbW9sLXRyYW5zZm9ybWF0aW9ucyc7XG5leHBvcnQgZnVuY3Rpb24gc2VxdWVuY2VUb01vbFYzMDAwKHNlcXVlbmNlLCBpbnZlcnRlZCA9IGZhbHNlLCBvY2xSZW5kZXIgPSBmYWxzZSkge1xuICAgIGNvbnN0IG9iaiA9IGdldE9iamVjdFdpdGhDb2Rlc0FuZFNtaWxlcyhzZXF1ZW5jZSk7XG4gICAgbGV0IGNvZGVzID0gc29ydEJ5U3RyaW5nTGVuZ3RoSW5EZXNjZW5kaW5nT3JkZXIoT2JqZWN0LmtleXMob2JqKSk7XG4gICAgbGV0IGkgPSAwO1xuICAgIGNvbnN0IHNtaWxlc0NvZGVzID0gW107XG4gICAgY29uc3QgY29kZXNMaXN0ID0gW107XG4gICAgY29uc3QgbGlua3MgPSBbJ3MnLCAncHMnLCAnKiddO1xuICAgIGNvbnN0IGluY2x1ZGVzU3RhbmRhcmRMaW5rQWxyZWFkeSA9IFsnZScsICdoJywgLyonZycsKi8gJ2YnLCAnaScsICdsJywgJ2snLCAnaiddO1xuICAgIGNvbnN0IGRyb3Bkb3ducyA9IE9iamVjdC5rZXlzKE1PRElGSUNBVElPTlMpO1xuICAgIGNvZGVzID0gY29kZXMuY29uY2F0KGRyb3Bkb3ducyk7XG4gICAgd2hpbGUgKGkgPCBzZXF1ZW5jZS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY29kZSA9IGNvZGVzLmZpbmQoKHMpID0+IHMgPT0gc2VxdWVuY2Uuc2xpY2UoaSwgaSArIHMubGVuZ3RoKSk7XG4gICAgICAgIGkgKz0gY29kZS5sZW5ndGg7XG4gICAgICAgIGludmVydGVkID8gY29kZXNMaXN0LnVuc2hpZnQoY29kZSkgOiBjb2Rlc0xpc3QucHVzaChjb2RlKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2Rlc0xpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGRyb3Bkb3ducy5pbmNsdWRlcyhjb2Rlc0xpc3RbaV0pKSB7XG4gICAgICAgICAgICBzbWlsZXNDb2Rlcy5wdXNoKChpID49IGNvZGVzTGlzdC5sZW5ndGggLyAyKSA/XG4gICAgICAgICAgICAgICAgTU9ESUZJQ0FUSU9OU1tjb2Rlc0xpc3RbaV1dLnJpZ2h0IDogTU9ESUZJQ0FUSU9OU1tjb2Rlc0xpc3RbaV1dLmxlZnQpO1xuICAgICAgICAgICAgc21pbGVzQ29kZXMucHVzaChzdGFkYXJkUGhvc3BoYXRlTGlua1NtaWxlcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAobGlua3MuaW5jbHVkZXMoY29kZXNMaXN0W2ldKSB8fFxuICAgICAgICAgICAgICAgIGluY2x1ZGVzU3RhbmRhcmRMaW5rQWxyZWFkeS5pbmNsdWRlcyhjb2Rlc0xpc3RbaV0pIHx8XG4gICAgICAgICAgICAgICAgKGkgPCBjb2Rlc0xpc3QubGVuZ3RoIC0gMSAmJiBsaW5rcy5pbmNsdWRlcyhjb2Rlc0xpc3RbaSArIDFdKSkpXG4gICAgICAgICAgICAgICAgc21pbGVzQ29kZXMucHVzaChvYmpbY29kZXNMaXN0W2ldXSk7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzbWlsZXNDb2Rlcy5wdXNoKG9ialtjb2Rlc0xpc3RbaV1dKTtcbiAgICAgICAgICAgICAgICBzbWlsZXNDb2Rlcy5wdXNoKHN0YWRhcmRQaG9zcGhhdGVMaW5rU21pbGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2V0TnVjbGVvdGlkZXNNb2woc21pbGVzQ29kZXMsIG9jbFJlbmRlcik7XG59XG5leHBvcnQgZnVuY3Rpb24gc2VxdWVuY2VUb1NtaWxlcyhzZXF1ZW5jZSwgaW52ZXJ0ZWQgPSBmYWxzZSkge1xuICAgIGNvbnN0IG9iaiA9IGdldE9iamVjdFdpdGhDb2Rlc0FuZFNtaWxlcyhzZXF1ZW5jZSk7XG4gICAgbGV0IGNvZGVzID0gc29ydEJ5U3RyaW5nTGVuZ3RoSW5EZXNjZW5kaW5nT3JkZXIoT2JqZWN0LmtleXMob2JqKSk7XG4gICAgbGV0IGkgPSAwO1xuICAgIGxldCBzbWlsZXMgPSAnJztcbiAgICBjb25zdCBjb2Rlc0xpc3QgPSBbXTtcbiAgICBjb25zdCBsaW5rcyA9IFsncycsICdwcycsICcqJ107XG4gICAgY29uc3QgaW5jbHVkZXNTdGFuZGFyZExpbmtBbHJlYWR5ID0gWydlJywgJ2gnLCAvKidnJywqLyAnZicsICdpJywgJ2wnLCAnaycsICdqJ107XG4gICAgY29uc3QgZHJvcGRvd25zID0gT2JqZWN0LmtleXMoTU9ESUZJQ0FUSU9OUyk7XG4gICAgY29kZXMgPSBjb2Rlcy5jb25jYXQoZHJvcGRvd25zKTtcbiAgICB3aGlsZSAoaSA8IHNlcXVlbmNlLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBjb2RlID0gY29kZXMuZmluZCgocykgPT4gcyA9PSBzZXF1ZW5jZS5zbGljZShpLCBpICsgcy5sZW5ndGgpKTtcbiAgICAgICAgaSArPSBjb2RlLmxlbmd0aDtcbiAgICAgICAgaW52ZXJ0ZWQgPyBjb2Rlc0xpc3QudW5zaGlmdChjb2RlKSA6IGNvZGVzTGlzdC5wdXNoKGNvZGUpO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvZGVzTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoZHJvcGRvd25zLmluY2x1ZGVzKGNvZGVzTGlzdFtpXSkpIHtcbiAgICAgICAgICAgIHNtaWxlcyArPSAoaSA+PSBjb2Rlc0xpc3QubGVuZ3RoIC8gMikgP1xuICAgICAgICAgICAgICAgIE1PRElGSUNBVElPTlNbY29kZXNMaXN0W2ldXS5yaWdodCArIHN0YWRhcmRQaG9zcGhhdGVMaW5rU21pbGVzIDpcbiAgICAgICAgICAgICAgICBNT0RJRklDQVRJT05TW2NvZGVzTGlzdFtpXV0ubGVmdCArIHN0YWRhcmRQaG9zcGhhdGVMaW5rU21pbGVzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGxpbmtzLmluY2x1ZGVzKGNvZGVzTGlzdFtpXSkgfHxcbiAgICAgICAgICAgICAgICBpbmNsdWRlc1N0YW5kYXJkTGlua0FscmVhZHkuaW5jbHVkZXMoY29kZXNMaXN0W2ldKSB8fFxuICAgICAgICAgICAgICAgIChpIDwgY29kZXNMaXN0Lmxlbmd0aCAtIDEgJiYgbGlua3MuaW5jbHVkZXMoY29kZXNMaXN0W2kgKyAxXSkpKVxuICAgICAgICAgICAgICAgIHNtaWxlcyArPSBvYmpbY29kZXNMaXN0W2ldXTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBzbWlsZXMgKz0gb2JqW2NvZGVzTGlzdFtpXV0gKyBzdGFkYXJkUGhvc3BoYXRlTGlua1NtaWxlcztcbiAgICAgICAgfVxuICAgIH1cbiAgICBzbWlsZXMgPSBzbWlsZXMucmVwbGFjZSgvT08vZywgJ08nKTtcbiAgICByZXR1cm4gKChsaW5rcy5pbmNsdWRlcyhjb2Rlc0xpc3RbY29kZXNMaXN0Lmxlbmd0aCAtIDFdKSAmJlxuICAgICAgICBjb2Rlc0xpc3QubGVuZ3RoID4gMSAmJlxuICAgICAgICAhaW5jbHVkZXNTdGFuZGFyZExpbmtBbHJlYWR5LmluY2x1ZGVzKGNvZGVzTGlzdFtjb2Rlc0xpc3QubGVuZ3RoIC0gMl0pKSB8fFxuICAgICAgICBkcm9wZG93bnMuaW5jbHVkZXMoY29kZXNMaXN0W2NvZGVzTGlzdC5sZW5ndGggLSAxXSkgfHxcbiAgICAgICAgaW5jbHVkZXNTdGFuZGFyZExpbmtBbHJlYWR5LmluY2x1ZGVzKGNvZGVzTGlzdFtjb2Rlc0xpc3QubGVuZ3RoIC0gMV0pKSA/XG4gICAgICAgIHNtaWxlcyA6XG4gICAgICAgIHNtaWxlcy5zbGljZSgwLCBzbWlsZXMubGVuZ3RoIC0gc3RhZGFyZFBob3NwaGF0ZUxpbmtTbWlsZXMubGVuZ3RoICsgMSk7XG59XG5mdW5jdGlvbiBnZXRPYmplY3RXaXRoQ29kZXNBbmRTbWlsZXMoc2VxdWVuY2UpIHtcbiAgICBjb25zdCBvYmogPSB7fTtcbiAgICBmb3IgKGNvbnN0IHN5bnRoZXNpemVyIG9mIE9iamVjdC5rZXlzKG1hcCkpIHtcbiAgICAgICAgZm9yIChjb25zdCB0ZWNobm9sb2d5IG9mIE9iamVjdC5rZXlzKG1hcFtzeW50aGVzaXplcl0pKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvZGUgb2YgT2JqZWN0LmtleXMobWFwW3N5bnRoZXNpemVyXVt0ZWNobm9sb2d5XSkpXG4gICAgICAgICAgICAgICAgb2JqW2NvZGVdID0gbWFwW3N5bnRoZXNpemVyXVt0ZWNobm9sb2d5XVtjb2RlXS5TTUlMRVM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVE9ETzogY3JlYXRlIG9iamVjdCBiYXNlZCBmcm9tIHN5bnRoZXNpemVyIHR5cGUgdG8gYXZvaWQga2V5KGNvZGVzKSBkdXBsaWNhdGVzXG4gICAgY29uc3Qgb3V0cHV0ID0gaXNWYWxpZFNlcXVlbmNlKHNlcXVlbmNlKTtcbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyID09IFNZTlRIRVNJWkVSUy5NRVJNQURFXzEyKVxuICAgICAgICBvYmpbJ2cnXSA9IG1hcFtTWU5USEVTSVpFUlMuTUVSTUFERV8xMl1bVEVDSE5PTE9HSUVTLlNJX1JOQV1bJ2cnXS5TTUlMRVM7XG4gICAgZWxzZSBpZiAob3V0cHV0LnN5bnRoZXNpemVyID09IFNZTlRIRVNJWkVSUy5BWE9MQUJTKVxuICAgICAgICBvYmpbJ2cnXSA9IG1hcFtTWU5USEVTSVpFUlMuQVhPTEFCU11bVEVDSE5PTE9HSUVTLlNJX1JOQV1bJ2cnXS5TTUlMRVM7XG4gICAgcmV0dXJuIG9iajtcbn1cbmZ1bmN0aW9uIHNvcnRCeVN0cmluZ0xlbmd0aEluRGVzY2VuZGluZ09yZGVyKGFycmF5KSB7XG4gICAgcmV0dXJuIGFycmF5LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGIubGVuZ3RoIC0gYS5sZW5ndGg7IH0pO1xufVxuIiwiZXhwb3J0IGNvbnN0IFNZTlRIRVNJWkVSUyA9IHtcbiAgICBSQVdfTlVDTEVPVElERVM6ICdSYXcgTnVjbGVvdGlkZXMnLFxuICAgIEJJT1NQUklORzogJ0Jpb1NwcmluZyBDb2RlcycsXG4gICAgR0NSUzogJ0phbnNzZW4gR0NSUyBDb2RlcycsXG4gICAgQVhPTEFCUzogJ0F4b2xhYnMgQ29kZXMnLFxuICAgIE1FUk1BREVfMTI6ICdNZXJtYWRlIDEyJyxcbn07XG5leHBvcnQgY29uc3QgVEVDSE5PTE9HSUVTID0ge1xuICAgIEROQTogJ0ROQScsXG4gICAgUk5BOiAnUk5BJyxcbiAgICBBU09fR0FQTUVSUzogJ0ZvciBBU08gR2FwbWVycycsXG4gICAgU0lfUk5BOiAnRm9yIDJcXCctT01lIGFuZCAyXFwnLUYgbW9kaWZpZWQgc2lSTkEnLFxufTtcbmV4cG9ydCBjb25zdCBDT0xfTkFNRVMgPSB7XG4gICAgQ0hFTUlTVFJZOiAnQ2hlbWlzdHJ5JyxcbiAgICBOVU1CRVI6ICdOdW1iZXInLFxuICAgIFRZUEU6ICdUeXBlJyxcbiAgICBDSEVNSVNUUllfTkFNRTogJ0NoZW1pc3RyeSBOYW1lJyxcbiAgICBJTlRFUk5BTF9DT01QT1VORF9JRDogJ0ludGVybmFsIGNvbXBvdW5kIElEJyxcbiAgICBJRFA6ICdJRFAnLFxuICAgIFNFUVVFTkNFOiAnU2VxdWVuY2UnLFxuICAgIENPTVBPVU5EX05BTUU6ICdDb21wb3VuZCBOYW1lJyxcbiAgICBDT01QT1VORF9DT01NRU5UUzogJ0NvbXBvdW5kIENvbW1lbnRzJyxcbiAgICBTQUxUOiAnU2FsdCcsXG4gICAgRVFVSVZBTEVOVFM6ICdFcXVpdmFsZW50cycsXG4gICAgUFVSSVRZOiAnUHVyaXR5JyxcbiAgICBDUERfTVc6ICdDcGQgTVcnLFxuICAgIFNBTFRfTUFTUzogJ1NhbHQgbWFzcycsXG4gICAgQkFUQ0hfTVc6ICdCYXRjaCBNVycsXG4gICAgU09VUkNFOiAnU291cmNlJyxcbiAgICBJQ0Q6ICdJQ0QnLFxuICAgIE9XTkVSOiAnT3duZXInLFxufTtcbi8vIGludGVyZmFjZSBDT0RFUyB7XG4vLyB9XG5leHBvcnQgY29uc3QgTU9ESUZJQ0FUSU9OUyA9IHtcbiAgICAnKGludmFiYXNpYyknOiB7XG4gICAgICAgIG1vbGVjdWxhcldlaWdodDogMTE4LjEzLFxuICAgICAgICBsZWZ0OiAnT1tDQEBIXTFDW0NAQEhdT1tDQEhdMUNPJyxcbiAgICAgICAgcmlnaHQ6ICdPW0NAQEhdMUNbQ0BASF1PW0NASF0xQ08nLFxuICAgIH0sXG4gICAgJyhHYWxOQWMtMi1KTkopJzoge1xuICAgICAgICBtb2xlY3VsYXJXZWlnaHQ6IDEyNzMuMyxcbiAgICAgICAgbGVmdDogJ0MoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQyknICtcbiAgICAgICAgICAgICcoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQyknICtcbiAgICAgICAgICAgICcoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQylOQyg9TylDQ0NDKD1PKU5DQyhPKUNPJyxcbiAgICAgICAgcmlnaHQ6ICdPQ0MoTylDTkMoPU8pQ0NDQyg9TylOQyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKScgK1xuICAgICAgICAgICAgJyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKScgK1xuICAgICAgICAgICAgJyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKScsXG4gICAgfSxcbn07XG5leHBvcnQgY29uc3Qgc3RhZGFyZFBob3NwaGF0ZUxpbmtTbWlsZXMgPSAnT1AoPU8pKE8pTyc7XG5leHBvcnQgY29uc3QgbWFwID0ge1xuICAgICdSYXcgTnVjbGVvdGlkZXMnOiB7XG4gICAgICAgICdETkEnOiB7XG4gICAgICAgICAgICAnQSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdBZGVuaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzEzLjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdUJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ1R5cm9zaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzA0LjIsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZFQnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyg9TylOQzIoPU8pKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0cnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnR3VhbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyOS4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnQyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdDeXRvc2luZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDI4OS4xOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgICdSTkEnOiB7XG4gICAgICAgICAgICAnQSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdBZGVuaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzEzLjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdVJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ1VyYWNpbCcsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNi4xNyxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyVScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oTylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0cnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnR3VhbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyOS4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnQyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdDeXRvc2luZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDI4OS4xOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICAnQmlvU3ByaW5nIENvZGVzJzoge1xuICAgICAgICAnRm9yIEFTTyBHYXBtZXJzJzoge1xuICAgICAgICAgICAgJzUnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ01PRS01TWUtclUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNzguMjcsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyg9TylOQzIoPU8pKVtDQEhdKE9DQ09DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnNic6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnTU9FLXJBJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzg3LjI5LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQ0NPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzcnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ01PRS01TWUtckMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNzcuMjksXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyhOKT1OQzIoPU8pKVtDQEhdKE9DQ09DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnOCc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnTU9FLXJHJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogNDAzLjI4LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQ0NPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzknOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnNS1NZXRoeWwtZEMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDMuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyhOKT1OQzIoPU8pKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyonOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAncHMgbGlua2FnZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDE2LjA3LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPUCg9TykoUylPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnQSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdBZGVuaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzEzLjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdDJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ0N5dG9zaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMjg5LjE4LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdHJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ0d1YW5pbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMjkuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ1QnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnVHlyb3NpbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDQuMixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkVCcsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUMoQylDKD1PKU5DMig9TykpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgICdGb3IgMlxcJy1PTWUgYW5kIDJcXCctRiBtb2RpZmllZCBzaVJOQSc6IHtcbiAgICAgICAgICAgICcxJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLVUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDguMTYsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcyJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUEnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMzEuMixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzMnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNy4xOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzQnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tRycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0Ny4xOSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzUnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yVScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyMC4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzYnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0My4yNCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICc3Jzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtckMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMTkuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnOCc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJHJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzU5LjI0LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyonOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAncHMgbGlua2FnZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDE2LjA3LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPUCg9TykoUylPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICAnQXhvbGFicyBDb2Rlcyc6IHtcbiAgICAgICAgJ0ZvciAyXFwnLU9NZSBhbmQgMlxcJy1GIG1vZGlmaWVkIHNpUk5BJzoge1xuICAgICAgICAgICAgJ1VmJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLVUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDguMTYsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdBZic6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnLWZsdW9yby1BJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzMxLjIsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckEnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdDZic6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnLWZsdW9yby1DJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzA3LjE4LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnR2YnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tRycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0Ny4xOSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ3UnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yVScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyMC4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2EnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0My4yNCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdjJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtckMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMTkuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJHJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzU5LixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdzJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ3BzIGxpbmthZ2UnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAxNi4wNyxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT1AoPU8pKFMpTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgJ0phbnNzZW4gR0NSUyBDb2Rlcyc6IHtcbiAgICAgICAgJ0ZvciBBU08gR2FwbWVycyc6IHtcbiAgICAgICAgICAgICdtb2VUJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdNT0UtNU1lLXJVJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzc4LjI3LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9QyhDKUMoPU8pTkMyKD1PKSlbQ0BIXShPQ0NPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ21vZUEnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ01PRS1yQScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM4Ny4yOSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0NDT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdtb2U1bUMnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ01PRS01TWUtckMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNzcuMjksXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyhOKT1OQzIoPU8pKVtDQEhdKE9DQ09DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnKDVtKW1vZUMnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ01PRS01TWUtckMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNzcuMjksXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyhOKT1OQzIoPU8pKVtDQEhdKE9DQ09DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnbW9lRyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnTU9FLXJHJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogNDAzLjI4LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQ0NPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzVtQyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICc1LU1ldGh5bC1kQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwMy4yOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUMoQylDKE4pPU5DMig9TykpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnKDVtKUMnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnNS1NZXRoeWwtZEMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDMuMjgsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyhOKT1OQzIoPU8pKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ3BzJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ3BzIGxpbmthZ2UnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAxNi4wNyxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT1AoPU8pKFMpTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0EnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnQWRlbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMxMy4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZEEnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnQWRlbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMxMy4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnQyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdDeXRvc2luZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDI4OS4xOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZEMnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnQ3l0b3NpbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAyODkuMTgsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0cnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnR3VhbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyOS4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZEcnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnR3VhbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyOS4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnVCc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdUeXJvc2luZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNC4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RUJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9QyhDKUMoPU8pTkMyKD1PKSlDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdkVCc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdUeXJvc2luZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNC4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RUJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9QyhDKUMoPU8pTkMyKD1PKSlDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdyQSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdBZGVuaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzI5LjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnckMnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnQ3l0b3NpbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDUuMTgsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE8pW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdyRyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdHdWFuaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzQ1LjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnclUnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnVXJhY2lsJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzA2LjE3LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgICdGb3IgMlxcJy1PTWUgYW5kIDJcXCctRiBtb2RpZmllZCBzaVJOQSc6IHtcbiAgICAgICAgICAgICdmVSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnLWZsdW9yby1VJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzA4LjE2LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZkEnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tQScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMzMS4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShGKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZkMnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNy4xOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2ZHJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUcnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNDcuMTksXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdtVSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJVJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzIwLjIsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnbUEnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0My4yNCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdtQyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJDJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzE5LjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ21HJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtckcnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNTkuMjQsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICAnTWVybWFkZSAxMic6IHtcbiAgICAgICAgJ0ZvciAyXFwnLU9NZSBhbmQgMlxcJy1GIG1vZGlmaWVkIHNpUk5BJzoge1xuICAgICAgICAgICAgJ2UnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQS1wcycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM1OS4zMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdoJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtclUtcHMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMzYuMjcsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoUylPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJHLXBzJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzc1LjMxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKFMpTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2YnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQy1wcycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMzNS4yOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdpJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUEtcHMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNDcuMjcsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckEnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdsJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLVUtcHMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMjQuMjMsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdrJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUctcHMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNjMuMjYsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdqJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUMtcHMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMjMuMjUsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdMJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLVUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDguMTYsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdJJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUEnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMzEuMixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0onOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNy4xOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0snOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tRycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0Ny4xOSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0gnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yVScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyMC4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0UnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0My4yNCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdGJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtckMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMTkuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnRyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJHJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzU5LjI0LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuIiwiaW1wb3J0ICogYXMgT0NMIGZyb20gJ29wZW5jaGVtbGliL2Z1bGwuanMnO1xuY29uc3QgUEhPU0hBVEUgPSBgXG5EYXRhZ3JvayBtb25vbWVyIGxpYnJhcnkgTnVjbGVvdGlkZXNcblxuICAwICAwICAwICAwICAwICAwICAgICAgICAgICAgICAwIFYzMDAwXG5NICBWMzAgQkVHSU4gQ1RBQlxuTSAgVjMwIENPVU5UUyA1IDQgMCAwIDBcbk0gIFYzMCBCRUdJTiBBVE9NXG5NICBWMzAgMSBPIC0xLjUgMCAwIDBcbk0gIFYzMCAyIFAgMCAwIDAgMFxuTSAgVjMwIDMgTyAwIDEgMCAwXG5NICBWMzAgNCBPIDAgLTEgMCAwXG5NICBWMzAgNSBPIDEuNSAwIDAgMFxuTSAgVjMwIEVORCBBVE9NXG5NICBWMzAgQkVHSU4gQk9ORFxuTSAgVjMwIDEgMSAxIDJcbk0gIFYzMCAyIDIgMiAzXG5NICBWMzAgMyAxIDIgNFxuTSAgVjMwIDQgMSAyIDVcbk0gIFYzMCBFTkQgQk9ORFxuTSAgVjMwIEVORCBDVEFCXG5NICBWMzAgQkVHSU4gQ09MTEVDVElPTlxuTSAgVjMwIEVORCBDT0xMRUNUSU9OXG5NICBFTkRgO1xuY29uc3QgVEhJT1BIT1NIQVRFID0gYFxuRGF0YWdyb2sgbW9ub21lciBsaWJyYXJ5IE51Y2xlb3RpZGVzXG5cbiAgMCAgMCAgMCAgMCAgMCAgMCAgICAgICAgICAgICAgMCBWMzAwMFxuTSAgVjMwIEJFR0lOIENUQUJcbk0gIFYzMCBDT1VOVFMgNSA0IDAgMCAwXG5NICBWMzAgQkVHSU4gQVRPTVxuTSAgVjMwIDEgTyAtMS41IDAgMCAwXG5NICBWMzAgMiBQIDAgMCAwIDBcbk0gIFYzMCAzIE8gMCAxIDAgMFxuTSAgVjMwIDQgUyAwIC0xIDAgMFxuTSAgVjMwIDUgTyAxLjUgMCAwIDBcbk0gIFYzMCBFTkQgQVRPTVxuTSAgVjMwIEJFR0lOIEJPTkRcbk0gIFYzMCAxIDEgMSAyXG5NICBWMzAgMiAyIDIgM1xuTSAgVjMwIDMgMSAyIDRcbk0gIFYzMCA0IDEgMiA1XG5NICBWMzAgRU5EIEJPTkRcbk0gIFYzMCBFTkQgQ1RBQlxuTSAgVjMwIEJFR0lOIENPTExFQ1RJT05cbk0gIFYzMCBFTkQgQ09MTEVDVElPTlxuTSAgRU5EYDtcbmNvbnN0IElOVkFCQVNJQyA9IGBcbkRhdGFncm9rIG1vbm9tZXIgbGlicmFyeSBOdWNsZW90aWRlc1xuXG4gIDAgIDAgIDAgIDAgIDAgIDAgICAgICAgICAgICAgIDAgVjMwMDBcbk0gIFYzMCBCRUdJTiBDVEFCXG5NICBWMzAgQ09VTlRTIDggOCAwIDAgMFxuTSAgVjMwIEJFR0lOIEFUT01cbk0gIFYzMCAxIE8gMS4wOTM0IC0yLjE2MzYgMCAwXG5NICBWMzAgMiBDIDEuODM2NSAtMS40OTQ1IDAgMCBDRkc9MlxuTSAgVjMwIDMgQyAyLjgxNDcgLTEuNzAyNCAwIDBcbk0gIFYzMCA0IEMgMy4zMTQ3IC0wLjgzNjQgMCAwIFZBTD0zXG5NICBWMzAgNSBPIDIuNjQ1NSAtMC4wOTMyIDAgMFxuTSAgVjMwIDYgQyAxLjczMiAtMC41IDAgMCBDRkc9MVxuTSAgVjMwIDcgQyAwLjg2NiAwIDAgMFxuTSAgVjMwIDggTyAwLjg2NiAxIDAgMFxuTSAgVjMwIEVORCBBVE9NXG5NICBWMzAgQkVHSU4gQk9ORFxuTSAgVjMwIDEgMSAyIDEgQ0ZHPTFcbk0gIFYzMCAyIDEgMiAzXG5NICBWMzAgMyAxIDMgNFxuTSAgVjMwIDQgMSA0IDVcbk0gIFYzMCA1IDEgNiA1XG5NICBWMzAgNiAxIDIgNlxuTSAgVjMwIDcgMSA2IDcgQ0ZHPTNcbk0gIFYzMCA4IDEgNyA4XG5NICBWMzAgRU5EIEJPTkRcbk0gIFYzMCBCRUdJTiBDT0xMRUNUSU9OXG5NICBWMzAgTURMVjMwL1NURUFCUyBBVE9NUz0oMiAyIDYpXG5NICBWMzAgRU5EIENPTExFQ1RJT05cbk0gIFYzMCBFTkQgQ1RBQlxuTSAgRU5EYDtcbmV4cG9ydCBmdW5jdGlvbiBnZXROdWNsZW90aWRlc01vbChzbWlsZXNDb2Rlcywgb2NsUmVuZGVyID0gZmFsc2UpIHtcbiAgICBjb25zdCBtb2xCbG9ja3MgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNtaWxlc0NvZGVzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBzbWlsZXNDb2Rlc1tpXSA9PSAnT1AoPU8pKE8pTycgPyBtb2xCbG9ja3MucHVzaChQSE9TSEFURSkgOlxuICAgICAgICAgICAgc21pbGVzQ29kZXNbaV0gPT0gJ09QKD1PKShTKU8nID8gbW9sQmxvY2tzLnB1c2goVEhJT1BIT1NIQVRFKSA6XG4gICAgICAgICAgICAgICAgc21pbGVzQ29kZXNbaV0gPT0gJ09bQ0BASF0xQ1tDQEBIXU9bQ0BIXTFDTycgPyBtb2xCbG9ja3MucHVzaChyb3RhdGVOdWNsZW90aWRlc1YzMDAwKElOVkFCQVNJQykpIDpcbiAgICAgICAgICAgICAgICAgICAgbW9sQmxvY2tzLnB1c2gocm90YXRlTnVjbGVvdGlkZXNWMzAwMChzbWlsZXNDb2Rlc1tpXSkpO1xuICAgIH1cbiAgICByZXR1cm4gbGlua1YzMDAwKG1vbEJsb2NrcywgZmFsc2UsIG9jbFJlbmRlcik7XG59XG5leHBvcnQgZnVuY3Rpb24gbGlua1YzMDAwKG1vbEJsb2NrcywgdHdvTW9sZWN1bGVzID0gZmFsc2UsIG9jbFJlbmRlciA9IGZhbHNlKSB7XG4gICAgbGV0IG1hY3JvTW9sQmxvY2sgPSAnXFxuRGF0YWdyb2sgbWFjcm9tb2xlY3VsZSBoYW5kbGVyXFxuXFxuJztcbiAgICBtYWNyb01vbEJsb2NrICs9ICcgIDAgIDAgIDAgIDAgIDAgIDAgICAgICAgICAgICA5OTkgVjMwMDBcXG4nO1xuICAgIG1hY3JvTW9sQmxvY2sgKz0gJ00gIFYzMCBCRUdJTiBDVEFCXFxuJztcbiAgICBsZXQgYXRvbUJsb2NrID0gJyc7XG4gICAgbGV0IGJvbmRCbG9jayA9ICcnO1xuICAgIGxldCBjb2xsZWN0aW9uQmxvY2sgPSAnJztcbiAgICBjb25zdCBjb2xsZWN0aW9uID0gW107XG4gICAgbGV0IG5hdG9tID0gMDtcbiAgICBsZXQgbmJvbmQgPSAwO1xuICAgIGxldCBzZXF1ZW5jZVNoaWZ0ID0gMDtcbiAgICBsZXQgeFNoaWZ0ID0gMDtcbiAgICBpZiAodHdvTW9sZWN1bGVzICYmIG1vbEJsb2Nrcy5sZW5ndGggPiAxKVxuICAgICAgICBtb2xCbG9ja3NbMV0gPSBpbnZlcnROdWNsZW90aWRlc1YzMDAwKG1vbEJsb2Nrc1sxXSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtb2xCbG9ja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbW9sQmxvY2tzW2ldID0gbW9sQmxvY2tzW2ldLnJlcGxhY2VBbGwoJygtXFxuTSAgVjMwICcsICcoJylcbiAgICAgICAgICAgIC5yZXBsYWNlQWxsKCctXFxuTSAgVjMwICcsICcnKS5yZXBsYWNlQWxsKCcgKScsICcpJyk7XG4gICAgICAgIGNvbnN0IG51bWJlcnMgPSBleHRyYWN0QXRvbXNCb25kc051bWJlcnNWMzAwMChtb2xCbG9ja3NbaV0pO1xuICAgICAgICBjb25zdCBjb29yZGluYXRlcyA9IGV4dHJhY3RBdG9tRGF0YVYzMDAwKG1vbEJsb2Nrc1tpXSk7XG4gICAgICAgIGxldCBpbmRleEF0b21zID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ00gIFYzMCBCRUdJTiBBVE9NJyk7IC8vIFYzMDAwIGluZGV4IGZvciBhdG9tcyBjb29yZGluYXRlc1xuICAgICAgICBpbmRleEF0b21zID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ1xcbicsIGluZGV4QXRvbXMpO1xuICAgICAgICBsZXQgaW5kZXggPSBpbmRleEF0b21zO1xuICAgICAgICBsZXQgaW5kZXhFbmQgPSBpbmRleEF0b21zO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG51bWJlcnMubmF0b207IGorKykge1xuICAgICAgICAgICAgaWYgKGNvb3JkaW5hdGVzLmF0b21JbmRleFtqXSAhPSAxIHx8IGkgPT0gMCB8fCB0d29Nb2xlY3VsZXMpIHtcbiAgICAgICAgICAgICAgICAvL3Jld3JpdGUgYXRvbSBudW1iZXJcbiAgICAgICAgICAgICAgICBpbmRleCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdWMzAnLCBpbmRleCkgKyA0O1xuICAgICAgICAgICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYXRvbU51bWJlciA9IHBhcnNlSW50KG1vbEJsb2Nrc1tpXS5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSkgKyBuYXRvbTtcbiAgICAgICAgICAgICAgICBtb2xCbG9ja3NbaV0gPSBtb2xCbG9ja3NbaV0uc2xpY2UoMCwgaW5kZXgpICsgYXRvbU51bWJlciArIG1vbEJsb2Nrc1tpXS5zbGljZShpbmRleEVuZCk7XG4gICAgICAgICAgICAgICAgLy9yZXdyaXRlIGNvb3JkaW5hdGVzXG4gICAgICAgICAgICAgICAgaW5kZXggPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KSArIDE7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KSArIDE7XG4gICAgICAgICAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b3RhbFNoaWZ0ID0geFNoaWZ0IC0gY29vcmRpbmF0ZXMueFswXTtcbiAgICAgICAgICAgICAgICBsZXQgY29vcmRpbmF0ZSA9IE1hdGgucm91bmQoMTAwMDAgKiAocGFyc2VGbG9hdChtb2xCbG9ja3NbaV0uc3Vic3RyaW5nKGluZGV4LCBpbmRleEVuZCkpICsgdG90YWxTaGlmdCkpIC8gMTAwMDA7XG4gICAgICAgICAgICAgICAgbW9sQmxvY2tzW2ldID0gbW9sQmxvY2tzW2ldLnNsaWNlKDAsIGluZGV4KSArIGNvb3JkaW5hdGUgKyBtb2xCbG9ja3NbaV0uc2xpY2UoaW5kZXhFbmQpO1xuICAgICAgICAgICAgICAgIGluZGV4ID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCkgKyAxO1xuICAgICAgICAgICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgY29vcmRpbmF0ZSA9IE1hdGgucm91bmQoMTAwMDAgKiAocGFyc2VGbG9hdChtb2xCbG9ja3NbaV0uc3Vic3RyaW5nKGluZGV4LCBpbmRleEVuZCkpICsgc2VxdWVuY2VTaGlmdCkpIC8gMTAwMDA7XG4gICAgICAgICAgICAgICAgbW9sQmxvY2tzW2ldID0gbW9sQmxvY2tzW2ldLnNsaWNlKDAsIGluZGV4KSArIGNvb3JkaW5hdGUgKyBtb2xCbG9ja3NbaV0uc2xpY2UoaW5kZXhFbmQpO1xuICAgICAgICAgICAgICAgIGluZGV4ID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ1xcbicsIGluZGV4KSArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdNICBWMzAnLCBpbmRleCkgLSAxO1xuICAgICAgICAgICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ1xcbicsIGluZGV4ICsgMSk7XG4gICAgICAgICAgICAgICAgbW9sQmxvY2tzW2ldID0gbW9sQmxvY2tzW2ldLnNsaWNlKDAsIGluZGV4KSArIG1vbEJsb2Nrc1tpXS5zbGljZShpbmRleEVuZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5kZXhBdG9tc0VuZCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdNICBWMzAgRU5EIEFUT00nKTtcbiAgICAgICAgYXRvbUJsb2NrICs9IG1vbEJsb2Nrc1tpXS5zdWJzdHJpbmcoaW5kZXhBdG9tcyArIDEsIGluZGV4QXRvbXNFbmQpO1xuICAgICAgICBsZXQgaW5kZXhCb25kcyA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdNICBWMzAgQkVHSU4gQk9ORCcpOyAvLyBWMzAwMCBpbmRleCBmb3IgYm9uZHNcbiAgICAgICAgaW5kZXhCb25kcyA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdcXG4nLCBpbmRleEJvbmRzKTtcbiAgICAgICAgaW5kZXggPSBpbmRleEJvbmRzO1xuICAgICAgICBpbmRleEVuZCA9IGluZGV4Qm9uZHM7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbnVtYmVycy5uYm9uZDsgaisrKSB7XG4gICAgICAgICAgICAvL3Jld3JpdGUgYm9uZCBudW1iZXJcbiAgICAgICAgICAgIGluZGV4ID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ1YzMCcsIGluZGV4KSArIDQ7XG4gICAgICAgICAgICBpbmRleEVuZCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCcgJywgaW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgYm9uZE51bWJlciA9IHBhcnNlSW50KG1vbEJsb2Nrc1tpXS5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSkgKyBuYm9uZDtcbiAgICAgICAgICAgIG1vbEJsb2Nrc1tpXSA9IG1vbEJsb2Nrc1tpXS5zbGljZSgwLCBpbmRleCkgKyBib25kTnVtYmVyICsgbW9sQmxvY2tzW2ldLnNsaWNlKGluZGV4RW5kKTtcbiAgICAgICAgICAgIC8vcmV3cml0ZSBhdG9tIHBhaXIgaW4gYm9uZFxuICAgICAgICAgICAgaW5kZXggPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KSArIDE7XG4gICAgICAgICAgICBpbmRleCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCk7XG4gICAgICAgICAgICBsZXQgYXRvbU51bWJlciA9IHBhcnNlSW50KG1vbEJsb2Nrc1tpXS5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSkgKyBuYXRvbTtcbiAgICAgICAgICAgIG1vbEJsb2Nrc1tpXSA9IG1vbEJsb2Nrc1tpXS5zbGljZSgwLCBpbmRleCkgKyBhdG9tTnVtYmVyICsgbW9sQmxvY2tzW2ldLnNsaWNlKGluZGV4RW5kKTtcbiAgICAgICAgICAgIGluZGV4ID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCkgKyAxO1xuICAgICAgICAgICAgaW5kZXhFbmQgPSBNYXRoLm1pbihtb2xCbG9ja3NbaV0uaW5kZXhPZignXFxuJywgaW5kZXgpLCBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KSk7XG4gICAgICAgICAgICBhdG9tTnVtYmVyID0gcGFyc2VJbnQobW9sQmxvY2tzW2ldLnN1YnN0cmluZyhpbmRleCwgaW5kZXhFbmQpKSArIG5hdG9tO1xuICAgICAgICAgICAgbW9sQmxvY2tzW2ldID0gbW9sQmxvY2tzW2ldLnNsaWNlKDAsIGluZGV4KSArIGF0b21OdW1iZXIgKyBtb2xCbG9ja3NbaV0uc2xpY2UoaW5kZXhFbmQpO1xuICAgICAgICAgICAgaW5kZXggPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignXFxuJywgaW5kZXgpICsgMTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmRleEJvbmRFbmQgPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignTSAgVjMwIEVORCBCT05EJyk7XG4gICAgICAgIGJvbmRCbG9jayArPSBtb2xCbG9ja3NbaV0uc3Vic3RyaW5nKGluZGV4Qm9uZHMgKyAxLCBpbmRleEJvbmRFbmQpO1xuICAgICAgICBsZXQgaW5kZXhDb2xsZWN0aW9uID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ00gIFYzMCBNRExWMzAvU1RFQUJTIEFUT01TPSgnKTsgLy8gVjMwMDAgaW5kZXggZm9yIGNvbGxlY3Rpb25zXG4gICAgICAgIHdoaWxlIChpbmRleENvbGxlY3Rpb24gIT0gLTEpIHtcbiAgICAgICAgICAgIGluZGV4Q29sbGVjdGlvbiArPSAyODtcbiAgICAgICAgICAgIGNvbnN0IGNvbGxlY3Rpb25FbmQgPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignKScsIGluZGV4Q29sbGVjdGlvbik7XG4gICAgICAgICAgICBjb25zdCBjb2xsZWN0aW9uRW50cmllcyA9IG1vbEJsb2Nrc1tpXS5zdWJzdHJpbmcoaW5kZXhDb2xsZWN0aW9uLCBjb2xsZWN0aW9uRW5kKS5zcGxpdCgnICcpLnNsaWNlKDEpO1xuICAgICAgICAgICAgY29sbGVjdGlvbkVudHJpZXMuZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24ucHVzaChwYXJzZUludChlKSArIG5hdG9tKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaW5kZXhDb2xsZWN0aW9uID0gY29sbGVjdGlvbkVuZDtcbiAgICAgICAgICAgIGluZGV4Q29sbGVjdGlvbiA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdNICBWMzAgTURMVjMwL1NURUFCUyBBVE9NUz0oJywgaW5kZXhDb2xsZWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBuYXRvbSArPSB0d29Nb2xlY3VsZXMgPyBudW1iZXJzLm5hdG9tIDogbnVtYmVycy5uYXRvbSAtIDE7XG4gICAgICAgIG5ib25kICs9IG51bWJlcnMubmJvbmQ7XG4gICAgICAgIHhTaGlmdCArPSB0d29Nb2xlY3VsZXMgPyAwIDogY29vcmRpbmF0ZXMueFtudW1iZXJzLm5hdG9tIC0gMV0gLSBjb29yZGluYXRlcy54WzBdO1xuICAgICAgICBzZXF1ZW5jZVNoaWZ0ICs9IHR3b01vbGVjdWxlcyA/IC03IDogMDtcbiAgICB9XG4gICAgY29uc3QgZW50cmllcyA9IDQ7XG4gICAgY29uc3QgY29sbE51bWJlciA9IE1hdGguY2VpbChjb2xsZWN0aW9uLmxlbmd0aCAvIGVudHJpZXMpO1xuICAgIGlmIChvY2xSZW5kZXIpIHtcbiAgICAgICAgY29sbGVjdGlvbkJsb2NrICs9ICdNICBWMzAgTURMVjMwL1NURUFCUyBBVE9NUz0oJyArIGNvbGxlY3Rpb24ubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbGxlY3Rpb24ubGVuZ3RoOyBqKyspXG4gICAgICAgICAgICBjb2xsZWN0aW9uQmxvY2sgKz0gJyAnICsgY29sbGVjdGlvbltqXTtcbiAgICAgICAgY29sbGVjdGlvbkJsb2NrICs9ICcpXFxuJztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbGxlY3Rpb25CbG9jayArPSAnTSAgVjMwIE1ETFYzMC9TVEVBQlMgQVRPTVM9KCcgKyBjb2xsZWN0aW9uLmxlbmd0aCArICcgLVxcbic7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sbE51bWJlcjsgaSsrKSB7XG4gICAgICAgICAgICBjb2xsZWN0aW9uQmxvY2sgKz0gJ00gIFYzMCAnO1xuICAgICAgICAgICAgY29uc3QgZW50cmllc0N1cnJlbnQgPSBpICsgMSA9PSBjb2xsTnVtYmVyID8gY29sbGVjdGlvbi5sZW5ndGggLSAoY29sbE51bWJlciAtIDEpICogZW50cmllcyA6IGVudHJpZXM7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGVudHJpZXNDdXJyZW50OyBqKyspIHtcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uQmxvY2sgKz0gKGogKyAxID09IGVudHJpZXNDdXJyZW50KSA/XG4gICAgICAgICAgICAgICAgICAgIChpID09IGNvbGxOdW1iZXIgLSAxID8gY29sbGVjdGlvbltlbnRyaWVzICogaSArIGpdICsgJylcXG4nIDogY29sbGVjdGlvbltlbnRyaWVzICogaSArIGpdICsgJyAtXFxuJykgOlxuICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uW2VudHJpZXMgKiBpICsgal0gKyAnICc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy9nZW5lcmF0ZSBmaWxlXG4gICAgdHdvTW9sZWN1bGVzID8gbmF0b20gOiBuYXRvbSsrO1xuICAgIG1hY3JvTW9sQmxvY2sgKz0gJ00gIFYzMCBDT1VOVFMgJyArIG5hdG9tICsgJyAnICsgbmJvbmQgKyAnIDAgMCAwXFxuJztcbiAgICBtYWNyb01vbEJsb2NrICs9ICdNICBWMzAgQkVHSU4gQVRPTVxcbic7XG4gICAgbWFjcm9Nb2xCbG9jayArPSBhdG9tQmxvY2s7XG4gICAgbWFjcm9Nb2xCbG9jayArPSAnTSAgVjMwIEVORCBBVE9NXFxuJztcbiAgICBtYWNyb01vbEJsb2NrICs9ICdNICBWMzAgQkVHSU4gQk9ORFxcbic7XG4gICAgbWFjcm9Nb2xCbG9jayArPSBib25kQmxvY2s7XG4gICAgbWFjcm9Nb2xCbG9jayArPSAnTSAgVjMwIEVORCBCT05EXFxuJztcbiAgICBtYWNyb01vbEJsb2NrICs9ICdNICBWMzAgQkVHSU4gQ09MTEVDVElPTlxcbic7XG4gICAgbWFjcm9Nb2xCbG9jayArPSBjb2xsZWN0aW9uQmxvY2s7XG4gICAgbWFjcm9Nb2xCbG9jayArPSAnTSAgVjMwIEVORCBDT0xMRUNUSU9OXFxuJztcbiAgICBtYWNyb01vbEJsb2NrICs9ICdNICBWMzAgRU5EIENUQUJcXG4nO1xuICAgIG1hY3JvTW9sQmxvY2sgKz0gJ00gIEVORFxcbic7XG4gICAgcmV0dXJuIG1hY3JvTW9sQmxvY2s7XG59XG5mdW5jdGlvbiByb3RhdGVOdWNsZW90aWRlc1YzMDAwKG1vbGVjdWxlKSB7XG4gICAgbGV0IG1vbEJsb2NrID0gbW9sZWN1bGUuaW5jbHVkZXMoJ00gIEVORCcpID8gbW9sZWN1bGUgOiBPQ0wuTW9sZWN1bGUuZnJvbVNtaWxlcyhtb2xlY3VsZSkudG9Nb2xmaWxlVjMoKTtcbiAgICBjb25zdCBjb29yZGluYXRlcyA9IGV4dHJhY3RBdG9tRGF0YVYzMDAwKG1vbEJsb2NrKTtcbiAgICBjb25zdCBuYXRvbSA9IGNvb3JkaW5hdGVzLmF0b21JbmRleC5sZW5ndGg7XG4gICAgY29uc3QgaW5kZXhGaXZlUHJpbWUgPSBjb29yZGluYXRlcy5hdG9tSW5kZXguaW5kZXhPZigxKTtcbiAgICBjb25zdCBpbmRleFRocmVlUHJpbWUgPSBjb29yZGluYXRlcy5hdG9tSW5kZXguaW5kZXhPZihuYXRvbSk7XG4gICAgLy9maXggNSBwcmltZSBpZiBpbmFkZXF1YXRlXG4gICAgaWYgKG5hdG9tID4gOClcbiAgICAgICAgZml4NVByaW1lKGNvb3JkaW5hdGVzLCBpbmRleEZpdmVQcmltZSwgaW5kZXhUaHJlZVByaW1lKTtcbiAgICBjb25zdCB4Q2VudGVyID0gKGNvb3JkaW5hdGVzLnhbaW5kZXhUaHJlZVByaW1lXSArIGNvb3JkaW5hdGVzLnhbaW5kZXhGaXZlUHJpbWVdKSAvIDI7XG4gICAgY29uc3QgeUNlbnRlciA9IChjb29yZGluYXRlcy55W2luZGV4VGhyZWVQcmltZV0gKyBjb29yZGluYXRlcy55W2luZGV4Rml2ZVByaW1lXSkgLyAyO1xuICAgIC8vcGxhY2UgdG8gY2VudGVyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXRvbTsgaSsrKSB7XG4gICAgICAgIGNvb3JkaW5hdGVzLnhbaV0gLT0geENlbnRlcjtcbiAgICAgICAgY29vcmRpbmF0ZXMueVtpXSAtPSB5Q2VudGVyO1xuICAgIH1cbiAgICBsZXQgYW5nbGUgPSAwO1xuICAgIGlmIChjb29yZGluYXRlcy54W2luZGV4Rml2ZVByaW1lXSA9PSAwKVxuICAgICAgICBhbmdsZSA9IGNvb3JkaW5hdGVzLnlbaW5kZXhGaXZlUHJpbWVdID4gY29vcmRpbmF0ZXMueVtpbmRleFRocmVlUHJpbWVdID8gTWF0aC5QSSAvIDIgOiAzICogTWF0aC5QSSAvIDI7XG4gICAgZWxzZSBpZiAoY29vcmRpbmF0ZXMueVtpbmRleEZpdmVQcmltZV0gPT0gMClcbiAgICAgICAgYW5nbGUgPSBjb29yZGluYXRlcy54W2luZGV4Rml2ZVByaW1lXSA+IGNvb3JkaW5hdGVzLnhbaW5kZXhUaHJlZVByaW1lXSA/IE1hdGguUEkgOiAwO1xuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBkZXJpdmF0aXZlID0gY29vcmRpbmF0ZXMueVtpbmRleEZpdmVQcmltZV0gLyBjb29yZGluYXRlcy54W2luZGV4Rml2ZVByaW1lXTtcbiAgICAgICAgYW5nbGUgPSBkZXJpdmF0aXZlID4gMCA/IE1hdGguUEkgLSBNYXRoLmF0YW4oZGVyaXZhdGl2ZSkgOiBNYXRoLmF0YW4oZGVyaXZhdGl2ZSk7XG4gICAgfVxuICAgIGNvbnN0IGNvcyA9IE1hdGguY29zKGFuZ2xlKTtcbiAgICBjb25zdCBzaW4gPSBNYXRoLnNpbihhbmdsZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXRvbTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHhBZGQgPSBjb29yZGluYXRlcy54W2ldO1xuICAgICAgICBjb29yZGluYXRlcy54W2ldID0geEFkZCAqIGNvcyAtIGNvb3JkaW5hdGVzLnlbaV0gKiBzaW47XG4gICAgICAgIGNvb3JkaW5hdGVzLnlbaV0gPSB4QWRkICogc2luICsgY29vcmRpbmF0ZXMueVtpXSAqIGNvcztcbiAgICB9XG4gICAgLy9wbGFjZSB0byByaWdodFxuICAgIGNvbnN0IHhTaGlmdCA9IGNvb3JkaW5hdGVzLnhbaW5kZXhGaXZlUHJpbWVdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmF0b207IGkrKylcbiAgICAgICAgY29vcmRpbmF0ZXMueFtpXSAtPSB4U2hpZnQ7XG4gICAgLy9yZXdyaXRlIG1vbEJsb2NrXG4gICAgbGV0IGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignTSAgVjMwIEJFR0lOIEFUT00nKTsgLy8gVjMwMDAgaW5kZXggZm9yIGF0b21zIGNvb3JkaW5hdGVzXG4gICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdcXG4nLCBpbmRleCk7XG4gICAgbGV0IGluZGV4RW5kID0gaW5kZXg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXRvbTsgaSsrKSB7XG4gICAgICAgIGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignVjMwJywgaW5kZXgpICsgNDtcbiAgICAgICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXhFbmQpO1xuICAgICAgICBtb2xCbG9jayA9IG1vbEJsb2NrLnNsaWNlKDAsIGluZGV4KSArXG4gICAgICAgICAgICBjb29yZGluYXRlcy54W2ldICsgJyAnICsgY29vcmRpbmF0ZXMueVtpXSArXG4gICAgICAgICAgICBtb2xCbG9jay5zbGljZShpbmRleEVuZCk7XG4gICAgICAgIGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignXFxuJywgaW5kZXgpICsgMTtcbiAgICB9XG4gICAgcmV0dXJuIG1vbEJsb2NrO1xufVxuZnVuY3Rpb24gaW52ZXJ0TnVjbGVvdGlkZXNWMzAwMChtb2xlY3VsZSkge1xuICAgIGxldCBtb2xCbG9jayA9IG1vbGVjdWxlLmluY2x1ZGVzKCdNICBFTkQnKSA/IG1vbGVjdWxlIDogT0NMLk1vbGVjdWxlLmZyb21TbWlsZXMobW9sZWN1bGUpLnRvTW9sZmlsZVYzKCk7XG4gICAgY29uc3QgY29vcmRpbmF0ZXMgPSBleHRyYWN0QXRvbURhdGFWMzAwMChtb2xCbG9jayk7XG4gICAgY29uc3QgbmF0b20gPSBjb29yZGluYXRlcy5hdG9tSW5kZXgubGVuZ3RoO1xuICAgIGNvbnN0IHhDZW50ZXIgPSAoTWF0aC5tYXgoLi4uY29vcmRpbmF0ZXMueCkgKyBNYXRoLm1pbiguLi5jb29yZGluYXRlcy54KSkgLyAyO1xuICAgIGNvbnN0IHlDZW50ZXIgPSAoTWF0aC5tYXgoLi4uY29vcmRpbmF0ZXMueSkgKyBNYXRoLm1pbiguLi5jb29yZGluYXRlcy55KSkgLyAyO1xuICAgIC8vcGxhY2UgdG8gY2VudGVyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXRvbTsgaSsrKSB7XG4gICAgICAgIGNvb3JkaW5hdGVzLnhbaV0gLT0geENlbnRlcjtcbiAgICAgICAgY29vcmRpbmF0ZXMueVtpXSAtPSB5Q2VudGVyO1xuICAgIH1cbiAgICBjb25zdCBhbmdsZSA9IE1hdGguUEk7XG4gICAgY29uc3QgY29zID0gTWF0aC5jb3MoYW5nbGUpO1xuICAgIGNvbnN0IHNpbiA9IE1hdGguc2luKGFuZ2xlKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdG9tOyBpKyspIHtcbiAgICAgICAgY29uc3QgeEFkZCA9IGNvb3JkaW5hdGVzLnhbaV07XG4gICAgICAgIGNvb3JkaW5hdGVzLnhbaV0gPSB4QWRkICogY29zIC0gY29vcmRpbmF0ZXMueVtpXSAqIHNpbjtcbiAgICAgICAgY29vcmRpbmF0ZXMueVtpXSA9IHhBZGQgKiBzaW4gKyBjb29yZGluYXRlcy55W2ldICogY29zO1xuICAgIH1cbiAgICAvL3BsYWNlIGJhY2tcbiAgICBjb25zdCB5U2hpZnQgPSBNYXRoLm1heCguLi5jb29yZGluYXRlcy55KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdG9tOyBpKyspIHtcbiAgICAgICAgY29vcmRpbmF0ZXMueFtpXSArPSB4Q2VudGVyO1xuICAgICAgICBjb29yZGluYXRlcy55W2ldIC09IHlTaGlmdDtcbiAgICB9XG4gICAgLy9yZXdyaXRlIG1vbEJsb2NrXG4gICAgbGV0IGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignTSAgVjMwIEJFR0lOIEFUT00nKTsgLy8gVjMwMDAgaW5kZXggZm9yIGF0b21zIGNvb3JkaW5hdGVzXG4gICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdcXG4nLCBpbmRleCk7XG4gICAgbGV0IGluZGV4RW5kID0gaW5kZXg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXRvbTsgaSsrKSB7XG4gICAgICAgIGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignVjMwJywgaW5kZXgpICsgNDtcbiAgICAgICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXhFbmQpO1xuICAgICAgICBtb2xCbG9jayA9IG1vbEJsb2NrLnNsaWNlKDAsIGluZGV4KSArXG4gICAgICAgICAgICBjb29yZGluYXRlcy54W2ldICsgJyAnICsgY29vcmRpbmF0ZXMueVtpXSArXG4gICAgICAgICAgICBtb2xCbG9jay5zbGljZShpbmRleEVuZCk7XG4gICAgICAgIGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignXFxuJywgaW5kZXgpICsgMTtcbiAgICB9XG4gICAgcmV0dXJuIG1vbEJsb2NrO1xufVxuZnVuY3Rpb24gZml4NVByaW1lKGNvb3JkaW5hdGVzLCBpbmRleEZpdmVQcmltZSwgaW5kZXhUaHJlZVByaW1lKSB7XG4gICAgY29uc3QgaW5kZXhGaXZlUHJpbWVOZWlnaGJvdXIgPSBpbmRleEZpdmVQcmltZSArIDE7XG4gICAgY29uc3QgeFNoaWZ0ID0gY29vcmRpbmF0ZXMueFtpbmRleEZpdmVQcmltZU5laWdoYm91cl07XG4gICAgY29uc3QgeVNoaWZ0ID0gY29vcmRpbmF0ZXMueVtpbmRleEZpdmVQcmltZU5laWdoYm91cl07XG4gICAgY29uc3QgYmFzZTNQcmltZVggPSBjb29yZGluYXRlcy54W2luZGV4VGhyZWVQcmltZV0gLSB4U2hpZnQ7XG4gICAgY29uc3QgYmFzZTNQcmltZVkgPSBjb29yZGluYXRlcy55W2luZGV4VGhyZWVQcmltZV0gLSB5U2hpZnQ7XG4gICAgY29uc3QgYmFzZTVQcmltZVggPSBjb29yZGluYXRlcy54W2luZGV4Rml2ZVByaW1lXSAtIHhTaGlmdDtcbiAgICBjb25zdCBiYXNlNVByaW1lWSA9IGNvb3JkaW5hdGVzLnlbaW5kZXhGaXZlUHJpbWVdIC0geVNoaWZ0O1xuICAgIGNvbnN0IHJvdGF0ZWQ1UHJpbWVYID0gYmFzZTVQcmltZVggKiBNYXRoLmNvcyhNYXRoLlBJICogMiAvIDMpIC0gYmFzZTVQcmltZVkgKiBNYXRoLnNpbihNYXRoLlBJICogMiAvIDMpO1xuICAgIGNvbnN0IHJvdGF0ZWQ1UHJpbWVZID0gYmFzZTVQcmltZVggKiBNYXRoLnNpbihNYXRoLlBJICogMiAvIDMpICsgYmFzZTVQcmltZVkgKiBNYXRoLmNvcyhNYXRoLlBJICogMiAvIDMpO1xuICAgIGNvbnN0IGR4ID0gYmFzZTVQcmltZVggLSBiYXNlM1ByaW1lWDtcbiAgICBjb25zdCBkeSA9IGJhc2U1UHJpbWVZIC0gYmFzZTNQcmltZVk7XG4gICAgY29uc3QgZHhSb3RhdGVkID0gcm90YXRlZDVQcmltZVggLSBiYXNlM1ByaW1lWDtcbiAgICBjb25zdCBkeVJvdGF0ZWQgPSByb3RhdGVkNVByaW1lWSAtIGJhc2UzUHJpbWVZO1xuICAgIGlmIChNYXRoLnNxcnQoZHlSb3RhdGVkICogZHlSb3RhdGVkICsgZHhSb3RhdGVkICogZHhSb3RhdGVkKSA+PSBNYXRoLnNxcnQoZHkgKiBkeSArIGR4ICogZHgpKSB7XG4gICAgICAgIGNvb3JkaW5hdGVzLnhbaW5kZXhGaXZlUHJpbWVdID0gcm90YXRlZDVQcmltZVggKyB4U2hpZnQ7XG4gICAgICAgIGNvb3JkaW5hdGVzLnlbaW5kZXhGaXZlUHJpbWVdID0gcm90YXRlZDVQcmltZVkgKyB5U2hpZnQ7XG4gICAgfVxufVxuZnVuY3Rpb24gZXh0cmFjdEF0b21zQm9uZHNOdW1iZXJzVjMwMDAobW9sQmxvY2spIHtcbiAgICBtb2xCbG9jayA9IG1vbEJsb2NrLnJlcGxhY2VBbGwoJ1xccicsICcnKTsgLy9lcXVhbGl6ZSBvbGQgYW5kIG5ldyBzZGYgc3RhbmRhcmRzXG4gICAgbGV0IGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignQ09VTlRTJykgKyA3OyAvLyBWMzAwMCBpbmRleCBmb3IgYXRvbXMgYW5kIGJvbmRzIG51bWJlclxuICAgIGxldCBpbmRleEVuZCA9IG1vbEJsb2NrLmluZGV4T2YoJyAnLCBpbmRleCk7XG4gICAgY29uc3QgYXRvbXNOdW1iZXIgPSBwYXJzZUludChtb2xCbG9jay5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSk7XG4gICAgaW5kZXggPSBpbmRleEVuZCArIDE7XG4gICAgaW5kZXhFbmQgPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpO1xuICAgIGNvbnN0IGJvbmRzTnVtYmVyID0gcGFyc2VJbnQobW9sQmxvY2suc3Vic3RyaW5nKGluZGV4LCBpbmRleEVuZCkpO1xuICAgIHJldHVybiB7IG5hdG9tOiBhdG9tc051bWJlciwgbmJvbmQ6IGJvbmRzTnVtYmVyIH07XG59XG5mdW5jdGlvbiBleHRyYWN0QXRvbURhdGFWMzAwMChtb2xCbG9jaykge1xuICAgIGNvbnN0IG51bWJlcnMgPSBleHRyYWN0QXRvbXNCb25kc051bWJlcnNWMzAwMChtb2xCbG9jayk7XG4gICAgbGV0IGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignTSAgVjMwIEJFR0lOIEFUT00nKTsgLy8gVjMwMDAgaW5kZXggZm9yIGF0b21zIGNvb3JkaW5hdGVzXG4gICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdcXG4nLCBpbmRleCk7XG4gICAgbGV0IGluZGV4RW5kID0gaW5kZXg7XG4gICAgY29uc3QgaW5kZXhlcyA9IEFycmF5KG51bWJlcnMubmF0b20pO1xuICAgIGNvbnN0IHR5cGVzID0gQXJyYXkobnVtYmVycy5uYXRvbSk7XG4gICAgY29uc3QgeCA9IEFycmF5KG51bWJlcnMubmF0b20pO1xuICAgIGNvbnN0IHkgPSBBcnJheShudW1iZXJzLm5hdG9tKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlcnMubmF0b207IGkrKykge1xuICAgICAgICBpbmRleCA9IG1vbEJsb2NrLmluZGV4T2YoJ1YzMCcsIGluZGV4KSArIDQ7XG4gICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2suaW5kZXhPZignICcsIGluZGV4KTtcbiAgICAgICAgaW5kZXhlc1tpXSA9IHBhcnNlSW50KG1vbEJsb2NrLnN1YnN0cmluZyhpbmRleCwgaW5kZXhFbmQpKTtcbiAgICAgICAgaW5kZXggPSBpbmRleEVuZCArIDE7XG4gICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2suaW5kZXhPZignICcsIGluZGV4KTtcbiAgICAgICAgdHlwZXNbaV0gPSBtb2xCbG9jay5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKTtcbiAgICAgICAgaW5kZXggPSBpbmRleEVuZCArIDE7XG4gICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2suaW5kZXhPZignICcsIGluZGV4KTtcbiAgICAgICAgeFtpXSA9IHBhcnNlRmxvYXQobW9sQmxvY2suc3Vic3RyaW5nKGluZGV4LCBpbmRleEVuZCkpO1xuICAgICAgICBpbmRleCA9IGluZGV4RW5kICsgMTtcbiAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpO1xuICAgICAgICB5W2ldID0gcGFyc2VGbG9hdChtb2xCbG9jay5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSk7XG4gICAgICAgIGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignXFxuJywgaW5kZXgpICsgMTtcbiAgICB9XG4gICAgcmV0dXJuIHsgYXRvbUluZGV4OiBpbmRleGVzLCBhdG9tVHlwZTogdHlwZXMsIHg6IHgsIHk6IHkgfTtcbn1cbiIsImltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgeyBzZXF1ZW5jZVRvTW9sVjMwMDAgfSBmcm9tICcuLi9zdHJ1Y3R1cmVzLXdvcmtzL2Zyb20tbW9ub21lcnMnO1xuaW1wb3J0IHsgbGlua1YzMDAwIH0gZnJvbSAnLi4vc3RydWN0dXJlcy13b3Jrcy9tb2wtdHJhbnNmb3JtYXRpb25zJztcbmV4cG9ydCBmdW5jdGlvbiBzYXZlU2RmKGFzLCBzcywgb25lRW50aXR5LCBmaXQzZHgpIHtcbiAgICBjb25zdCBtb2xTUyA9IHNlcXVlbmNlVG9Nb2xWMzAwMChzcyk7XG4gICAgY29uc3QgbW9sQVMgPSBzZXF1ZW5jZVRvTW9sVjMwMDAoYXMsIHRydWUpO1xuICAgIGxldCByZXN1bHQ7XG4gICAgaWYgKG9uZUVudGl0eSlcbiAgICAgICAgcmVzdWx0ID0gbGlua1YzMDAwKFttb2xTUywgbW9sQVNdLCB0cnVlLCAhZml0M2R4KSArICdcXG5cXG4kJCQkXFxuJztcbiAgICBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID1cbiAgICAgICAgICAgIG1vbFNTICsgJ1xcbicgK1xuICAgICAgICAgICAgICAgIGA+ICA8U2VxdWVuY2U+XFxuU2Vuc2UgU3RyYW5kXFxuXFxuJCQkJFxcbmAgK1xuICAgICAgICAgICAgICAgIG1vbEFTICsgJ1xcbicgK1xuICAgICAgICAgICAgICAgIGA+ICA8U2VxdWVuY2U+XFxuQW50aSBTZW5zZVxcblxcbiQkJCRcXG5gO1xuICAgIH1cbiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdocmVmJywgJ2RhdGE6dGV4dC9wbGFpbjtjaGFyc2V0PXV0Zi04LCcgKyBlbmNvZGVVUklDb21wb25lbnQocmVzdWx0KSk7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgc3MucmVwbGFjZSgvXFxzL2csICcnKSArICcuc2RmJyk7XG4gICAgZWxlbWVudC5jbGljaygpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNhdmVTZW5zZUFudGlTZW5zZSgpIHtcbiAgICBjb25zdCBtb2xlY3VsZVN2Z0RpdiA9IHVpLmJsb2NrKFtdKTtcbiAgICBjb25zdCBzc0lucHV0ID0gdWkudGV4dElucHV0KCdTZW5zZSBTdHJhbmQgNVxcJyAtPjNcXCcnLCAnJyk7XG4gICAgY29uc3QgYXNJbnB1dCA9IHVpLnRleHRJbnB1dCgnQW50aSBTZW5zZSAzXFwnIC0+NVxcJycsICcnKTtcbiAgICBjb25zdCBzYXZlT3B0aW9uID0gdWkuc3dpdGNoSW5wdXQoJ1NhdmUgYXMgb25lIGVudGl0eScsIHRydWUpO1xuICAgIGNvbnN0IHNhdmUzZHggPSB1aS5zd2l0Y2hJbnB1dCgnU2F2ZSAzZHgnLCB0cnVlKTtcbiAgICBjb25zdCBzYXZlQnRuID0gdWkuYnV0dG9uKCdTYXZlIFNERicsICgpID0+IHNhdmVTZGYoYXNJbnB1dC52YWx1ZSwgc3NJbnB1dC52YWx1ZSwgc2F2ZU9wdGlvbi52YWx1ZSwgc2F2ZTNkeC52YWx1ZSkpO1xuICAgIGNvbnN0IHNhdmVTZWN0aW9uID0gdWkucGFuZWwoW1xuICAgICAgICB1aS5kaXYoW1xuICAgICAgICAgICAgdWkuZGl2KFtcbiAgICAgICAgICAgICAgICB1aS5kaXZIKFt1aS5oMSgnSW5wdXRzJyldKSxcbiAgICAgICAgICAgICAgICB1aS5kaXZWKFtcbiAgICAgICAgICAgICAgICAgICAgdWkuZGl2KFtzc0lucHV0LnJvb3RdKSxcbiAgICAgICAgICAgICAgICAgICAgdWkuZGl2KFthc0lucHV0LnJvb3RdKSxcbiAgICAgICAgICAgICAgICAgICAgc2F2ZU9wdGlvbixcbiAgICAgICAgICAgICAgICAgICAgc2F2ZTNkeCxcbiAgICAgICAgICAgICAgICAgICAgdWkuYnV0dG9uc0lucHV0KFtzYXZlQnRuXSksXG4gICAgICAgICAgICAgICAgXSwgJ3VpLWZvcm0nKSxcbiAgICAgICAgICAgIF0sICd1aS1mb3JtJyksXG4gICAgICAgIF0sICd1aS1mb3JtJyksXG4gICAgICAgIG1vbGVjdWxlU3ZnRGl2LFxuICAgIF0pO1xuICAgIHJldHVybiBzYXZlU2VjdGlvbjtcbn1cbiIsImltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbi8vIGltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5pbXBvcnQgeyBtYXAsIFNZTlRIRVNJWkVSUywgVEVDSE5PTE9HSUVTLCBNT0RJRklDQVRJT05TIH0gZnJvbSAnLi9tYXAnO1xuaW1wb3J0IHsgYXNvR2FwbWVyc051Y2xlb3RpZGVzVG9CaW9TcHJpbmcsIGFzb0dhcG1lcnNOdWNsZW90aWRlc1RvR2NycywgYXNvR2FwbWVyc0Jpb1NwcmluZ1RvTnVjbGVvdGlkZXMsIGFzb0dhcG1lcnNCaW9TcHJpbmdUb0djcnMsIGFzb0dhcG1lcnNHY3JzVG9OdWNsZW90aWRlcywgYXNvR2FwbWVyc0djcnNUb0Jpb1NwcmluZywgZ2Nyc1RvTWVybWFkZTEyLCBzaVJuYU51Y2xlb3RpZGVUb0Jpb1NwcmluZ1NlbnNlU3RyYW5kLCBzaVJuYU51Y2xlb3RpZGVUb0F4b2xhYnNTZW5zZVN0cmFuZCwgc2lSbmFOdWNsZW90aWRlc1RvR2Nycywgc2lSbmFCaW9TcHJpbmdUb051Y2xlb3RpZGVzLCBzaVJuYUJpb1NwcmluZ1RvQXhvbGFicywgc2lSbmFCaW9TcHJpbmdUb0djcnMsIHNpUm5hQXhvbGFic1RvTnVjbGVvdGlkZXMsIHNpUm5hQXhvbGFic1RvQmlvU3ByaW5nLCBzaVJuYUF4b2xhYnNUb0djcnMsIHNpUm5hR2Nyc1RvTnVjbGVvdGlkZXMsIHNpUm5hR2Nyc1RvQmlvU3ByaW5nLCBzaVJuYUdjcnNUb0F4b2xhYnMsIGdjcnNUb051Y2xlb3RpZGVzIH0gZnJvbSAnLi9jb252ZXJ0ZXJzJztcbmNvbnN0IG5vVHJhbnNsYXRpb25UYWJsZUF2YWlsYWJsZSA9ICdObyB0cmFuc2xhdGlvbiB0YWJsZSBhdmFpbGFibGUnO1xuZXhwb3J0IGNvbnN0IHVuZGVmaW5lZElucHV0U2VxdWVuY2UgPSAnVHlwZSBvZiBpbnB1dCBzZXF1ZW5jZSBpcyB1bmRlZmluZWQnO1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRTZXF1ZW5jZShzZXF1ZW5jZSkge1xuICAgIGxldCBwb3NzaWJsZVN5bnRoZXNpemVycyA9IGdldExpc3RPZlBvc3NpYmxlU3ludGhlc2l6ZXJzQnlGaXJzdE1hdGNoZWRDb2RlKHNlcXVlbmNlKTtcbiAgICBpZiAocG9zc2libGVTeW50aGVzaXplcnMubGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zdCBzeW50aGVzaXplciA9IHVpLmNob2ljZUlucHV0KCdDaG9vc2Ugc3ludGhlc2l6ZXIgZnJvbSBsaXN0OiAnLCBwb3NzaWJsZVN5bnRoZXNpemVyc1swXSwgcG9zc2libGVTeW50aGVzaXplcnMpO1xuICAgICAgICB1aS5kaWFsb2coJ0Nob29zZSBTeW50aGVzaXplcicpXG4gICAgICAgICAgICAuYWRkKHVpLnBhbmVsKFtzeW50aGVzaXplci5yb290XSwgeyBzdHlsZTogeyBmb250V2VpZ2h0OiAnYm9sZCcgfSB9KSlcbiAgICAgICAgICAgIC5vbk9LKCgpID0+IHBvc3NpYmxlU3ludGhlc2l6ZXJzID0gW3N5bnRoZXNpemVyLnZhbHVlXSlcbiAgICAgICAgICAgIC5vbkNhbmNlbCgoKSA9PiB7XG4gICAgICAgICAgICBwb3NzaWJsZVN5bnRoZXNpemVycyA9IFtwb3NzaWJsZVN5bnRoZXNpemVyc1swXV07XG4gICAgICAgICAgICBncm9rLnNoZWxsLndhcm5pbmcoJ0lucHV0IHNlcXVlbmNlIGlzIGV4cGVjdGVkIHRvIGJlIGluIGZvcm1hdCAnICsgcG9zc2libGVTeW50aGVzaXplcnNbMF0pO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLnNob3coKTtcbiAgICB9XG4gICAgZWxzZSBpZiAocG9zc2libGVTeW50aGVzaXplcnMubGVuZ3RoID09IDApXG4gICAgICAgIHJldHVybiB7IGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhcjogMCwgc3ludGhlc2l6ZXI6IG51bGwsIHRlY2hub2xvZ3k6IG51bGwgfTtcbiAgICBsZXQgb3V0cHV0SW5kZXggPSAwO1xuICAgIGNvbnN0IGZpcnN0VW5pcXVlQ2hhcmFjdGVycyA9IFsncicsICdkJ107XG4gICAgY29uc3QgbnVjbGVvdGlkZXMgPSBbJ0EnLCAnVScsICdUJywgJ0MnLCAnRyddO1xuICAgIHBvc3NpYmxlU3ludGhlc2l6ZXJzLmZvckVhY2goKHN5bnRoZXNpemVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvZGVzID0gZ2V0QWxsQ29kZXNPZlN5bnRoZXNpemVyKHN5bnRoZXNpemVyKTtcbiAgICAgICAgd2hpbGUgKG91dHB1dEluZGV4IDwgc2VxdWVuY2UubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkQ29kZSA9IGNvZGVzLmZpbmQoKGMpID0+IGMgPT0gc2VxdWVuY2Uuc2xpY2Uob3V0cHV0SW5kZXgsIG91dHB1dEluZGV4ICsgYy5sZW5ndGgpKTtcbiAgICAgICAgICAgIGlmIChtYXRjaGVkQ29kZSA9PSBudWxsKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKCAvLyBmb3IgbWlzdGFrZSBwYXR0ZXJuICdyQUEnXG4gICAgICAgICAgICBvdXRwdXRJbmRleCA+IDEgJiZcbiAgICAgICAgICAgICAgICBudWNsZW90aWRlcy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRleF0pICYmXG4gICAgICAgICAgICAgICAgZmlyc3RVbmlxdWVDaGFyYWN0ZXJzLmluY2x1ZGVzKHNlcXVlbmNlW291dHB1dEluZGV4IC0gMl0pKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKCAvLyBmb3IgbWlzdGFrZSBwYXR0ZXJuICdBckEnXG4gICAgICAgICAgICBmaXJzdFVuaXF1ZUNoYXJhY3RlcnMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kZXggKyAxXSkgJiZcbiAgICAgICAgICAgICAgICBudWNsZW90aWRlcy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0SW5kZXgrKztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dHB1dEluZGV4ICs9IG1hdGNoZWRDb2RlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhciA9IChvdXRwdXRJbmRleCA9PSBzZXF1ZW5jZS5sZW5ndGgpID8gLTEgOiBvdXRwdXRJbmRleDtcbiAgICBpZiAoaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyICE9IC0xKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbmRleE9mRmlyc3ROb3RWYWxpZENoYXI6IGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhcixcbiAgICAgICAgICAgIHN5bnRoZXNpemVyOiBwb3NzaWJsZVN5bnRoZXNpemVyc1swXSxcbiAgICAgICAgICAgIHRlY2hub2xvZ3k6IG51bGwsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGxldCBwb3NzaWJsZVRlY2hub2xvZ2llcyA9IGdldExpc3RPZlBvc3NpYmxlVGVjaG5vbG9naWVzQnlGaXJzdE1hdGNoZWRDb2RlKHNlcXVlbmNlLCBwb3NzaWJsZVN5bnRoZXNpemVyc1swXSk7XG4gICAgaWYgKHBvc3NpYmxlVGVjaG5vbG9naWVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgY29uc3QgdGVjaG5vbG9neSA9IHVpLmNob2ljZUlucHV0KCdDaG9vc2UgdGVjaG5vbG9neSBmcm9tIGxpc3Q6ICcsIHBvc3NpYmxlVGVjaG5vbG9naWVzWzBdLCBwb3NzaWJsZVRlY2hub2xvZ2llcyk7XG4gICAgICAgIHVpLmRpYWxvZygnQ2hvb3NlIFRlY2hub2xvZ3knKVxuICAgICAgICAgICAgLmFkZCh1aS5wYW5lbChbdGVjaG5vbG9neS5yb290XSwgeyBzdHlsZTogeyBmb250V2VpZ2h0OiAnYm9sZCcgfSB9KSlcbiAgICAgICAgICAgIC5vbk9LKCgpID0+IHBvc3NpYmxlVGVjaG5vbG9naWVzID0gW3RlY2hub2xvZ3kudmFsdWVdKVxuICAgICAgICAgICAgLm9uQ2FuY2VsKCgpID0+IHtcbiAgICAgICAgICAgIHBvc3NpYmxlVGVjaG5vbG9naWVzID0gW3Bvc3NpYmxlVGVjaG5vbG9naWVzWzBdXTtcbiAgICAgICAgICAgIGdyb2suc2hlbGwud2FybmluZygnSW5wdXQgc2VxdWVuY2UgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gZm9ybWF0ICcgKyBwb3NzaWJsZVRlY2hub2xvZ2llc1swXSk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuc2hvdygpO1xuICAgIH1cbiAgICBlbHNlIGlmIChwb3NzaWJsZVRlY2hub2xvZ2llcy5sZW5ndGggPT0gMClcbiAgICAgICAgcmV0dXJuIHsgaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyOiAwLCBzeW50aGVzaXplcjogbnVsbCwgdGVjaG5vbG9neTogbnVsbCB9O1xuICAgIG91dHB1dEluZGV4ID0gMDtcbiAgICBwb3NzaWJsZVRlY2hub2xvZ2llcy5mb3JFYWNoKCh0ZWNobm9sb2d5KSA9PiB7XG4gICAgICAgIGNvbnN0IGNvZGVzID0gT2JqZWN0LmtleXMobWFwW3Bvc3NpYmxlU3ludGhlc2l6ZXJzWzBdXVt0ZWNobm9sb2d5XSk7XG4gICAgICAgIHdoaWxlIChvdXRwdXRJbmRleCA8IHNlcXVlbmNlLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlZENvZGUgPSBjb2Rlcy5maW5kKChjKSA9PiBjID09IHNlcXVlbmNlLnNsaWNlKG91dHB1dEluZGV4LCBvdXRwdXRJbmRleCArIGMubGVuZ3RoKSk7XG4gICAgICAgICAgICBpZiAobWF0Y2hlZENvZGUgPT0gbnVsbClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmICggLy8gZm9yIG1pc3Rha2UgcGF0dGVybiAnckFBJ1xuICAgICAgICAgICAgb3V0cHV0SW5kZXggPiAxICYmXG4gICAgICAgICAgICAgICAgbnVjbGVvdGlkZXMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kZXhdKSAmJlxuICAgICAgICAgICAgICAgIGZpcnN0VW5pcXVlQ2hhcmFjdGVycy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRleCAtIDJdKSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmICggLy8gZm9yIG1pc3Rha2UgcGF0dGVybiAnQXJBJ1xuICAgICAgICAgICAgZmlyc3RVbmlxdWVDaGFyYWN0ZXJzLmluY2x1ZGVzKHNlcXVlbmNlW291dHB1dEluZGV4ICsgMV0pICYmXG4gICAgICAgICAgICAgICAgbnVjbGVvdGlkZXMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kZXhdKSkge1xuICAgICAgICAgICAgICAgIG91dHB1dEluZGV4Kys7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXRwdXRJbmRleCArPSBtYXRjaGVkQ29kZS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBpbmRleE9mRmlyc3ROb3RWYWxpZENoYXI6IGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhcixcbiAgICAgICAgc3ludGhlc2l6ZXI6IHBvc3NpYmxlU3ludGhlc2l6ZXJzWzBdLFxuICAgICAgICB0ZWNobm9sb2d5OiBwb3NzaWJsZVRlY2hub2xvZ2llc1tvdXRwdXRJbmRleF0sXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGdldEFsbENvZGVzT2ZTeW50aGVzaXplcihzeW50aGVzaXplcikge1xuICAgIGxldCBjb2RlcyA9IFtdO1xuICAgIGZvciAoY29uc3QgdGVjaG5vbG9neSBvZiBPYmplY3Qua2V5cyhtYXBbc3ludGhlc2l6ZXJdKSlcbiAgICAgICAgY29kZXMgPSBjb2Rlcy5jb25jYXQoT2JqZWN0LmtleXMobWFwW3N5bnRoZXNpemVyXVt0ZWNobm9sb2d5XSkpO1xuICAgIHJldHVybiBjb2Rlcy5jb25jYXQoT2JqZWN0LmtleXMoTU9ESUZJQ0FUSU9OUykpO1xufVxuZnVuY3Rpb24gZ2V0TGlzdE9mUG9zc2libGVTeW50aGVzaXplcnNCeUZpcnN0TWF0Y2hlZENvZGUoc2VxdWVuY2UpIHtcbiAgICBjb25zdCBzeW50aGVzaXplcnMgPSBbXTtcbiAgICBPYmplY3Qua2V5cyhtYXApLmZvckVhY2goKHN5bnRoZXNpemVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvZGVzID0gZ2V0QWxsQ29kZXNPZlN5bnRoZXNpemVyKHN5bnRoZXNpemVyKTtcbiAgICAgICAgLy9UT0RPOiBnZXQgZmlyc3Qgbm9uLWRyb3Bkb3duIGNvZGUgd2hlbiB0aGVyZSBhcmUgdHdvIG1vZGlmaWNhdGlvbnNcbiAgICAgICAgbGV0IHN0YXJ0ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXF1ZW5jZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHNlcXVlbmNlW2ldID09ICcpJyAmJiBpICE9IHNlcXVlbmNlLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb2Rlcy5zb21lKChzKSA9PiBzID09IHNlcXVlbmNlLnNsaWNlKHN0YXJ0LCBzdGFydCArIHMubGVuZ3RoKSkpXG4gICAgICAgICAgICBzeW50aGVzaXplcnMucHVzaChzeW50aGVzaXplcik7XG4gICAgfSk7XG4gICAgcmV0dXJuIHN5bnRoZXNpemVycztcbn1cbmZ1bmN0aW9uIGdldExpc3RPZlBvc3NpYmxlVGVjaG5vbG9naWVzQnlGaXJzdE1hdGNoZWRDb2RlKHNlcXVlbmNlLCBzeW50aGVzaXplcikge1xuICAgIGNvbnN0IHRlY2hub2xvZ2llcyA9IFtdO1xuICAgIE9iamVjdC5rZXlzKG1hcFtzeW50aGVzaXplcl0pLmZvckVhY2goKHRlY2hub2xvZ3kpID0+IHtcbiAgICAgICAgY29uc3QgY29kZXMgPSBPYmplY3Qua2V5cyhtYXBbc3ludGhlc2l6ZXJdW3RlY2hub2xvZ3ldKS5jb25jYXQoT2JqZWN0LmtleXMoTU9ESUZJQ0FUSU9OUykpO1xuICAgICAgICBpZiAoY29kZXMuc29tZSgocykgPT4gcyA9PSBzZXF1ZW5jZS5zbGljZSgwLCBzLmxlbmd0aCkpKVxuICAgICAgICAgICAgdGVjaG5vbG9naWVzLnB1c2godGVjaG5vbG9neSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRlY2hub2xvZ2llcztcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0U2VxdWVuY2Uoc2VxdWVuY2UsIG91dHB1dCkge1xuICAgIGlmIChvdXRwdXQuaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyICE9IC0xKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAvLyB0eXBlOiAnJyxcbiAgICAgICAgICAgIGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhcjogSlNPTi5zdHJpbmdpZnkob3V0cHV0KSxcbiAgICAgICAgICAgIEVycm9yOiB1bmRlZmluZWRJbnB1dFNlcXVlbmNlLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyID09IFNZTlRIRVNJWkVSUy5SQVdfTlVDTEVPVElERVMgJiYgb3V0cHV0LnRlY2hub2xvZ3kgPT0gVEVDSE5PTE9HSUVTLkROQSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogU1lOVEhFU0laRVJTLlJBV19OVUNMRU9USURFUyArICcgJyArIFRFQ0hOT0xPR0lFUy5ETkEsXG4gICAgICAgICAgICBOdWNsZW90aWRlczogc2VxdWVuY2UsXG4gICAgICAgICAgICBCaW9TcHJpbmc6IGFzb0dhcG1lcnNOdWNsZW90aWRlc1RvQmlvU3ByaW5nKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEdDUlM6IGFzb0dhcG1lcnNOdWNsZW90aWRlc1RvR2NycyhzZXF1ZW5jZSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChvdXRwdXQuc3ludGhlc2l6ZXIgPT0gU1lOVEhFU0laRVJTLkJJT1NQUklORyAmJiBvdXRwdXQudGVjaG5vbG9neSA9PSBURUNITk9MT0dJRVMuQVNPX0dBUE1FUlMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFNZTlRIRVNJWkVSUy5CSU9TUFJJTkcgKyAnICcgKyBURUNITk9MT0dJRVMuQVNPX0dBUE1FUlMsXG4gICAgICAgICAgICBOdWNsZW90aWRlczogYXNvR2FwbWVyc0Jpb1NwcmluZ1RvTnVjbGVvdGlkZXMoc2VxdWVuY2UpLFxuICAgICAgICAgICAgQmlvU3ByaW5nOiBzZXF1ZW5jZSxcbiAgICAgICAgICAgIEdDUlM6IGFzb0dhcG1lcnNCaW9TcHJpbmdUb0djcnMoc2VxdWVuY2UpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyID09IFNZTlRIRVNJWkVSUy5HQ1JTICYmIG91dHB1dC50ZWNobm9sb2d5ID09IFRFQ0hOT0xPR0lFUy5BU09fR0FQTUVSUykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogU1lOVEhFU0laRVJTLkdDUlMgKyAnICcgKyBURUNITk9MT0dJRVMuQVNPX0dBUE1FUlMsXG4gICAgICAgICAgICBOdWNsZW90aWRlczogYXNvR2FwbWVyc0djcnNUb051Y2xlb3RpZGVzKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEJpb1NwcmluZzogYXNvR2FwbWVyc0djcnNUb0Jpb1NwcmluZyhzZXF1ZW5jZSksXG4gICAgICAgICAgICBNZXJtYWRlMTI6IGdjcnNUb01lcm1hZGUxMihzZXF1ZW5jZSksXG4gICAgICAgICAgICBHQ1JTOiBzZXF1ZW5jZSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG91dHB1dC5zeW50aGVzaXplciA9PSBTWU5USEVTSVpFUlMuUkFXX05VQ0xFT1RJREVTICYmIG91dHB1dC50ZWNobm9sb2d5ID09IFRFQ0hOT0xPR0lFUy5STkEpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFNZTlRIRVNJWkVSUy5SQVdfTlVDTEVPVElERVMgKyAnICcgKyBURUNITk9MT0dJRVMuUk5BLFxuICAgICAgICAgICAgTnVjbGVvdGlkZXM6IHNlcXVlbmNlLFxuICAgICAgICAgICAgQmlvU3ByaW5nOiBzaVJuYU51Y2xlb3RpZGVUb0Jpb1NwcmluZ1NlbnNlU3RyYW5kKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEF4b2xhYnM6IHNpUm5hTnVjbGVvdGlkZVRvQXhvbGFic1NlbnNlU3RyYW5kKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEdDUlM6IHNpUm5hTnVjbGVvdGlkZXNUb0djcnMoc2VxdWVuY2UpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyID09IFNZTlRIRVNJWkVSUy5CSU9TUFJJTkcgJiYgb3V0cHV0LnRlY2hub2xvZ3kgPT0gVEVDSE5PTE9HSUVTLlNJX1JOQSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogU1lOVEhFU0laRVJTLkJJT1NQUklORyArICcgJyArIFRFQ0hOT0xPR0lFUy5TSV9STkEsXG4gICAgICAgICAgICBOdWNsZW90aWRlczogc2lSbmFCaW9TcHJpbmdUb051Y2xlb3RpZGVzKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEJpb1NwcmluZzogc2VxdWVuY2UsXG4gICAgICAgICAgICBBeG9sYWJzOiBzaVJuYUJpb1NwcmluZ1RvQXhvbGFicyhzZXF1ZW5jZSksXG4gICAgICAgICAgICBHQ1JTOiBzaVJuYUJpb1NwcmluZ1RvR2NycyhzZXF1ZW5jZSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChvdXRwdXQuc3ludGhlc2l6ZXIgPT0gU1lOVEhFU0laRVJTLkFYT0xBQlMgJiYgb3V0cHV0LnRlY2hub2xvZ3kgPT0gVEVDSE5PTE9HSUVTLlNJX1JOQSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogU1lOVEhFU0laRVJTLkFYT0xBQlMgKyAnICcgKyBURUNITk9MT0dJRVMuU0lfUk5BLFxuICAgICAgICAgICAgTnVjbGVvdGlkZXM6IHNpUm5hQXhvbGFic1RvTnVjbGVvdGlkZXMoc2VxdWVuY2UpLFxuICAgICAgICAgICAgQmlvU3ByaW5nOiBzaVJuYUF4b2xhYnNUb0Jpb1NwcmluZyhzZXF1ZW5jZSksXG4gICAgICAgICAgICBBeG9sYWJzOiBzZXF1ZW5jZSxcbiAgICAgICAgICAgIEdDUlM6IHNpUm5hQXhvbGFic1RvR2NycyhzZXF1ZW5jZSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChvdXRwdXQuc3ludGhlc2l6ZXIgPT0gU1lOVEhFU0laRVJTLkdDUlMgJiYgb3V0cHV0LnRlY2hub2xvZ3kgPT0gVEVDSE5PTE9HSUVTLlNJX1JOQSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogU1lOVEhFU0laRVJTLkdDUlMgKyAnICcgKyBURUNITk9MT0dJRVMuU0lfUk5BLFxuICAgICAgICAgICAgTnVjbGVvdGlkZXM6IHNpUm5hR2Nyc1RvTnVjbGVvdGlkZXMoc2VxdWVuY2UpLFxuICAgICAgICAgICAgQmlvU3ByaW5nOiBzaVJuYUdjcnNUb0Jpb1NwcmluZyhzZXF1ZW5jZSksXG4gICAgICAgICAgICBBeG9sYWJzOiBzaVJuYUdjcnNUb0F4b2xhYnMoc2VxdWVuY2UpLFxuICAgICAgICAgICAgTU0xMjogZ2Nyc1RvTWVybWFkZTEyKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEdDUlM6IHNlcXVlbmNlLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyID09IFNZTlRIRVNJWkVSUy5HQ1JTKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBTWU5USEVTSVpFUlMuR0NSUyxcbiAgICAgICAgICAgIE51Y2xlb3RpZGVzOiBnY3JzVG9OdWNsZW90aWRlcyhzZXF1ZW5jZSksXG4gICAgICAgICAgICBHQ1JTOiBzZXF1ZW5jZSxcbiAgICAgICAgICAgIE1lcm1hZGUxMjogZ2Nyc1RvTWVybWFkZTEyKHNlcXVlbmNlKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG91dHB1dC5zeW50aGVzaXplciA9PSBTWU5USEVTSVpFUlMuTUVSTUFERV8xMikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogU1lOVEhFU0laRVJTLk1FUk1BREVfMTIsXG4gICAgICAgICAgICBOdWNsZW90aWRlczogbm9UcmFuc2xhdGlvblRhYmxlQXZhaWxhYmxlLFxuICAgICAgICAgICAgR0NSUzogbm9UcmFuc2xhdGlvblRhYmxlQXZhaWxhYmxlLFxuICAgICAgICAgICAgTWVybWFkZTEyOiBzZXF1ZW5jZSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogdW5kZWZpbmVkSW5wdXRTZXF1ZW5jZSxcbiAgICAgICAgTnVjbGVvdGlkZXM6IHVuZGVmaW5lZElucHV0U2VxdWVuY2UsXG4gICAgfTtcbn1cbiIsImV4cG9ydCBjb25zdCBVU0VSU19DU1YgPSBgRElTUExBWVxuTk8gREFUQVxuYDtcbiIsIm1vZHVsZS5leHBvcnRzID0gREc7IiwibW9kdWxlLmV4cG9ydHMgPSBPQ0w7IiwibW9kdWxlLmV4cG9ydHMgPSBncm9rOyIsIm1vZHVsZS5leHBvcnRzID0gdWk7IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuLyogRG8gbm90IGNoYW5nZSB0aGVzZSBpbXBvcnQgbGluZXMuIERhdGFncm9rIHdpbGwgaW1wb3J0IEFQSSBsaWJyYXJ5IGluIGV4YWN0bHkgdGhlIHNhbWUgbWFubmVyICovXG5pbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuaW1wb3J0ICogYXMgT0NMIGZyb20gJ29wZW5jaGVtbGliL2Z1bGwuanMnO1xuaW1wb3J0ICQgZnJvbSAnY2FzaC1kb20nO1xuaW1wb3J0IHsgZGVmaW5lQXhvbGFic1BhdHRlcm4gfSBmcm9tICcuL2RlZmluZUF4b2xhYnNQYXR0ZXJuJztcbmltcG9ydCB7IHNhdmVTZW5zZUFudGlTZW5zZSB9IGZyb20gJy4vc3RydWN0dXJlcy13b3Jrcy9zYXZlLXNlbnNlLWFudGlzZW5zZSc7XG5pbXBvcnQgeyBzZXF1ZW5jZVRvU21pbGVzLCBzZXF1ZW5jZVRvTW9sVjMwMDAgfSBmcm9tICcuL3N0cnVjdHVyZXMtd29ya3MvZnJvbS1tb25vbWVycyc7XG5pbXBvcnQgeyBjb252ZXJ0U2VxdWVuY2UsIHVuZGVmaW5lZElucHV0U2VxdWVuY2UsIGlzVmFsaWRTZXF1ZW5jZSB9IGZyb20gJy4vc3RydWN0dXJlcy13b3Jrcy9zZXF1ZW5jZS1jb2Rlcy10b29scyc7XG5pbXBvcnQgeyBtYXAsIENPTF9OQU1FUywgTU9ESUZJQ0FUSU9OUyB9IGZyb20gJy4vc3RydWN0dXJlcy13b3Jrcy9tYXAnO1xuaW1wb3J0IHsgU0FMVFNfQ1NWIH0gZnJvbSAnLi9zYWx0cyc7XG5pbXBvcnQgeyBVU0VSU19DU1YgfSBmcm9tICcuL3VzZXJzJztcbmltcG9ydCB7IElDRFMgfSBmcm9tICcuL0lDRHMnO1xuaW1wb3J0IHsgU09VUkNFUyB9IGZyb20gJy4vc291cmNlcyc7XG5pbXBvcnQgeyBJRFBTIH0gZnJvbSAnLi9JRFBzJztcbmV4cG9ydCBjb25zdCBfcGFja2FnZSA9IG5ldyBERy5QYWNrYWdlKCk7XG5jb25zdCBkZWZhdWx0SW5wdXQgPSAnZkFtQ21HbUFtQ3BzbVUnO1xuY29uc3Qgc2VxdWVuY2VXYXNDb3BpZWQgPSAnQ29waWVkJztcbmNvbnN0IHRvb2x0aXBTZXF1ZW5jZSA9ICdDb3B5IHNlcXVlbmNlJztcbi8vbmFtZTogU2VxdWVuY2UgVHJhbnNsYXRvclxuLy90YWdzOiBhcHBcbmV4cG9ydCBmdW5jdGlvbiBzZXF1ZW5jZVRyYW5zbGF0b3IoKSB7XG4gICAgY29uc3Qgd2luZG93cyA9IGdyb2suc2hlbGwud2luZG93cztcbiAgICB3aW5kb3dzLnNob3dQcm9wZXJ0aWVzID0gZmFsc2U7XG4gICAgd2luZG93cy5zaG93VG9vbGJveCA9IGZhbHNlO1xuICAgIHdpbmRvd3Muc2hvd0hlbHAgPSBmYWxzZTtcbiAgICBmdW5jdGlvbiB1cGRhdGVUYWJsZUFuZE1vbGVjdWxlKHNlcXVlbmNlKSB7XG4gICAgICAgIG1vbGVjdWxlU3ZnRGl2LmlubmVySFRNTCA9ICcnO1xuICAgICAgICBvdXRwdXRUYWJsZURpdi5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgY29uc3QgcGkgPSBERy5UYXNrQmFyUHJvZ3Jlc3NJbmRpY2F0b3IuY3JlYXRlKCdSZW5kZXJpbmcgdGFibGUgYW5kIG1vbGVjdWxlLi4uJyk7XG4gICAgICAgIGxldCBlcnJvcnNFeGlzdCA9IGZhbHNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc2VxdWVuY2UgPSBzZXF1ZW5jZS5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0gaXNWYWxpZFNlcXVlbmNlKHNlcXVlbmNlKTtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dFNlcXVlbmNlT2JqID0gY29udmVydFNlcXVlbmNlKHNlcXVlbmNlLCBvdXRwdXQpO1xuICAgICAgICAgICAgY29uc3QgdGFibGVSb3dzID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvdXRwdXRTZXF1ZW5jZU9iaikuc2xpY2UoMSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleE9mRmlyc3ROb3RWYWxpZENoYXIgPSAoJ2luZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhcicgaW4gb3V0cHV0U2VxdWVuY2VPYmopID9cbiAgICAgICAgICAgICAgICAgICAgSlNPTi5wYXJzZShvdXRwdXRTZXF1ZW5jZU9iai5pbmRleE9mRmlyc3ROb3RWYWxpZENoYXIpLmluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhciA6XG4gICAgICAgICAgICAgICAgICAgIC0xO1xuICAgICAgICAgICAgICAgIGlmICgnaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyJyBpbiBvdXRwdXRTZXF1ZW5jZU9iaikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleE9mRmlyc3ROb3RWYWxpZENoYXIgPSAoJ2luZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhcicgaW4gb3V0cHV0U2VxdWVuY2VPYmopID9cbiAgICAgICAgICAgICAgICAgICAgICAgIEpTT04ucGFyc2Uob3V0cHV0U2VxdWVuY2VPYmouaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyKS5pbmRleE9mRmlyc3ROb3RWYWxpZENoYXIgOlxuICAgICAgICAgICAgICAgICAgICAgICAgLTE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleE9mRmlyc3ROb3RWYWxpZENoYXIgIT0gLTEpXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnNFeGlzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRhYmxlUm93cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgJ2tleSc6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogKCdpbmRleE9mRmlyc3ROb3RWYWxpZENoYXInIGluIG91dHB1dFNlcXVlbmNlT2JqKSA/XG4gICAgICAgICAgICAgICAgICAgICAgICB1aS5kaXZIKFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aS5kaXZUZXh0KHNlcXVlbmNlLnNsaWNlKDAsIGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhciksIHsgc3R5bGU6IHsgY29sb3I6ICdncmV5JyB9IH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpLnRvb2x0aXAuYmluZCh1aS5kaXZUZXh0KHNlcXVlbmNlLnNsaWNlKGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhciksIHsgc3R5bGU6IHsgY29sb3I6ICdyZWQnIH0gfSksICdFeHBlY3RlZCBmb3JtYXQ6ICcgKyBKU09OLnBhcnNlKG91dHB1dFNlcXVlbmNlT2JqLmluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhcikuc3ludGhlc2l6ZXIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLiBTZWUgdGFibGVzIHdpdGggdmFsaWQgY29kZXMgb24gdGhlIHJpZ2h0JyksXG4gICAgICAgICAgICAgICAgICAgICAgICBdKSA6IC8vQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgdWkubGluayhvdXRwdXRTZXF1ZW5jZU9ialtrZXldLCAoKSA9PiBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChvdXRwdXRTZXF1ZW5jZU9ialtrZXldKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IGdyb2suc2hlbGwuaW5mbyhzZXF1ZW5jZVdhc0NvcGllZCkpLCB0b29sdGlwU2VxdWVuY2UsICcnKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlcnJvcnNFeGlzdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN5bnRoZXNpemVyID0gSlNPTi5wYXJzZShvdXRwdXRTZXF1ZW5jZU9iai5pbmRleE9mRmlyc3ROb3RWYWxpZENoYXIpLnN5bnRoZXNpemVyLnNsaWNlKDAsIC02KTtcbiAgICAgICAgICAgICAgICBhc29HYXBtZXJzR3JpZC5vbkNlbGxQcmVwYXJlKGZ1bmN0aW9uIChnYykge1xuICAgICAgICAgICAgICAgICAgICBnYy5zdHlsZS5iYWNrQ29sb3IgPSAoZ2MuZ3JpZENvbHVtbi5uYW1lID09IHN5bnRoZXNpemVyKSA/IDB4RkZGMDAwMDAgOiAweEZGRkZGRkZGO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIG9tZUFuZEZsdW9yb0dyaWQub25DZWxsUHJlcGFyZShmdW5jdGlvbiAoZ2MpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2Muc3R5bGUuYmFja0NvbG9yID0gKGdjLmdyaWRDb2x1bW4ubmFtZSA9PSBzeW50aGVzaXplcikgPyAweEZGRjAwMDAwIDogMHhGRkZGRkZGRjtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzd2l0Y2hJbnB1dC5lbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGFzb0dhcG1lcnNHcmlkLm9uQ2VsbFByZXBhcmUoZnVuY3Rpb24gKGdjKSB7IGdjLnN0eWxlLmJhY2tDb2xvciA9IDB4RkZGRkZGRkY7IH0pO1xuICAgICAgICAgICAgICAgIG9tZUFuZEZsdW9yb0dyaWQub25DZWxsUHJlcGFyZShmdW5jdGlvbiAoZ2MpIHsgZ2Muc3R5bGUuYmFja0NvbG9yID0gMHhGRkZGRkZGRjsgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXRwdXRUYWJsZURpdi5hcHBlbmQodWkuZGl2KFtcbiAgICAgICAgICAgICAgICBERy5IdG1sVGFibGUuY3JlYXRlKHRhYmxlUm93cywgKGl0ZW0pID0+IFtpdGVtLmtleSwgaXRlbS52YWx1ZV0sIFsnQ29kZScsICdTZXF1ZW5jZSddKS5yb290LFxuICAgICAgICAgICAgXSkpO1xuICAgICAgICAgICAgc2VtVHlwZU9mSW5wdXRTZXF1ZW5jZS50ZXh0Q29udGVudCA9ICdEZXRlY3RlZCBpbnB1dCB0eXBlOiAnICsgb3V0cHV0U2VxdWVuY2VPYmoudHlwZTtcbiAgICAgICAgICAgIGlmIChvdXRwdXRTZXF1ZW5jZU9iai50eXBlICE9IHVuZGVmaW5lZElucHV0U2VxdWVuY2UgJiYgb3V0cHV0U2VxdWVuY2VPYmouRXJyb3IgIT0gdW5kZWZpbmVkSW5wdXRTZXF1ZW5jZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbnZhcyA9IHVpLmNhbnZhcygzMDAsIDE3MCk7XG4gICAgICAgICAgICAgICAgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW52ID0gdWkuY2FudmFzKCQod2luZG93KS53aWR0aCgpLCAkKHdpbmRvdykuaGVpZ2h0KCkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtb2wgPSBzZXF1ZW5jZVRvTW9sVjMwMDAoaW5wdXRTZXF1ZW5jZUZpZWxkLnZhbHVlLnJlcGxhY2UoL1xccy9nLCAnJyksIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBPQ0wuU3RydWN0dXJlVmlldy5kcmF3TW9sZWN1bGUoY2FudiwgT0NMLk1vbGVjdWxlLmZyb21Nb2xmaWxlKG1vbCksIHsgc3VwcHJlc3NDaGlyYWxUZXh0OiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgICAgICB1aS5kaWFsb2coJ01vbGVjdWxlOiAnICsgaW5wdXRTZXF1ZW5jZUZpZWxkLnZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChjYW52KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnNob3dNb2RhbCh0cnVlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAkKGNhbnZhcykub24oJ21vdXNlb3ZlcicsICgpID0+ICQoY2FudmFzKS5jc3MoJ2N1cnNvcicsICd6b29tLWluJykpO1xuICAgICAgICAgICAgICAgICQoY2FudmFzKS5vbignbW91c2VvdXQnLCAoKSA9PiAkKGNhbnZhcykuY3NzKCdjdXJzb3InLCAnZGVmYXVsdCcpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtb2wgPSBzZXF1ZW5jZVRvTW9sVjMwMDAoaW5wdXRTZXF1ZW5jZUZpZWxkLnZhbHVlLnJlcGxhY2UoL1xccy9nLCAnJyksIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgT0NMLlN0cnVjdHVyZVZpZXcuZHJhd01vbGVjdWxlKGNhbnZhcywgT0NMLk1vbGVjdWxlLmZyb21Nb2xmaWxlKG1vbCksIHsgc3VwcHJlc3NDaGlyYWxUZXh0OiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIG1vbGVjdWxlU3ZnRGl2LmFwcGVuZChjYW52YXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIG1vbGVjdWxlU3ZnRGl2LmlubmVySFRNTCA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgcGkuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBzZW1UeXBlT2ZJbnB1dFNlcXVlbmNlID0gdWkuZGl2VGV4dCgnJyk7XG4gICAgY29uc3QgbW9sZWN1bGVTdmdEaXYgPSB1aS5ibG9jayhbXSk7XG4gICAgY29uc3Qgb3V0cHV0VGFibGVEaXYgPSB1aS5kaXYoW10pO1xuICAgIGNvbnN0IGlucHV0U2VxdWVuY2VGaWVsZCA9IHVpLnRleHRJbnB1dCgnJywgZGVmYXVsdElucHV0LCAoc2VxdWVuY2UpID0+IHVwZGF0ZVRhYmxlQW5kTW9sZWN1bGUoc2VxdWVuY2UpKTtcbiAgICBjb25zdCBhc29EZiA9IERHLkRhdGFGcmFtZS5mcm9tT2JqZWN0cyhbXG4gICAgICAgIHsgJ05hbWUnOiAnMlxcJ01PRS01TWUtclUnLCAnQmlvU3ByaW5nJzogJzUnLCAnSmFuc3NlbiBHQ1JTJzogJ21vZVQnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnMlxcJ01PRS1yQScsICdCaW9TcHJpbmcnOiAnNicsICdKYW5zc2VuIEdDUlMnOiAnbW9lQScgfSxcbiAgICAgICAgeyAnTmFtZSc6ICcyXFwnTU9FLTVNZS1yQycsICdCaW9TcHJpbmcnOiAnNycsICdKYW5zc2VuIEdDUlMnOiAnbW9lNW1DJyB9LFxuICAgICAgICB7ICdOYW1lJzogJzJcXCdNT0UtckcnLCAnQmlvU3ByaW5nJzogJzgnLCAnSmFuc3NlbiBHQ1JTJzogJ21vZUcnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnNS1NZXRoeWwtZEMnLCAnQmlvU3ByaW5nJzogJzknLCAnSmFuc3NlbiBHQ1JTJzogJzVtQycgfSxcbiAgICAgICAgeyAnTmFtZSc6ICdwcyBsaW5rYWdlJywgJ0Jpb1NwcmluZyc6ICcqJywgJ0phbnNzZW4gR0NSUyc6ICdwcycgfSxcbiAgICAgICAgeyAnTmFtZSc6ICdkQScsICdCaW9TcHJpbmcnOiAnQScsICdKYW5zc2VuIEdDUlMnOiAnQSwgZEEnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnZEMnLCAnQmlvU3ByaW5nJzogJ0MnLCAnSmFuc3NlbiBHQ1JTJzogJ0MsIGRDJyB9LFxuICAgICAgICB7ICdOYW1lJzogJ2RHJywgJ0Jpb1NwcmluZyc6ICdHJywgJ0phbnNzZW4gR0NSUyc6ICdHLCBkRycgfSxcbiAgICAgICAgeyAnTmFtZSc6ICdkVCcsICdCaW9TcHJpbmcnOiAnVCcsICdKYW5zc2VuIEdDUlMnOiAnVCwgZFQnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnckEnLCAnQmlvU3ByaW5nJzogJycsICdKYW5zc2VuIEdDUlMnOiAnckEnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnckMnLCAnQmlvU3ByaW5nJzogJycsICdKYW5zc2VuIEdDUlMnOiAnckMnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnckcnLCAnQmlvU3ByaW5nJzogJycsICdKYW5zc2VuIEdDUlMnOiAnckcnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnclUnLCAnQmlvU3ByaW5nJzogJycsICdKYW5zc2VuIEdDUlMnOiAnclUnIH0sXG4gICAgXSk7XG4gICAgY29uc3QgYXNvR2FwbWVyc0dyaWQgPSBERy5WaWV3ZXIuZ3JpZChhc29EZiwgeyBzaG93Um93SGVhZGVyOiBmYWxzZSwgc2hvd0NlbGxUb29sdGlwOiBmYWxzZSB9KTtcbiAgICBhc29EZi5vbkN1cnJlbnRDZWxsQ2hhbmdlZC5zdWJzY3JpYmUoKF8pID0+IHtcbiAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoYXNvRGYuY3VycmVudENlbGwudmFsdWUpLnRoZW4oKCkgPT4gZ3Jvay5zaGVsbC5pbmZvKCdDb3BpZWQnKSk7XG4gICAgfSk7XG4gICAgY29uc3Qgb21lQW5kRmx1b3JvR3JpZCA9IERHLlZpZXdlci5ncmlkKERHLkRhdGFGcmFtZS5mcm9tT2JqZWN0cyhbXG4gICAgICAgIHsgJ05hbWUnOiAnMlxcJy1mbHVvcm8tVScsICdCaW9TcHJpbmcnOiAnMScsICdBeG9sYWJzJzogJ1VmJywgJ0phbnNzZW4gR0NSUyc6ICdmVScgfSxcbiAgICAgICAgeyAnTmFtZSc6ICcyXFwnLWZsdW9yby1BJywgJ0Jpb1NwcmluZyc6ICcyJywgJ0F4b2xhYnMnOiAnQWYnLCAnSmFuc3NlbiBHQ1JTJzogJ2ZBJyB9LFxuICAgICAgICB7ICdOYW1lJzogJzJcXCctZmx1b3JvLUMnLCAnQmlvU3ByaW5nJzogJzMnLCAnQXhvbGFicyc6ICdDZicsICdKYW5zc2VuIEdDUlMnOiAnZkMnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnMlxcJy1mbHVvcm8tRycsICdCaW9TcHJpbmcnOiAnNCcsICdBeG9sYWJzJzogJ0dmJywgJ0phbnNzZW4gR0NSUyc6ICdmRycgfSxcbiAgICAgICAgeyAnTmFtZSc6ICcyXFwnT01lLXJVJywgJ0Jpb1NwcmluZyc6ICc1JywgJ0F4b2xhYnMnOiAndScsICdKYW5zc2VuIEdDUlMnOiAnbVUnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnMlxcJ09NZS1yQScsICdCaW9TcHJpbmcnOiAnNicsICdBeG9sYWJzJzogJ2EnLCAnSmFuc3NlbiBHQ1JTJzogJ21BJyB9LFxuICAgICAgICB7ICdOYW1lJzogJzJcXCdPTWUtckMnLCAnQmlvU3ByaW5nJzogJzcnLCAnQXhvbGFicyc6ICdjJywgJ0phbnNzZW4gR0NSUyc6ICdtQycgfSxcbiAgICAgICAgeyAnTmFtZSc6ICcyXFwnT01lLXJHJywgJ0Jpb1NwcmluZyc6ICc4JywgJ0F4b2xhYnMnOiAnZycsICdKYW5zc2VuIEdDUlMnOiAnbUcnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAncHMgbGlua2FnZScsICdCaW9TcHJpbmcnOiAnKicsICdBeG9sYWJzJzogJ3MnLCAnSmFuc3NlbiBHQ1JTJzogJ3BzJyB9LFxuICAgIF0pLCB7IHNob3dSb3dIZWFkZXI6IGZhbHNlLCBzaG93Q2VsbFRvb2x0aXA6IGZhbHNlIH0pO1xuICAgIGNvbnN0IG92ZXJoYW5nTW9kaWZpY2F0aW9uc0dyaWQgPSBERy5WaWV3ZXIuZ3JpZChERy5EYXRhRnJhbWUuZnJvbU9iamVjdHMoW1xuICAgICAgICB7ICdOYW1lJzogJyhpbnZhYmFzaWMpJyB9LFxuICAgICAgICB7ICdOYW1lJzogJyhHYWxOQWMtMi1KTkopJyB9LFxuICAgIF0pLCB7IHNob3dSb3dIZWFkZXI6IGZhbHNlLCBzaG93Q2VsbFRvb2x0aXA6IGZhbHNlIH0pO1xuICAgIHVwZGF0ZVRhYmxlQW5kTW9sZWN1bGUoZGVmYXVsdElucHV0KTtcbiAgICBjb25zdCBhcHBNYWluRGVzY3JpcHRpb24gPSB1aS5pbmZvKFtcbiAgICAgICAgdWkuZGl2VGV4dCgnSG93IHRvIGNvbnZlcnQgb25lIHNlcXVlbmNlOicsIHsgc3R5bGU6IHsgJ2ZvbnQtd2VpZ2h0JzogJ2JvbGRlcicgfSB9KSxcbiAgICAgICAgdWkuZGl2VGV4dCgnUGFzdGUgc2VxdWVuY2UgaW50byB0aGUgdGV4dCBmaWVsZCBiZWxvdycpLFxuICAgICAgICB1aS5kaXZUZXh0KCdcXG4gSG93IHRvIGNvbnZlcnQgbWFueSBzZXF1ZW5jZXM6JywgeyBzdHlsZTogeyAnZm9udC13ZWlnaHQnOiAnYm9sZGVyJyB9IH0pLFxuICAgICAgICB1aS5kaXZUZXh0KCcxLiBEcmFnICYgZHJvcCBhbiBFeGNlbCBvciBDU1YgZmlsZSB3aXRoIHNlcXVlbmNlcyBpbnRvIERhdGFncm9rJyksXG4gICAgICAgIHVpLmRpdlRleHQoJzIuIFJpZ2h0LWNsaWNrIG9uIHRoZSBjb2x1bW4gaGVhZGVyLCB0aGVuIHNlZSB0aGUgXFwnQ29udmVydFxcJyBtZW51JyksXG4gICAgICAgIHVpLmRpdlRleHQoJ1RoaXMgd2lsbCBhZGQgdGhlIHJlc3VsdCBjb2x1bW4gdG8gdGhlIHJpZ2h0IG9mIHRoZSB0YWJsZScpLFxuICAgIF0sICdDb252ZXJ0IG9saWdvbnVjbGVvdGlkZSBzZXF1ZW5jZXMgYmV0d2VlbiBOdWNsZW90aWRlcywgQmlvU3ByaW5nLCBBeG9sYWJzLCBNZXJtYWRlIDEyIGFuZCBHQ1JTIHJlcHJlc2VudGF0aW9ucy4nKTtcbiAgICBjb25zdCBjb2Rlc1RhYmxlc0RpdiA9IHVpLnNwbGl0VihbXG4gICAgICAgIHVpLmJveCh1aS5oMignQVNPIEdhcG1lcnMnKSwgeyBzdHlsZTogeyBtYXhIZWlnaHQ6ICc0MHB4JyB9IH0pLFxuICAgICAgICBhc29HYXBtZXJzR3JpZC5yb290LFxuICAgICAgICB1aS5ib3godWkuaDIoJzJcXCctT01lIGFuZCAyXFwnLUYgc2lSTkEnKSwgeyBzdHlsZTogeyBtYXhIZWlnaHQ6ICc0MHB4JyB9IH0pLFxuICAgICAgICBvbWVBbmRGbHVvcm9HcmlkLnJvb3QsXG4gICAgICAgIHVpLmJveCh1aS5oMignT3ZlcmhhbmcgbW9kaWZpY2F0aW9ucycpLCB7IHN0eWxlOiB7IG1heEhlaWdodDogJzQwcHgnIH0gfSksXG4gICAgICAgIG92ZXJoYW5nTW9kaWZpY2F0aW9uc0dyaWQucm9vdCxcbiAgICBdLCB7IHN0eWxlOiB7IG1heFdpZHRoOiAnMzUwcHgnIH0gfSk7XG4gICAgY29uc3QgdGFiQ29udHJvbCA9IHVpLnRhYkNvbnRyb2woe1xuICAgICAgICAnTUFJTic6IHVpLmJveCh1aS5zcGxpdEgoW1xuICAgICAgICAgICAgdWkuc3BsaXRWKFtcbiAgICAgICAgICAgICAgICB1aS5wYW5lbChbXG4gICAgICAgICAgICAgICAgICAgIGFwcE1haW5EZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgdWkuZGl2KFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVpLmgxKCdJbnB1dCBzZXF1ZW5jZScpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdWkuZGl2KFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFNlcXVlbmNlRmllbGQucm9vdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sICdpbnB1dC1iYXNlJyksXG4gICAgICAgICAgICAgICAgICAgIF0sICdpbnB1dFNlcXVlbmNlJyksXG4gICAgICAgICAgICAgICAgICAgIHNlbVR5cGVPZklucHV0U2VxdWVuY2UsXG4gICAgICAgICAgICAgICAgICAgIHVpLmJsb2NrKFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVpLmgxKCdPdXRwdXQnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFRhYmxlRGl2LFxuICAgICAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICAgICAgICAgbW9sZWN1bGVTdmdEaXYsXG4gICAgICAgICAgICAgICAgXSwgJ3NlcXVlbmNlJyksXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIGNvZGVzVGFibGVzRGl2LFxuICAgICAgICBdLCB7IHN0eWxlOiB7IGhlaWdodDogJzEwMCUnLCB3aWR0aDogJzEwMCUnIH0gfSkpLFxuICAgICAgICAnQVhPTEFCUyc6IGRlZmluZUF4b2xhYnNQYXR0ZXJuKCksXG4gICAgICAgICdTREYnOiBzYXZlU2Vuc2VBbnRpU2Vuc2UoKSxcbiAgICB9KTtcbiAgICBjb25zdCB2ID0gZ3Jvay5zaGVsbC5uZXdWaWV3KCdTZXF1ZW5jZSBUcmFuc2xhdG9yJywgW3RhYkNvbnRyb2xdKTtcbiAgICB2LmJveCA9IHRydWU7XG4gICAgY29uc3Qgc3dpdGNoSW5wdXQgPSB1aS5zd2l0Y2hJbnB1dCgnQ29kZXMnLCB0cnVlLCAodikgPT4gKHYpID9cbiAgICAgICAgJChjb2Rlc1RhYmxlc0Rpdikuc2hvdygpIDpcbiAgICAgICAgJChjb2Rlc1RhYmxlc0RpdikuaGlkZSgpKTtcbiAgICBjb25zdCB0b3BQYW5lbCA9IFtcbiAgICAgICAgdWkuaWNvbkZBKCdkb3dubG9hZCcsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHNlcXVlbmNlVG9Nb2xWMzAwMChpbnB1dFNlcXVlbmNlRmllbGQudmFsdWUucmVwbGFjZSgvXFxzL2csICcnKSk7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCAnZGF0YTp0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLTgsJyArIGVuY29kZVVSSUNvbXBvbmVudChyZXN1bHQpKTtcbiAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsIGlucHV0U2VxdWVuY2VGaWVsZC52YWx1ZS5yZXBsYWNlKC9cXHMvZywgJycpICsgJy5tb2wnKTtcbiAgICAgICAgICAgIGVsZW1lbnQuY2xpY2soKTtcbiAgICAgICAgfSwgJ1NhdmUgLm1vbCBmaWxlJyksXG4gICAgICAgIHVpLmljb25GQSgnY29weScsICgpID0+IHtcbiAgICAgICAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHNlcXVlbmNlVG9TbWlsZXMoaW5wdXRTZXF1ZW5jZUZpZWxkLnZhbHVlLnJlcGxhY2UoL1xccy9nLCAnJykpKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IGdyb2suc2hlbGwuaW5mbyhzZXF1ZW5jZVdhc0NvcGllZCkpO1xuICAgICAgICB9LCAnQ29weSBTTUlMRVMnKSxcbiAgICAgICAgc3dpdGNoSW5wdXQucm9vdCxcbiAgICBdO1xuICAgIHRhYkNvbnRyb2wub25UYWJDaGFuZ2VkLnN1YnNjcmliZSgoXykgPT4gdi5zZXRSaWJib25QYW5lbHMoWyh0YWJDb250cm9sLmN1cnJlbnRQYW5lLm5hbWUgPT0gJ01BSU4nKSA/IHRvcFBhbmVsIDogW11dKSk7XG4gICAgdi5zZXRSaWJib25QYW5lbHMoW3RvcFBhbmVsXSk7XG59XG5mdW5jdGlvbiBzYXZlVGFibGVBc1NkRmlsZSh0YWJsZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGlmICghdGFibGUuY29sdW1ucy5jb250YWlucygnQ29tcG91bmQgTmFtZScpKSB7XG4gICAgICAgICAgICBncm9rLnNoZWxsLndhcm5pbmcoJ0ZpbGUgc2F2ZWQgd2l0aG91dCBjb2x1bW5zIFxcJycgK1xuICAgICAgICAgICAgICAgIFtDT0xfTkFNRVMuQ09NUE9VTkRfTkFNRSwgQ09MX05BTUVTLkNPTVBPVU5EX0NPTU1FTlRTLCBDT0xfTkFNRVMuQ1BEX01XLFxuICAgICAgICAgICAgICAgICAgICBDT0xfTkFNRVMuU0FMVF9NQVNTLCBDT0xfTkFNRVMuQkFUQ0hfTVddLmpvaW4oJ1xcJywgXFwnJykpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0cnVjdHVyZUNvbHVtbiA9IHRhYmxlLmNvbChDT0xfTkFNRVMuU0VRVUVOQ0UpO1xuICAgICAgICBjb25zdCB0eXBlQ29sdW1uID0gdGFibGUuY29sKENPTF9OQU1FUy5UWVBFKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhYmxlLnJvd0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSAodHlwZUNvbHVtbi5nZXQoaSkgPT0gJ1NTJykgP1xuICAgICAgICAgICAgICAgIHNlcXVlbmNlVG9Nb2xWMzAwMChzdHJ1Y3R1cmVDb2x1bW4uZ2V0KGkpLCBmYWxzZSwgdHJ1ZSkgKyAnXFxuJyArIGA+ICA8U2VxdWVuY2U+XFxuU2Vuc2UgU3RyYW5kXFxuXFxuYCA6XG4gICAgICAgICAgICAgICAgc2VxdWVuY2VUb01vbFYzMDAwKHN0cnVjdHVyZUNvbHVtbi5nZXQoaSksIHRydWUsIHRydWUpICsgJ1xcbicgKyBgPiAgPFNlcXVlbmNlPlxcbkFudGkgU2Vuc2VcXG5cXG5gO1xuICAgICAgICAgICAgZm9yIChjb25zdCBjb2wgb2YgdGFibGUuY29sdW1ucykge1xuICAgICAgICAgICAgICAgIGlmIChjb2wubmFtZSAhPSBDT0xfTkFNRVMuU0VRVUVOQ0UpXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBgPiAgPCR7Y29sLm5hbWV9PlxcbiR7Y29sLmdldChpKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0ICs9ICckJCQkXFxuXFxuJztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnaHJlZicsICdkYXRhOnRleHQvcGxhaW47Y2hhcnNldD11dGYtOCwnICsgZW5jb2RlVVJJQ29tcG9uZW50KHJlc3VsdCkpO1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnZG93bmxvYWQnLCB0YWJsZS5uYW1lICsgJy5zZGYnKTtcbiAgICAgICAgZWxlbWVudC5jbGljaygpO1xuICAgIH0pO1xufVxuY29uc3Qgd2VpZ2h0c09iaiA9IHt9O1xuZm9yIChjb25zdCBzeW50aGVzaXplciBvZiBPYmplY3Qua2V5cyhtYXApKSB7XG4gICAgZm9yIChjb25zdCB0ZWNobm9sb2d5IG9mIE9iamVjdC5rZXlzKG1hcFtzeW50aGVzaXplcl0pKSB7XG4gICAgICAgIGZvciAoY29uc3QgY29kZSBvZiBPYmplY3Qua2V5cyhtYXBbc3ludGhlc2l6ZXJdW3RlY2hub2xvZ3ldKSlcbiAgICAgICAgICAgIHdlaWdodHNPYmpbY29kZV0gPSBtYXBbc3ludGhlc2l6ZXJdW3RlY2hub2xvZ3ldW2NvZGVdLndlaWdodDtcbiAgICB9XG59XG5mb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhNT0RJRklDQVRJT05TKSlcbiAgICB3ZWlnaHRzT2JqW2tleV0gPSB2YWx1ZS5tb2xlY3VsYXJXZWlnaHQ7XG5mdW5jdGlvbiBzb3J0QnlTdHJpbmdMZW5ndGhJbkRlc2NlbmRpbmdPcmRlcihhcnJheSkge1xuICAgIHJldHVybiBhcnJheS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBiLmxlbmd0aCAtIGEubGVuZ3RoOyB9KTtcbn1cbmZ1bmN0aW9uIHN0cmluZ2lmeUl0ZW1zKGl0ZW1zKSB7XG4gICAgcmV0dXJuICdbXCInICsgaXRlbXMuam9pbignXCIsIFwiJykgKyAnXCJdJztcbn1cbmZ1bmN0aW9uIG1vbGVjdWxhcldlaWdodChzZXF1ZW5jZSwgd2VpZ2h0c09iaikge1xuICAgIGNvbnN0IGNvZGVzID0gc29ydEJ5U3RyaW5nTGVuZ3RoSW5EZXNjZW5kaW5nT3JkZXIoT2JqZWN0LmtleXMod2VpZ2h0c09iaikpLmNvbmNhdChPYmplY3Qua2V5cyhNT0RJRklDQVRJT05TKSk7XG4gICAgbGV0IHdlaWdodCA9IDA7XG4gICAgbGV0IGkgPSAwO1xuICAgIHdoaWxlIChpIDwgc2VxdWVuY2UubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoZWRDb2RlID0gY29kZXMuZmluZCgocykgPT4gcyA9PSBzZXF1ZW5jZS5zbGljZShpLCBpICsgcy5sZW5ndGgpKTtcbiAgICAgICAgd2VpZ2h0ICs9IHdlaWdodHNPYmpbc2VxdWVuY2Uuc2xpY2UoaSwgaSArIG1hdGNoZWRDb2RlLmxlbmd0aCldO1xuICAgICAgICBpICs9IG1hdGNoZWRDb2RlLmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIHdlaWdodCAtIDYxLjk3O1xufVxuLy90YWdzOiBhdXRvc3RhcnRcbmV4cG9ydCBmdW5jdGlvbiBhdXRvc3RhcnRPbGlnb1NkRmlsZVN1YnNjcmlwdGlvbigpIHtcbiAgICBncm9rLmV2ZW50cy5vblZpZXdBZGRlZC5zdWJzY3JpYmUoKHYpID0+IHtcbiAgICAgICAgaWYgKHYudHlwZSA9PSAnVGFibGVWaWV3JyAmJiB2LmRhdGFGcmFtZS5jb2x1bW5zLmNvbnRhaW5zKENPTF9OQU1FUy5UWVBFKSlcbiAgICAgICAgICAgIG9saWdvU2RGaWxlKHYuZGF0YUZyYW1lKTtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBvbGlnb1NkRmlsZSh0YWJsZSkge1xuICAgIGNvbnN0IHNhbHRzRGYgPSBERy5EYXRhRnJhbWUuZnJvbUNzdihTQUxUU19DU1YpO1xuICAgIGNvbnN0IHVzZXJzRGYgPSBERy5EYXRhRnJhbWUuZnJvbUNzdihVU0VSU19DU1YpO1xuICAgIGNvbnN0IHNvdXJjZXNEZiA9IERHLkRhdGFGcmFtZS5mcm9tQ3N2KFNPVVJDRVMpO1xuICAgIGNvbnN0IGljZHNEZiA9IERHLkRhdGFGcmFtZS5mcm9tQ3N2KElDRFMpO1xuICAgIGNvbnN0IGlkcHNEZiA9IERHLkRhdGFGcmFtZS5mcm9tQ3N2KElEUFMpO1xuICAgIGZ1bmN0aW9uIGFkZENvbHVtbnModCwgc2FsdHNEZikge1xuICAgICAgICBpZiAodC5jb2x1bW5zLmNvbnRhaW5zKENPTF9OQU1FUy5DT01QT1VORF9OQU1FKSlcbiAgICAgICAgICAgIHJldHVybiBncm9rLnNoZWxsLmVycm9yKCdDb2x1bW5zIGFscmVhZHkgZXhpc3QhJyk7XG4gICAgICAgIGNvbnN0IHNlcXVlbmNlID0gdC5jb2woQ09MX05BTUVTLlNFUVVFTkNFKTtcbiAgICAgICAgY29uc3Qgc2FsdCA9IHQuY29sKENPTF9OQU1FUy5TQUxUKTtcbiAgICAgICAgY29uc3QgZXF1aXZhbGVudHMgPSB0LmNvbChDT0xfTkFNRVMuRVFVSVZBTEVOVFMpO1xuICAgICAgICB0LmNvbHVtbnMuYWRkTmV3U3RyaW5nKENPTF9OQU1FUy5DT01QT1VORF9OQU1FKS5pbml0KChpKSA9PiBzZXF1ZW5jZS5nZXQoaSkpO1xuICAgICAgICB0LmNvbHVtbnMuYWRkTmV3U3RyaW5nKENPTF9OQU1FUy5DT01QT1VORF9DT01NRU5UUykuaW5pdCgoaSkgPT4gKGkgPiAwICYmIGkgJSAyID09IDApID9cbiAgICAgICAgICAgIHNlcXVlbmNlLmdldFN0cmluZyhpKSArICc7IGR1cGxleCBvZiBTUzogJyArIHNlcXVlbmNlLmdldFN0cmluZyhpIC0gMikgKyAnIGFuZCBBUzogJyArIHNlcXVlbmNlLmdldFN0cmluZyhpIC0gMSkgOlxuICAgICAgICAgICAgc2VxdWVuY2UuZ2V0U3RyaW5nKGkpKTtcbiAgICAgICAgY29uc3QgbW9sV2VpZ2h0Q29sID0gc2FsdHNEZi5jb2woJ01PTFdFSUdIVCcpO1xuICAgICAgICBjb25zdCBzYWx0TmFtZXNMaXN0ID0gc2FsdHNEZi5jb2woJ0RJU1BMQVknKS50b0xpc3QoKTtcbiAgICAgICAgdC5jb2x1bW5zLmFkZE5ld0Zsb2F0KENPTF9OQU1FUy5DUERfTVcpXG4gICAgICAgICAgICAuaW5pdCgoaSkgPT4gbW9sZWN1bGFyV2VpZ2h0KHNlcXVlbmNlLmdldChpKSwgd2VpZ2h0c09iaikpO1xuICAgICAgICB0LmNvbHVtbnMuYWRkTmV3RmxvYXQoQ09MX05BTUVTLlNBTFRfTUFTUykuaW5pdCgoaSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2FsdFJvd0luZGV4ID0gc2FsdE5hbWVzTGlzdC5pbmRleE9mKHNhbHQuZ2V0KGkpKTtcbiAgICAgICAgICAgIGNvbnN0IG13ID0gbW9sV2VpZ2h0Q29sLmdldChzYWx0Um93SW5kZXgpO1xuICAgICAgICAgICAgcmV0dXJuIG13ICogZXF1aXZhbGVudHMuZ2V0KGkpO1xuICAgICAgICB9KTtcbiAgICAgICAgdC5jb2x1bW5zLmFkZE5ld0NhbGN1bGF0ZWQoQ09MX05BTUVTLkJBVENIX01XLCAnJHsnICsgQ09MX05BTUVTLkNQRF9NVyArICd9ICsgJHsnICsgQ09MX05BTUVTLlNBTFRfTUFTUyArICd9JywgREcuQ09MVU1OX1RZUEUuRkxPQVQsIGZhbHNlKTtcbiAgICAgICAgYWRkQ29sdW1uc1ByZXNzZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gbmV3RGYgPSB0O1xuICAgIH1cbiAgICBsZXQgbmV3RGY7XG4gICAgbGV0IGFkZENvbHVtbnNQcmVzc2VkID0gZmFsc2U7XG4gICAgY29uc3QgZCA9IHVpLmRpdihbXG4gICAgICAgIHVpLmljb25zLmVkaXQoKCkgPT4ge1xuICAgICAgICAgICAgZC5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgICAgIGlmICh0YWJsZS5jb2woQ09MX05BTUVTLklEUCkudHlwZSAhPSBERy5DT0xVTU5fVFlQRS5TVFJJTkcpXG4gICAgICAgICAgICAgICAgdGFibGUuY2hhbmdlQ29sdW1uVHlwZShDT0xfTkFNRVMuSURQLCBERy5DT0xVTU5fVFlQRS5TVFJJTkcpO1xuICAgICAgICAgICAgZC5hcHBlbmQodWkubGluaygnQWRkIENvbHVtbnMnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYWRkQ29sdW1ucyh0YWJsZSwgc2FsdHNEZik7XG4gICAgICAgICAgICAgICAgZ3Jvay5zaGVsbC50YWJsZVZpZXcodGFibGUubmFtZSkuZ3JpZC5jb2x1bW5zLnNldE9yZGVyKE9iamVjdC52YWx1ZXMoQ09MX05BTUVTKSk7XG4gICAgICAgICAgICB9LCAnQWRkIGNvbHVtbnM6IFxcJycgKyBbQ09MX05BTUVTLkNPTVBPVU5EX05BTUUsIENPTF9OQU1FUy5DT01QT1VORF9DT01NRU5UUywgQ09MX05BTUVTLkNQRF9NVyxcbiAgICAgICAgICAgICAgICBDT0xfTkFNRVMuU0FMVF9NQVNTLCBDT0xfTkFNRVMuQkFUQ0hfTVddLmpvaW4oJ1xcJywgXFwnJyksICcnKSwgdWkuYnV0dG9uKCdTYXZlIFNEIGZpbGUnLCAoKSA9PiBzYXZlVGFibGVBc1NkRmlsZShhZGRDb2x1bW5zUHJlc3NlZCA/IG5ld0RmIDogdGFibGUpKSk7XG4gICAgICAgICAgICBjb25zdCB2aWV3ID0gZ3Jvay5zaGVsbC5nZXRUYWJsZVZpZXcodGFibGUubmFtZSk7XG4gICAgICAgICAgICB2aWV3LnRhYmxlLmNvbChDT0xfTkFNRVMuVFlQRSkuc2V0VGFnKERHLlRBR1MuQ0hPSUNFUywgJ1tcIkFTXCIsIFwiU1NcIiwgXCJEdXBsZXhcIl0nKTtcbiAgICAgICAgICAgIHZpZXcudGFibGUuY29sKENPTF9OQU1FUy5PV05FUikuc2V0VGFnKERHLlRBR1MuQ0hPSUNFUywgc3RyaW5naWZ5SXRlbXModXNlcnNEZi5jb2x1bW5zLmJ5SW5kZXgoMCkudG9MaXN0KCkpKTtcbiAgICAgICAgICAgIHZpZXcudGFibGUuY29sKENPTF9OQU1FUy5TQUxUKS5zZXRUYWcoREcuVEFHUy5DSE9JQ0VTLCBzdHJpbmdpZnlJdGVtcyhzYWx0c0RmLmNvbHVtbnMuYnlJbmRleCgwKS50b0xpc3QoKSkpO1xuICAgICAgICAgICAgdmlldy50YWJsZS5jb2woQ09MX05BTUVTLlNPVVJDRSkuc2V0VGFnKERHLlRBR1MuQ0hPSUNFUywgc3RyaW5naWZ5SXRlbXMoc291cmNlc0RmLmNvbHVtbnMuYnlJbmRleCgwKS50b0xpc3QoKSkpO1xuICAgICAgICAgICAgdmlldy50YWJsZS5jb2woQ09MX05BTUVTLklDRCkuc2V0VGFnKERHLlRBR1MuQ0hPSUNFUywgc3RyaW5naWZ5SXRlbXMoaWNkc0RmLmNvbHVtbnMuYnlJbmRleCgwKS50b0xpc3QoKSkpO1xuICAgICAgICAgICAgdmlldy50YWJsZS5jb2woQ09MX05BTUVTLklEUCkuc2V0VGFnKERHLlRBR1MuQ0hPSUNFUywgc3RyaW5naWZ5SXRlbXMoaWRwc0RmLmNvbHVtbnMuYnlJbmRleCgwKS50b0xpc3QoKSkpO1xuICAgICAgICAgICAgZ3Jvay5ldmVudHMub25Db250ZXh0TWVudS5zdWJzY3JpYmUoKGFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoW0NPTF9OQU1FUy5UWVBFLCBDT0xfTkFNRVMuT1dORVIsIENPTF9OQU1FUy5TQUxULCBDT0xfTkFNRVMuU09VUkNFLCBDT0xfTkFNRVMuSUNELCBDT0xfTkFNRVMuSURQXVxuICAgICAgICAgICAgICAgICAgICAuaW5jbHVkZXMoYXJncy5hcmdzLmNvbnRleHQudGFibGUuY3VycmVudENvbC5uYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBhcmdzLmFyZ3MubWVudS5pdGVtKCdGaWxsIENvbHVtbiBXaXRoIFZhbHVlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdiA9IGFyZ3MuYXJncy5jb250ZXh0LnRhYmxlLmN1cnJlbnRDZWxsLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5hcmdzLmNvbnRleHQudGFibGUuY3VycmVudENlbGwuY29sdW1uLmluaXQodik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KSxcbiAgICBdKTtcbiAgICBncm9rLnNoZWxsLnYuc2V0UmliYm9uUGFuZWxzKFtbZF1dKTtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==
|
|
5224
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQ0FBa0MsT0FBTztBQUN6QztBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7O0FBRUEsMkJBQTJCOztBQUUzQjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxzQkFBc0I7QUFDdEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxnQkFBZ0I7O0FBRWhCO0FBQ0E7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsQ0FBQyxHQUFHO0FBQ0o7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELDhFQUE4RTs7QUFFOUU7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDLEVBQUU7QUFDRjtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSx3RkFBd0Y7O0FBRXhGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4QkFBOEI7QUFDOUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7O0FBRXZDOztBQUVBLHdDQUF3QztBQUN4Qzs7QUFFQTtBQUNBLEdBQUc7QUFDSCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxHQUFHO0FBQ0g7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVB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QUFDQSxhQUFhO0FBQ2I7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQ0FBMEM7QUFDMUM7QUFDQSxnREFBZ0Q7QUFDaEQsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0EsK0NBQStDO0FBQy9DLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQzViTTtBQUNQO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNGTztBQUNQO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNGQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2xHQSxpQkFBaUIsU0FBSSxJQUFJLFNBQUk7QUFDN0IsNEJBQTRCLCtEQUErRCxpQkFBaUI7QUFDNUc7QUFDQSxvQ0FBb0MsTUFBTSwrQkFBK0IsWUFBWTtBQUNyRixtQ0FBbUMsTUFBTSxtQ0FBbUMsWUFBWTtBQUN4RixnQ0FBZ0M7QUFDaEM7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUMwQztBQUNKO0FBQ0E7QUFDdEM7QUFDdUM7QUFDZDtBQUNpQztBQUNoQjtBQUMxQyxnQ0FBZ0MsbURBQVU7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsbURBQVU7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsaUVBQXVCO0FBQzVDO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQix3QkFBd0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHdCQUF3QjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLHVFQUFvQztBQUNsRSx1QkFBdUIsbURBQVU7QUFDakM7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQiwwREFBZ0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsMERBQWdCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isb0JBQW9CO0FBQzVDLCtCQUErQixzREFBWTtBQUMzQztBQUNBO0FBQ0EsYUFBYTtBQUNiLHlCQUF5Qix3REFBYztBQUN2QztBQUNBO0FBQ0EsdURBQXVELHNEQUFZO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSx1Q0FBdUMsaURBQU87QUFDOUMsZ0JBQWdCLGdEQUFNLEVBQUUsa0RBQVEsMkVBQTJFLFNBQVMsaUJBQWlCO0FBQ3JJLGdCQUFnQixvREFBVTtBQUMxQixnQkFBZ0IsZ0RBQU07QUFDdEIsaUJBQWlCLFNBQVMsd0JBQXdCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLG9CQUFvQjtBQUM1QywrQkFBK0Isc0RBQVk7QUFDM0M7QUFDQTtBQUNBLGFBQWE7QUFDYix5QkFBeUIsd0RBQWM7QUFDdkM7QUFDQTtBQUNBLHVEQUF1RCxzREFBWTtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsdUNBQXVDLGlEQUFPO0FBQzlDLGdCQUFnQixnREFBTSxFQUFFLGtEQUFRLDJFQUEyRSxTQUFTLGlCQUFpQjtBQUNySSxnQkFBZ0Isb0RBQVU7QUFDMUIsZ0JBQWdCLGdEQUFNO0FBQ3RCLGlCQUFpQixTQUFTLHdCQUF3QjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLG1EQUFTO0FBQ3JCLHFCQUFxQixvREFBVTtBQUMvQjtBQUNBLHFCQUFxQixvREFBVTtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QiwwQkFBMEI7QUFDbEQ7QUFDQSx3QkFBd0IsMEJBQTBCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLG9CQUFvQjtBQUM1QztBQUNBLHdCQUF3QixvQkFBb0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsaURBQU87QUFDN0IsWUFBWSx1RUFBa0I7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGtCQUFrQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLDRFQUFrQztBQUN6RCxrQkFBa0IsdUVBQTZCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsMkJBQTJCO0FBQzNELGlDQUFpQyx3REFBYztBQUMvQztBQUNBLGdDQUFnQywyQkFBMkI7QUFDM0QsaUNBQWlDLHdEQUFjO0FBQy9DO0FBQ0E7QUFDQSxnQ0FBZ0MsaUNBQWlDO0FBQ2pFLHVDQUF1QyxzREFBWTtBQUNuRDtBQUNBO0FBQ0EsZ0NBQWdDLGlDQUFpQztBQUNqRSx1Q0FBdUMsc0RBQVk7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsZ0JBQWdCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixtREFBUztBQUNwQyxZQUFZLCtDQUFDO0FBQ2I7QUFDQSxxQkFBcUIsb0RBQVU7QUFDL0IscUJBQXFCLG9EQUFVO0FBQy9CO0FBQ0E7QUFDQSxnQkFBZ0IseURBQWU7QUFDL0I7QUFDQSxnQkFBZ0Isc0RBQVksR0FBRyxpRUFBdUI7QUFDdEQsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixpRUFBdUI7QUFDaEQ7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQiw2RUFBbUM7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxxQkFBcUIseURBQWU7QUFDakQsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFlBQVksdUVBQTZCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0Msd0RBQWM7QUFDaEQsOENBQThDLHdEQUFjO0FBQzVEO0FBQ0Esa0NBQWtDLHdEQUFjO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLGdEQUFNO0FBQ2xELHdCQUF3QixtREFBUyxDQUFDLG1EQUFTLHVCQUF1QjtBQUNsRTtBQUNBLGdDQUFnQyw0REFBa0I7QUFDbEQ7QUFDQSxnQ0FBZ0MsNERBQWtCO0FBQ2xEO0FBQ0Esc0NBQXNDLDBFQUFnQztBQUN0RSxnREFBZ0QseURBQWU7QUFDL0Q7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxnREFBTTtBQUM5QyxvQkFBb0IsbURBQVMsQ0FBQyxtREFBUyx1QkFBdUI7QUFDOUQ7QUFDQSw0QkFBNEIsNERBQWtCO0FBQzlDO0FBQ0EsNEJBQTRCLDREQUFrQjtBQUM5QztBQUNBLGtDQUFrQywwRUFBZ0M7QUFDbEUsNENBQTRDLHlEQUFlO0FBQzNEO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQix1RUFBNkI7QUFDL0M7QUFDQTtBQUNBLG1DQUFtQyxtREFBUztBQUM1QyxvQkFBb0IsK0NBQUM7QUFDckI7QUFDQSw2QkFBNkIsb0RBQVU7QUFDdkMsNkJBQTZCLG9EQUFVO0FBQ3ZDO0FBQ0EsOEJBQThCLDBFQUFnQztBQUM5RDtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsU0FBUztBQUNUO0FBQ0EsNkJBQTZCLGdEQUFNO0FBQ25DLDZCQUE2QixnREFBTTtBQUNuQyw2QkFBNkIsZ0RBQU07QUFDbkMsZ0NBQWdDLGdEQUFNO0FBQ3RDLGdDQUFnQyxnREFBTTtBQUN0QyxtQkFBbUIsZ0RBQU07QUFDekIseUJBQXlCLGdEQUFNO0FBQy9CLGtDQUFrQyxnREFBTTtBQUN4QywyQkFBMkIsZ0RBQU07QUFDakMsOEJBQThCLGdEQUFNO0FBQ3BDLDBCQUEwQixnREFBTTtBQUNoQyx3Q0FBd0MsaURBQU8sRUFBRSxzREFBWTtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULG9EQUFvRCx3REFBYztBQUNsRSxvREFBb0Qsd0RBQWM7QUFDbEUsMERBQTBELHNEQUFZO0FBQ3RFLDBEQUEwRCxzREFBWTtBQUN0RSxxQkFBcUIscURBQVc7QUFDaEMscUJBQXFCLHFEQUFXO0FBQ2hDLHdCQUF3QixnREFBTTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IscURBQVc7QUFDbkMsWUFBWSwwREFBZ0I7QUFDNUI7QUFDQTtBQUNBLFlBQVksbURBQVM7QUFDckIscUJBQXFCLG9EQUFVO0FBQy9CO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixzREFBWSxHQUFHLGlFQUF1QjtBQUN0RCxnQkFBZ0IseURBQWU7QUFDL0IsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQix1REFBYSxXQUFXLDhEQUFvQixFQUFFLDJEQUFpQjtBQUNsRiw4QkFBOEIsd0RBQWM7QUFDNUM7QUFDQTtBQUNBLDhCQUE4Qix3REFBYztBQUM1QztBQUNBO0FBQ0EsOEJBQThCLHdEQUFjO0FBQzVDO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsMEJBQTBCLHdEQUFjO0FBQ3hDO0FBQ0EsMEJBQTBCLHdEQUFjO0FBQ3hDO0FBQ0EsMEJBQTBCLHdEQUFjO0FBQ3hDO0FBQ0E7QUFDQSx5QkFBeUIsd0RBQWM7QUFDdkM7QUFDQTtBQUNBLEtBQUs7QUFDTCxxQkFBcUIsc0RBQVk7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsdUJBQXVCLHNEQUFZO0FBQ25DLHVCQUF1QixzREFBWTtBQUNuQztBQUNBLDJCQUEyQixzREFBWTtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxtQkFBbUIsc0RBQVk7QUFDL0I7QUFDQSxnQ0FBZ0Msd0RBQWM7QUFDOUM7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLCtCQUErQix3REFBYztBQUM3QztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsZ0NBQWdDLHdEQUFjO0FBQzlDO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSwrQkFBK0Isd0RBQWM7QUFDN0M7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isc0RBQVk7QUFDaEMsOEJBQThCLG1EQUFTO0FBQ3ZDO0FBQ0Esc0NBQXNDLHlEQUFlO0FBQ3JEO0FBQ0EseUJBQXlCLHdEQUFjO0FBQ3ZDLFlBQVksbURBQVM7QUFDckI7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLHlEQUFlO0FBQ3pELGFBQWE7QUFDYjtBQUNBO0FBQ0EsS0FBSztBQUNMLGtDQUFrQyxtREFBUztBQUMzQztBQUNBLFlBQVkseURBQWU7QUFDM0I7QUFDQSwyQkFBMkIsbURBQVM7QUFDcEMsWUFBWSwrQ0FBQztBQUNiO0FBQ0EscUJBQXFCLG9EQUFVO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksc0RBQVksR0FBRyxpRUFBdUI7QUFDbEQsWUFBWSx5REFBZTtBQUMzQjtBQUNBO0FBQ0EsS0FBSztBQUNMLDJCQUEyQixzREFBWTtBQUN2QztBQUNBLEtBQUs7QUFDTCw0QkFBNEIsc0RBQVk7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLGdEQUFNO0FBQ3RDLFFBQVEsbURBQVMsQ0FBQyxtREFBUyxrQkFBa0I7QUFDN0MsNEVBQTRFLHlEQUFlO0FBQzNGLFNBQVM7QUFDVDtBQUNBLDJCQUEyQixzREFBWTtBQUN2QztBQUNBLEtBQUs7QUFDTCw0QkFBNEIsc0RBQVk7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLGdEQUFNO0FBQ3RDLFFBQVEsbURBQVMsQ0FBQyxtREFBUyxrQkFBa0I7QUFDN0MsNEVBQTRFLHlEQUFlO0FBQzNGLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixnREFBTTtBQUNqQyxRQUFRLCtDQUFLO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsZ0RBQU07QUFDaEMsUUFBUSwrQ0FBSztBQUNiLFFBQVEsaURBQU87QUFDZjtBQUNBO0FBQ0E7QUFDQSxRQUFRLGlEQUFPO0FBQ2Y7QUFDQTtBQUNBO0FBQ0EsUUFBUSx5REFBZTtBQUN2QjtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isa0RBQVE7QUFDaEMsUUFBUSxrREFBUTtBQUNoQjtBQUNBLGFBQWEsU0FBUyx1QkFBdUI7QUFDN0MsUUFBUSxtREFBUyxtQkFBbUIseURBQWdCO0FBQ3BEO0FBQ0EsUUFBUSxnREFBTTtBQUNkLFlBQVksZ0RBQU07QUFDbEIsZ0JBQWdCLGlEQUFPO0FBQ3ZCLG9CQUFvQiwrQ0FBSztBQUN6QixvQkFBb0IsZ0RBQU07QUFDMUIsd0JBQXdCLG1EQUFTO0FBQ2pDO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekIseUJBQXlCLFNBQVMsa0JBQWtCO0FBQ3BEO0FBQ0EsZ0JBQWdCLGlEQUFPO0FBQ3ZCLG9CQUFvQixnREFBTTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IseURBQWU7QUFDdkM7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGdEQUFNO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsU0FBUyxvQkFBb0I7QUFDMUM7QUFDQSxrQ0FBa0Msa0RBQVE7QUFDMUMsUUFBUSwrQ0FBSztBQUNiLFFBQVEsaURBQU87QUFDZixZQUFZLGdEQUFNLEVBQUUsb0RBQVUsVUFBVSxTQUFTLGlCQUFpQjtBQUNsRSxZQUFZLG9EQUFVLEVBQUUsb0RBQVU7QUFDbEMsWUFBWSxnREFBTSxFQUFFLG9EQUFVLFlBQVksU0FBUyx1QkFBdUI7QUFDMUU7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLGtEQUFRO0FBQzFDLFFBQVEsK0NBQUs7QUFDYixRQUFRLGlEQUFPO0FBQ2YsWUFBWSxnREFBTSxFQUFFLG9EQUFVLFVBQVUsU0FBUyxpQkFBaUI7QUFDbEUsWUFBWSxvREFBVSxFQUFFLG9EQUFVO0FBQ2xDLFlBQVksZ0RBQU0sRUFBRSxvREFBVSxZQUFZLFNBQVMsdUJBQXVCO0FBQzFFO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixpREFBTztBQUN4QixRQUFRLG9EQUFVLG9DQUFvQyxTQUFTLDJCQUEyQjtBQUMxRixRQUFRLG9EQUFVO0FBQ2xCLFFBQVEsb0RBQVU7QUFDbEIsUUFBUSxvREFBVTtBQUNsQixRQUFRLG9EQUFVO0FBQ2xCLFFBQVEsb0RBQVU7QUFDbEIsUUFBUSxvREFBVTtBQUNsQjtBQUNBLFdBQVcsbURBQVM7QUFDcEIsUUFBUSxnREFBTTtBQUNkO0FBQ0E7QUFDQTtBQUNBLFFBQVEsZ0RBQU0sQ0FBQyxpREFBTztBQUN0QjtBQUNBO0FBQ0EsY0FBYyxTQUFTLHFCQUFxQjtBQUM1QztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3ZzQjBDO0FBQzFDO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQSxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0EsdURBQXVEO0FBQ3ZEO0FBQ0Esb0JBQW9CLHlCQUF5QjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxtREFBVTtBQUNyQjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLG9CQUFvQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxRQUFRO0FBQzdDO0FBQ0E7QUFDQTtBQUNBLGlMQUFpTCxtREFBVTtBQUMzTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixvQkFBb0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxRQUFRO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBLGdKQUFnSixtREFBVTtBQUMxSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isd0JBQXdCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUN2TE87QUFDUDs7Ozs7Ozs7Ozs7Ozs7OztBQ0RPO0FBQ1A7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDRkE7QUFDQSw2QkFBNkI7QUFDN0IseUJBQXlCO0FBQ2xCO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCLHlCQUF5QjtBQUNsQjtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0IseUJBQXlCO0FBQ2xCO0FBQ1Asa0JBQWtCO0FBQ2xCO0FBQ0EsZ0dBQWdHLGdCQUFnQjtBQUNoSDtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCLHlCQUF5QjtBQUNsQjtBQUNQO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCLHlCQUF5QjtBQUNsQjtBQUNQLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0EsMkhBQTJILGdCQUFnQjtBQUMzSTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCLHlCQUF5QjtBQUNsQjtBQUNQLGtCQUFrQjtBQUNsQjtBQUNBLGlHQUFpRyxnQkFBZ0I7QUFDakg7QUFDQTtBQUNBLDZCQUE2QjtBQUM3Qix5QkFBeUI7QUFDbEI7QUFDUCxrQkFBa0I7QUFDbEI7QUFDQSxzR0FBc0csZ0JBQWdCO0FBQ3RIO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0IseUJBQXlCO0FBQ2xCO0FBQ1Asa0JBQWtCO0FBQ2xCO0FBQ0Esc0dBQXNHLGdCQUFnQjtBQUN0SDtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCLHlCQUF5QjtBQUNsQjtBQUNQLGtCQUFrQjtBQUNsQjtBQUNBLHNHQUFzRyxnQkFBZ0I7QUFDdEg7QUFDQTtBQUNBLDZCQUE2QjtBQUM3Qix5QkFBeUI7QUFDbEI7QUFDUCxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBLHlHQUF5RyxnQkFBZ0I7QUFDekg7QUFDQTtBQUNBLDZCQUE2QjtBQUM3Qix5QkFBeUI7QUFDbEI7QUFDUCxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBLHlHQUF5RyxnQkFBZ0I7QUFDekg7QUFDQTtBQUNBLDZCQUE2QjtBQUM3Qix5QkFBeUI7QUFDbEI7QUFDUCxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBLHlHQUF5RyxnQkFBZ0I7QUFDekg7QUFDQTtBQUNBLDZCQUE2QjtBQUM3Qix5QkFBeUI7QUFDbEI7QUFDUCxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBLDhHQUE4RyxnQkFBZ0I7QUFDOUg7QUFDQTtBQUNBLDZCQUE2QjtBQUM3Qix5QkFBeUI7QUFDbEI7QUFDUCxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBLDhHQUE4RyxnQkFBZ0I7QUFDOUg7QUFDQTtBQUNBLDZCQUE2QjtBQUM3Qix5QkFBeUI7QUFDbEI7QUFDUCxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBLDhHQUE4RyxnQkFBZ0I7QUFDOUg7QUFDQTtBQUNBLDZCQUE2QjtBQUM3Qix5QkFBeUI7QUFDbEI7QUFDUDtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBLCtCQUErQjtBQUMvQjtBQUNBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0IseUJBQXlCO0FBQ2xCO0FBQ1A7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCLHlCQUF5QjtBQUNsQjtBQUNQO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0IseUJBQXlCO0FBQ2xCO0FBQ1A7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLDZCQUE2QjtBQUM3Qix5QkFBeUI7QUFDbEI7QUFDUCxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0EsbUpBQW1KLGdCQUFnQjtBQUNuSztBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCLHlCQUF5QjtBQUNsQjtBQUNQLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQSxtSkFBbUosZ0JBQWdCO0FBQ25LOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3hRbUc7QUFDMUM7QUFDQztBQUNuRDtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLCtDQUFhO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixzQkFBc0I7QUFDMUM7QUFDQTtBQUNBLGdCQUFnQiwrQ0FBYSx1QkFBdUIsK0NBQWE7QUFDakUsNkJBQTZCLDREQUEwQjtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLDREQUEwQjtBQUMzRDtBQUNBO0FBQ0E7QUFDQSxXQUFXLHVFQUFpQjtBQUM1QjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsK0NBQWE7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHNCQUFzQjtBQUMxQztBQUNBO0FBQ0EsZ0JBQWdCLCtDQUFhLHVCQUF1Qiw0REFBMEI7QUFDOUUsZ0JBQWdCLCtDQUFhLHNCQUFzQiw0REFBMEI7QUFDN0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsNERBQTBCO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxtRUFBaUM7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMscUNBQUc7QUFDakQsaURBQWlELHFDQUFHO0FBQ3BELCtDQUErQyxxQ0FBRztBQUNsRCxnQ0FBZ0MscUNBQUc7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMscUNBQUc7QUFDaEQsMkNBQTJDLHFDQUFHO0FBQzlDLDRCQUE0QixxQ0FBRztBQUMvQjtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsc0VBQWU7QUFDbEMsb0NBQW9DLHlEQUF1QjtBQUMzRCxtQkFBbUIscUNBQUcsQ0FBQyx5REFBdUIsRUFBRSxxREFBbUI7QUFDbkUseUNBQXlDLHNEQUFvQjtBQUM3RCxtQkFBbUIscUNBQUcsQ0FBQyxzREFBb0IsRUFBRSxxREFBbUI7QUFDaEU7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLDZCQUE2QjtBQUNyRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdEdPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDTztBQUNBO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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RUFBYSxFQUFFLCtEQUFxQjtBQUMzRSxxQkFBcUIsaURBQU87QUFDNUI7QUFDQSxnQkFBZ0IsOERBQW9CLGlEQUFpRCw0REFBUztBQUM5RixhQUFhLHVCQUF1QiwwRUFBdUIsRUFBRSw4RUFBMkIsRUFBRSxtRUFBZ0I7QUFDMUcsZ0JBQWdCLHNFQUFtQixFQUFFLHFFQUFrQix1QkFBdUIsbURBQVM7QUFDdkYseUJBQXlCLGlFQUF1QjtBQUNoRCwyQkFBMkIsaUVBQWMsU0FBUyx5REFBZTtBQUNqRSwyQkFBMkIsa0VBQWUsU0FBUyx5REFBZTtBQUNsRSwyQkFBMkIsaUVBQWMsU0FBUyx5REFBZTtBQUNqRSwyQkFBMkIsbUVBQWdCLFNBQVMseURBQWU7QUFDbkUsMkJBQTJCLGdFQUFhLFNBQVMseURBQWU7QUFDaEUsMkJBQTJCLGdFQUFhLFNBQVMseURBQWU7QUFDaEUsWUFBWSw2RUFBbUM7QUFDL0MscUJBQXFCLGlFQUFjLEVBQUUsa0VBQWUsRUFBRSxpRUFBYyxFQUFFLG1FQUFnQixFQUFFLGdFQUFhLEVBQUUsZ0VBQWE7QUFDcEg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0EsSUFBSSxzRUFBNEI7QUFDaEMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9ub2RlX21vZHVsZXMvY2FzaC1kb20vZGlzdC9jYXNoLmpzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL25vZGVfbW9kdWxlcy9zYXZlLXN2Zy1hcy1wbmcvbGliL3NhdmVTdmdBc1BuZy5qcyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9zcmMvSUNEcy50cyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9zcmMvSURQcy50cyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9zcmMvYXhvbGFic01hcC50cyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9zcmMvZGVmaW5lQXhvbGFic1BhdHRlcm4udHMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL2RyYXdBeG9sYWJzUGF0dGVybi50cyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9zcmMvc2FsdHMudHMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL3NvdXJjZXMudHMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL3N0cnVjdHVyZXMtd29ya3MvY29udmVydGVycy50cyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9zcmMvc3RydWN0dXJlcy13b3Jrcy9mcm9tLW1vbm9tZXJzLnRzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL3NyYy9zdHJ1Y3R1cmVzLXdvcmtzL21hcC50cyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9zcmMvc3RydWN0dXJlcy13b3Jrcy9tb2wtdHJhbnNmb3JtYXRpb25zLnRzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL3NyYy9zdHJ1Y3R1cmVzLXdvcmtzL3NhdmUtc2Vuc2UtYW50aXNlbnNlLnRzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL3NyYy9zdHJ1Y3R1cmVzLXdvcmtzL3NlcXVlbmNlLWNvZGVzLXRvb2xzLnRzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL3NyYy91c2Vycy50cyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvZXh0ZXJuYWwgdmFyIFwiREdcIiIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvZXh0ZXJuYWwgdmFyIFwiT0NMXCIiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yL2V4dGVybmFsIHZhciBcImdyb2tcIiIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvZXh0ZXJuYWwgdmFyIFwidWlcIiIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3Ivd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL3BhY2thZ2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogTUlUIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWJpb3NwYW1waW5hdG8vY2FzaCAqL1xuKGZ1bmN0aW9uKCl7XG5cInVzZSBzdHJpY3RcIjtcblxudmFyIHByb3BNYXAgPSB7XG4gIC8qIEdFTkVSQUwgKi9cbiAgXCJjbGFzc1wiOiAnY2xhc3NOYW1lJyxcbiAgY29udGVudGVkaXRhYmxlOiAnY29udGVudEVkaXRhYmxlJyxcblxuICAvKiBMQUJFTCAqL1xuICBcImZvclwiOiAnaHRtbEZvcicsXG5cbiAgLyogSU5QVVQgKi9cbiAgcmVhZG9ubHk6ICdyZWFkT25seScsXG4gIG1heGxlbmd0aDogJ21heExlbmd0aCcsXG4gIHRhYmluZGV4OiAndGFiSW5kZXgnLFxuXG4gIC8qIFRBQkxFICovXG4gIGNvbHNwYW46ICdjb2xTcGFuJyxcbiAgcm93c3BhbjogJ3Jvd1NwYW4nLFxuXG4gIC8qIElNQUdFICovXG4gIHVzZW1hcDogJ3VzZU1hcCdcbn07XG5cbmZ1bmN0aW9uIGF0dGVtcHQoZm4sIGFyZykge1xuICB0cnkge1xuICAgIHJldHVybiBmbihhcmcpO1xuICB9IGNhdGNoIChfYSkge1xuICAgIHJldHVybiBhcmc7XG4gIH1cbn1cblxudmFyIGRvYyA9IGRvY3VtZW50LFxuICAgIHdpbiA9IHdpbmRvdyxcbiAgICBkb2NFbGUgPSBkb2MuZG9jdW1lbnRFbGVtZW50LFxuICAgIGNyZWF0ZUVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudC5iaW5kKGRvYyksXG4gICAgZGl2ID0gY3JlYXRlRWxlbWVudCgnZGl2JyksXG4gICAgdGFibGUgPSBjcmVhdGVFbGVtZW50KCd0YWJsZScpLFxuICAgIHRib2R5ID0gY3JlYXRlRWxlbWVudCgndGJvZHknKSxcbiAgICB0ciA9IGNyZWF0ZUVsZW1lbnQoJ3RyJyksXG4gICAgaXNBcnJheSA9IEFycmF5LmlzQXJyYXksXG4gICAgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGUsXG4gICAgY29uY2F0ID0gQXJyYXlQcm90b3R5cGUuY29uY2F0LFxuICAgIGZpbHRlciA9IEFycmF5UHJvdG90eXBlLmZpbHRlcixcbiAgICBpbmRleE9mID0gQXJyYXlQcm90b3R5cGUuaW5kZXhPZixcbiAgICBtYXAgPSBBcnJheVByb3RvdHlwZS5tYXAsXG4gICAgcHVzaCA9IEFycmF5UHJvdG90eXBlLnB1c2gsXG4gICAgc2xpY2UgPSBBcnJheVByb3RvdHlwZS5zbGljZSxcbiAgICBzb21lID0gQXJyYXlQcm90b3R5cGUuc29tZSxcbiAgICBzcGxpY2UgPSBBcnJheVByb3RvdHlwZS5zcGxpY2U7XG52YXIgaWRSZSA9IC9eIyg/OltcXHctXXxcXFxcLnxbXlxceDAwLVxceGEwXSkqJC8sXG4gICAgY2xhc3NSZSA9IC9eXFwuKD86W1xcdy1dfFxcXFwufFteXFx4MDAtXFx4YTBdKSokLyxcbiAgICBodG1sUmUgPSAvPC4rPi8sXG4gICAgdGFnUmUgPSAvXlxcdyskLzsgLy8gQHJlcXVpcmUgLi92YXJpYWJsZXMudHNcblxuZnVuY3Rpb24gZmluZChzZWxlY3RvciwgY29udGV4dCkge1xuICByZXR1cm4gIXNlbGVjdG9yIHx8ICFpc0RvY3VtZW50KGNvbnRleHQpICYmICFpc0VsZW1lbnQoY29udGV4dCkgPyBbXSA6IGNsYXNzUmUudGVzdChzZWxlY3RvcikgPyBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoc2VsZWN0b3Iuc2xpY2UoMSkpIDogdGFnUmUudGVzdChzZWxlY3RvcikgPyBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKHNlbGVjdG9yKSA6IGNvbnRleHQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG59IC8vIEByZXF1aXJlIC4vZmluZC50c1xuLy8gQHJlcXVpcmUgLi92YXJpYWJsZXMudHNcblxuXG52YXIgQ2FzaCA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIENhc2goc2VsZWN0b3IsIGNvbnRleHQpIHtcbiAgICBpZiAoIXNlbGVjdG9yKSByZXR1cm47XG4gICAgaWYgKGlzQ2FzaChzZWxlY3RvcikpIHJldHVybiBzZWxlY3RvcjtcbiAgICB2YXIgZWxlcyA9IHNlbGVjdG9yO1xuXG4gICAgaWYgKGlzU3RyaW5nKHNlbGVjdG9yKSkge1xuICAgICAgdmFyIGN0eCA9IChpc0Nhc2goY29udGV4dCkgPyBjb250ZXh0WzBdIDogY29udGV4dCkgfHwgZG9jO1xuICAgICAgZWxlcyA9IGlkUmUudGVzdChzZWxlY3RvcikgPyBjdHguZ2V0RWxlbWVudEJ5SWQoc2VsZWN0b3Iuc2xpY2UoMSkpIDogaHRtbFJlLnRlc3Qoc2VsZWN0b3IpID8gcGFyc2VIVE1MKHNlbGVjdG9yKSA6IGZpbmQoc2VsZWN0b3IsIGN0eCk7XG4gICAgICBpZiAoIWVsZXMpIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24oc2VsZWN0b3IpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkeShzZWxlY3Rvcik7IC8vRklYTUU6IGBmbi5yZWFkeWAgaXMgbm90IGluY2x1ZGVkIGluIGBjb3JlYCwgYnV0IGl0J3MgYWN0dWFsbHkgYSBjb3JlIGZ1bmN0aW9uYWxpdHlcbiAgICB9XG5cbiAgICBpZiAoZWxlcy5ub2RlVHlwZSB8fCBlbGVzID09PSB3aW4pIGVsZXMgPSBbZWxlc107XG4gICAgdGhpcy5sZW5ndGggPSBlbGVzLmxlbmd0aDtcblxuICAgIGZvciAodmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIHRoaXNbaV0gPSBlbGVzW2ldO1xuICAgIH1cbiAgfVxuXG4gIENhc2gucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoc2VsZWN0b3IsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gbmV3IENhc2goc2VsZWN0b3IsIGNvbnRleHQpO1xuICB9O1xuXG4gIHJldHVybiBDYXNoO1xufSgpO1xuXG52YXIgZm4gPSBDYXNoLnByb3RvdHlwZSxcbiAgICBjYXNoID0gZm4uaW5pdDtcbmNhc2guZm4gPSBjYXNoLnByb3RvdHlwZSA9IGZuOyAvLyBFbnN1cmluZyB0aGF0IGBjYXNoICgpIGluc3RhbmNlb2YgY2FzaGBcblxuZm4ubGVuZ3RoID0gMDtcbmZuLnNwbGljZSA9IHNwbGljZTsgLy8gRW5zdXJpbmcgYSBjYXNoIGNvbGxlY3Rpb24gZ2V0cyBwcmludGVkIGFzIGFycmF5LWxpa2UgaW4gQ2hyb21lJ3MgZGV2dG9vbHNcblxuaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gRW5zdXJpbmcgYSBjYXNoIGNvbGxlY3Rpb24gaXMgaXRlcmFibGVcbiAgZm5bU3ltYm9sWydpdGVyYXRvciddXSA9IEFycmF5UHJvdG90eXBlW1N5bWJvbFsnaXRlcmF0b3InXV07XG59XG5cbmZuLm1hcCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICByZXR1cm4gY2FzaChjb25jYXQuYXBwbHkoW10sIG1hcC5jYWxsKHRoaXMsIGZ1bmN0aW9uIChlbGUsIGkpIHtcbiAgICByZXR1cm4gY2FsbGJhY2suY2FsbChlbGUsIGksIGVsZSk7XG4gIH0pKSk7XG59O1xuXG5mbi5zbGljZSA9IGZ1bmN0aW9uIChzdGFydCwgZW5kKSB7XG4gIHJldHVybiBjYXNoKHNsaWNlLmNhbGwodGhpcywgc3RhcnQsIGVuZCkpO1xufTsgLy8gQHJlcXVpcmUgLi9jYXNoLnRzXG5cblxudmFyIGRhc2hBbHBoYVJlID0gLy0oW2Etel0pL2c7XG5cbmZ1bmN0aW9uIGNhbWVsQ2FzZShzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKGRhc2hBbHBoYVJlLCBmdW5jdGlvbiAobWF0Y2gsIGxldHRlcikge1xuICAgIHJldHVybiBsZXR0ZXIudG9VcHBlckNhc2UoKTtcbiAgfSk7XG59XG5cbmNhc2guZ3VpZCA9IDE7IC8vIEByZXF1aXJlIC4vY2FzaC50c1xuXG5mdW5jdGlvbiBtYXRjaGVzKGVsZSwgc2VsZWN0b3IpIHtcbiAgdmFyIG1hdGNoZXMgPSBlbGUgJiYgKGVsZVsnbWF0Y2hlcyddIHx8IGVsZVsnd2Via2l0TWF0Y2hlc1NlbGVjdG9yJ10gfHwgZWxlWydtc01hdGNoZXNTZWxlY3RvciddKTtcbiAgcmV0dXJuICEhbWF0Y2hlcyAmJiAhIXNlbGVjdG9yICYmIG1hdGNoZXMuY2FsbChlbGUsIHNlbGVjdG9yKTtcbn1cblxuZnVuY3Rpb24gaXNDYXNoKHgpIHtcbiAgcmV0dXJuIHggaW5zdGFuY2VvZiBDYXNoO1xufVxuXG5mdW5jdGlvbiBpc1dpbmRvdyh4KSB7XG4gIHJldHVybiAhIXggJiYgeCA9PT0geC53aW5kb3c7XG59XG5cbmZ1bmN0aW9uIGlzRG9jdW1lbnQoeCkge1xuICByZXR1cm4gISF4ICYmIHgubm9kZVR5cGUgPT09IDk7XG59XG5cbmZ1bmN0aW9uIGlzRWxlbWVudCh4KSB7XG4gIHJldHVybiAhIXggJiYgeC5ub2RlVHlwZSA9PT0gMTtcbn1cblxuZnVuY3Rpb24gaXNCb29sZWFuKHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSAnYm9vbGVhbic7XG59XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oeCkge1xuICByZXR1cm4gdHlwZW9mIHggPT09ICdmdW5jdGlvbic7XG59XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSAnc3RyaW5nJztcbn1cblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoeCkge1xuICByZXR1cm4geCA9PT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBpc051bGwoeCkge1xuICByZXR1cm4geCA9PT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNOdW1lcmljKHgpIHtcbiAgcmV0dXJuICFpc05hTihwYXJzZUZsb2F0KHgpKSAmJiBpc0Zpbml0ZSh4KTtcbn1cblxuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh4KSB7XG4gIGlmICh0eXBlb2YgeCAhPT0gJ29iamVjdCcgfHwgeCA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICB2YXIgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoeCk7XG4gIHJldHVybiBwcm90byA9PT0gbnVsbCB8fCBwcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZTtcbn1cblxuY2FzaC5pc1dpbmRvdyA9IGlzV2luZG93O1xuY2FzaC5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcbmNhc2guaXNBcnJheSA9IGlzQXJyYXk7XG5jYXNoLmlzTnVtZXJpYyA9IGlzTnVtZXJpYztcbmNhc2guaXNQbGFpbk9iamVjdCA9IGlzUGxhaW5PYmplY3Q7XG5cbmZuLmdldCA9IGZ1bmN0aW9uIChpbmRleCkge1xuICBpZiAoaXNVbmRlZmluZWQoaW5kZXgpKSByZXR1cm4gc2xpY2UuY2FsbCh0aGlzKTtcbiAgaW5kZXggPSBOdW1iZXIoaW5kZXgpO1xuICByZXR1cm4gdGhpc1tpbmRleCA8IDAgPyBpbmRleCArIHRoaXMubGVuZ3RoIDogaW5kZXhdO1xufTtcblxuZm4uZXEgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgcmV0dXJuIGNhc2godGhpcy5nZXQoaW5kZXgpKTtcbn07XG5cbmZuLmZpcnN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5lcSgwKTtcbn07XG5cbmZuLmxhc3QgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmVxKC0xKTtcbn07XG5cbmZ1bmN0aW9uIGVhY2goYXJyLCBjYWxsYmFjaywgX3JldmVyc2UpIHtcbiAgaWYgKF9yZXZlcnNlKSB7XG4gICAgdmFyIGkgPSBhcnIubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgaWYgKGNhbGxiYWNrLmNhbGwoYXJyW2ldLCBpLCBhcnJbaV0pID09PSBmYWxzZSkgcmV0dXJuIGFycjtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdChhcnIpKSB7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhhcnIpO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICBpZiAoY2FsbGJhY2suY2FsbChhcnJba2V5XSwga2V5LCBhcnJba2V5XSkgPT09IGZhbHNlKSByZXR1cm4gYXJyO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGFyci5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGlmIChjYWxsYmFjay5jYWxsKGFycltpXSwgaSwgYXJyW2ldKSA9PT0gZmFsc2UpIHJldHVybiBhcnI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFycjtcbn1cblxuY2FzaC5lYWNoID0gZWFjaDtcblxuZm4uZWFjaCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICByZXR1cm4gZWFjaCh0aGlzLCBjYWxsYmFjayk7XG59O1xuXG5mbi5wcm9wID0gZnVuY3Rpb24gKHByb3AsIHZhbHVlKSB7XG4gIGlmICghcHJvcCkgcmV0dXJuO1xuXG4gIGlmIChpc1N0cmluZyhwcm9wKSkge1xuICAgIHByb3AgPSBwcm9wTWFwW3Byb3BdIHx8IHByb3A7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gdGhpc1swXSAmJiB0aGlzWzBdW3Byb3BdO1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgICAgZWxlW3Byb3BdID0gdmFsdWU7XG4gICAgfSk7XG4gIH1cblxuICBmb3IgKHZhciBrZXkgaW4gcHJvcCkge1xuICAgIHRoaXMucHJvcChrZXksIHByb3Bba2V5XSk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbmZuLnJlbW92ZVByb3AgPSBmdW5jdGlvbiAocHJvcCkge1xuICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICBkZWxldGUgZWxlW3Byb3BNYXBbcHJvcF0gfHwgcHJvcF07XG4gIH0pO1xufTtcblxuZnVuY3Rpb24gZXh0ZW5kKCkge1xuICB2YXIgc291cmNlcyA9IFtdO1xuXG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgc291cmNlc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICB9XG5cbiAgdmFyIGRlZXAgPSBpc0Jvb2xlYW4oc291cmNlc1swXSkgPyBzb3VyY2VzLnNoaWZ0KCkgOiBmYWxzZSxcbiAgICAgIHRhcmdldCA9IHNvdXJjZXMuc2hpZnQoKSxcbiAgICAgIGxlbmd0aCA9IHNvdXJjZXMubGVuZ3RoO1xuICBpZiAoIXRhcmdldCkgcmV0dXJuIHt9O1xuICBpZiAoIWxlbmd0aCkgcmV0dXJuIGV4dGVuZChkZWVwLCBjYXNoLCB0YXJnZXQpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gc291cmNlc1tpXTtcblxuICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgIGlmIChkZWVwICYmIChpc0FycmF5KHNvdXJjZVtrZXldKSB8fCBpc1BsYWluT2JqZWN0KHNvdXJjZVtrZXldKSkpIHtcbiAgICAgICAgaWYgKCF0YXJnZXRba2V5XSB8fCB0YXJnZXRba2V5XS5jb25zdHJ1Y3RvciAhPT0gc291cmNlW2tleV0uY29uc3RydWN0b3IpIHRhcmdldFtrZXldID0gbmV3IHNvdXJjZVtrZXldLmNvbnN0cnVjdG9yKCk7XG4gICAgICAgIGV4dGVuZChkZWVwLCB0YXJnZXRba2V5XSwgc291cmNlW2tleV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5jYXNoLmV4dGVuZCA9IGV4dGVuZDtcblxuZm4uZXh0ZW5kID0gZnVuY3Rpb24gKHBsdWdpbnMpIHtcbiAgcmV0dXJuIGV4dGVuZChmbiwgcGx1Z2lucyk7XG59OyAvLyBAcmVxdWlyZSAuL21hdGNoZXMudHNcbi8vIEByZXF1aXJlIC4vdHlwZV9jaGVja2luZy50c1xuXG5cbmZ1bmN0aW9uIGdldENvbXBhcmVGdW5jdGlvbihjb21wYXJhdG9yKSB7XG4gIHJldHVybiBpc1N0cmluZyhjb21wYXJhdG9yKSA/IGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICByZXR1cm4gbWF0Y2hlcyhlbGUsIGNvbXBhcmF0b3IpO1xuICB9IDogaXNGdW5jdGlvbihjb21wYXJhdG9yKSA/IGNvbXBhcmF0b3IgOiBpc0Nhc2goY29tcGFyYXRvcikgPyBmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgcmV0dXJuIGNvbXBhcmF0b3IuaXMoZWxlKTtcbiAgfSA6ICFjb21wYXJhdG9yID8gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSA6IGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICByZXR1cm4gZWxlID09PSBjb21wYXJhdG9yO1xuICB9O1xufVxuXG5mbi5maWx0ZXIgPSBmdW5jdGlvbiAoY29tcGFyYXRvcikge1xuICB2YXIgY29tcGFyZSA9IGdldENvbXBhcmVGdW5jdGlvbihjb21wYXJhdG9yKTtcbiAgcmV0dXJuIGNhc2goZmlsdGVyLmNhbGwodGhpcywgZnVuY3Rpb24gKGVsZSwgaSkge1xuICAgIHJldHVybiBjb21wYXJlLmNhbGwoZWxlLCBpLCBlbGUpO1xuICB9KSk7XG59OyAvLyBAcmVxdWlyZSBjb2xsZWN0aW9uL2ZpbHRlci50c1xuXG5cbmZ1bmN0aW9uIGZpbHRlcmVkKGNvbGxlY3Rpb24sIGNvbXBhcmF0b3IpIHtcbiAgcmV0dXJuICFjb21wYXJhdG9yID8gY29sbGVjdGlvbiA6IGNvbGxlY3Rpb24uZmlsdGVyKGNvbXBhcmF0b3IpO1xufSAvLyBAcmVxdWlyZSAuL3R5cGVfY2hlY2tpbmcudHNcblxuXG52YXIgc3BsaXRWYWx1ZXNSZSA9IC9cXFMrL2c7XG5cbmZ1bmN0aW9uIGdldFNwbGl0VmFsdWVzKHN0cikge1xuICByZXR1cm4gaXNTdHJpbmcoc3RyKSA/IHN0ci5tYXRjaChzcGxpdFZhbHVlc1JlKSB8fCBbXSA6IFtdO1xufVxuXG5mbi5oYXNDbGFzcyA9IGZ1bmN0aW9uIChjbHMpIHtcbiAgcmV0dXJuICEhY2xzICYmIHNvbWUuY2FsbCh0aGlzLCBmdW5jdGlvbiAoZWxlKSB7XG4gICAgcmV0dXJuIGlzRWxlbWVudChlbGUpICYmIGVsZS5jbGFzc0xpc3QuY29udGFpbnMoY2xzKTtcbiAgfSk7XG59O1xuXG5mbi5yZW1vdmVBdHRyID0gZnVuY3Rpb24gKGF0dHIpIHtcbiAgdmFyIGF0dHJzID0gZ2V0U3BsaXRWYWx1ZXMoYXR0cik7XG4gIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIGlmICghaXNFbGVtZW50KGVsZSkpIHJldHVybjtcbiAgICBlYWNoKGF0dHJzLCBmdW5jdGlvbiAoaSwgYSkge1xuICAgICAgZWxlLnJlbW92ZUF0dHJpYnV0ZShhKTtcbiAgICB9KTtcbiAgfSk7XG59O1xuXG5mdW5jdGlvbiBhdHRyKGF0dHIsIHZhbHVlKSB7XG4gIGlmICghYXR0cikgcmV0dXJuO1xuXG4gIGlmIChpc1N0cmluZyhhdHRyKSkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgICAgaWYgKCF0aGlzWzBdIHx8ICFpc0VsZW1lbnQodGhpc1swXSkpIHJldHVybjtcbiAgICAgIHZhciB2YWx1ZV8xID0gdGhpc1swXS5nZXRBdHRyaWJ1dGUoYXR0cik7XG4gICAgICByZXR1cm4gaXNOdWxsKHZhbHVlXzEpID8gdW5kZWZpbmVkIDogdmFsdWVfMTtcbiAgICB9XG5cbiAgICBpZiAoaXNVbmRlZmluZWQodmFsdWUpKSByZXR1cm4gdGhpcztcbiAgICBpZiAoaXNOdWxsKHZhbHVlKSkgcmV0dXJuIHRoaXMucmVtb3ZlQXR0cihhdHRyKTtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICAgIGlmICghaXNFbGVtZW50KGVsZSkpIHJldHVybjtcbiAgICAgIGVsZS5zZXRBdHRyaWJ1dGUoYXR0ciwgdmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgZm9yICh2YXIga2V5IGluIGF0dHIpIHtcbiAgICB0aGlzLmF0dHIoa2V5LCBhdHRyW2tleV0pO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59XG5cbmZuLmF0dHIgPSBhdHRyO1xuXG5mbi50b2dnbGVDbGFzcyA9IGZ1bmN0aW9uIChjbHMsIGZvcmNlKSB7XG4gIHZhciBjbGFzc2VzID0gZ2V0U3BsaXRWYWx1ZXMoY2xzKSxcbiAgICAgIGlzRm9yY2UgPSAhaXNVbmRlZmluZWQoZm9yY2UpO1xuICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICBpZiAoIWlzRWxlbWVudChlbGUpKSByZXR1cm47XG4gICAgZWFjaChjbGFzc2VzLCBmdW5jdGlvbiAoaSwgYykge1xuICAgICAgaWYgKGlzRm9yY2UpIHtcbiAgICAgICAgZm9yY2UgPyBlbGUuY2xhc3NMaXN0LmFkZChjKSA6IGVsZS5jbGFzc0xpc3QucmVtb3ZlKGMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlLmNsYXNzTGlzdC50b2dnbGUoYyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufTtcblxuZm4uYWRkQ2xhc3MgPSBmdW5jdGlvbiAoY2xzKSB7XG4gIHJldHVybiB0aGlzLnRvZ2dsZUNsYXNzKGNscywgdHJ1ZSk7XG59O1xuXG5mbi5yZW1vdmVDbGFzcyA9IGZ1bmN0aW9uIChjbHMpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0aGlzLnRvZ2dsZUNsYXNzKGNscywgZmFsc2UpO1xuICByZXR1cm4gdGhpcy5hdHRyKCdjbGFzcycsICcnKTtcbn07XG5cbmZ1bmN0aW9uIHBsdWNrKGFyciwgcHJvcCwgZGVlcCwgdW50aWwpIHtcbiAgdmFyIHBsdWNrZWQgPSBbXSxcbiAgICAgIGlzQ2FsbGJhY2sgPSBpc0Z1bmN0aW9uKHByb3ApLFxuICAgICAgY29tcGFyZSA9IHVudGlsICYmIGdldENvbXBhcmVGdW5jdGlvbih1bnRpbCk7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcnIubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgaWYgKGlzQ2FsbGJhY2spIHtcbiAgICAgIHZhciB2YWxfMSA9IHByb3AoYXJyW2ldKTtcbiAgICAgIGlmICh2YWxfMS5sZW5ndGgpIHB1c2guYXBwbHkocGx1Y2tlZCwgdmFsXzEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdmFsXzIgPSBhcnJbaV1bcHJvcF07XG5cbiAgICAgIHdoaWxlICh2YWxfMiAhPSBudWxsKSB7XG4gICAgICAgIGlmICh1bnRpbCAmJiBjb21wYXJlKC0xLCB2YWxfMikpIGJyZWFrO1xuICAgICAgICBwbHVja2VkLnB1c2godmFsXzIpO1xuICAgICAgICB2YWxfMiA9IGRlZXAgPyB2YWxfMltwcm9wXSA6IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBsdWNrZWQ7XG59XG5cbmZ1bmN0aW9uIHVuaXF1ZShhcnIpIHtcbiAgcmV0dXJuIGFyci5sZW5ndGggPiAxID8gZmlsdGVyLmNhbGwoYXJyLCBmdW5jdGlvbiAoaXRlbSwgaW5kZXgsIHNlbGYpIHtcbiAgICByZXR1cm4gaW5kZXhPZi5jYWxsKHNlbGYsIGl0ZW0pID09PSBpbmRleDtcbiAgfSkgOiBhcnI7XG59XG5cbmNhc2gudW5pcXVlID0gdW5pcXVlO1xuXG5mbi5hZGQgPSBmdW5jdGlvbiAoc2VsZWN0b3IsIGNvbnRleHQpIHtcbiAgcmV0dXJuIGNhc2godW5pcXVlKHRoaXMuZ2V0KCkuY29uY2F0KGNhc2goc2VsZWN0b3IsIGNvbnRleHQpLmdldCgpKSkpO1xufTsgLy8gQHJlcXVpcmUgY29yZS90eXBlX2NoZWNraW5nLnRzXG4vLyBAcmVxdWlyZSBjb3JlL3ZhcmlhYmxlcy50c1xuXG5cbmZ1bmN0aW9uIGNvbXB1dGVTdHlsZShlbGUsIHByb3AsIGlzVmFyaWFibGUpIHtcbiAgaWYgKCFpc0VsZW1lbnQoZWxlKSkgcmV0dXJuO1xuICB2YXIgc3R5bGUgPSB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShlbGUsIG51bGwpO1xuICByZXR1cm4gaXNWYXJpYWJsZSA/IHN0eWxlLmdldFByb3BlcnR5VmFsdWUocHJvcCkgfHwgdW5kZWZpbmVkIDogc3R5bGVbcHJvcF0gfHwgZWxlLnN0eWxlW3Byb3BdO1xufSAvLyBAcmVxdWlyZSAuL2NvbXB1dGVfc3R5bGUudHNcblxuXG5mdW5jdGlvbiBjb21wdXRlU3R5bGVJbnQoZWxlLCBwcm9wKSB7XG4gIHJldHVybiBwYXJzZUludChjb21wdXRlU3R5bGUoZWxlLCBwcm9wKSwgMTApIHx8IDA7XG59XG5cbnZhciBjc3NWYXJpYWJsZVJlID0gL14tLS87IC8vIEByZXF1aXJlIC4vdmFyaWFibGVzLnRzXG5cbmZ1bmN0aW9uIGlzQ1NTVmFyaWFibGUocHJvcCkge1xuICByZXR1cm4gY3NzVmFyaWFibGVSZS50ZXN0KHByb3ApO1xufSAvLyBAcmVxdWlyZSBjb3JlL2NhbWVsX2Nhc2UudHNcbi8vIEByZXF1aXJlIGNvcmUvY2FzaC50c1xuLy8gQHJlcXVpcmUgY29yZS9lYWNoLnRzXG4vLyBAcmVxdWlyZSBjb3JlL3ZhcmlhYmxlcy50c1xuLy8gQHJlcXVpcmUgLi9pc19jc3NfdmFyaWFibGUudHNcblxuXG52YXIgcHJlZml4ZWRQcm9wcyA9IHt9LFxuICAgIHN0eWxlID0gZGl2LnN0eWxlLFxuICAgIHZlbmRvcnNQcmVmaXhlcyA9IFsnd2Via2l0JywgJ21veicsICdtcyddO1xuXG5mdW5jdGlvbiBnZXRQcmVmaXhlZFByb3AocHJvcCwgaXNWYXJpYWJsZSkge1xuICBpZiAoaXNWYXJpYWJsZSA9PT0gdm9pZCAwKSB7XG4gICAgaXNWYXJpYWJsZSA9IGlzQ1NTVmFyaWFibGUocHJvcCk7XG4gIH1cblxuICBpZiAoaXNWYXJpYWJsZSkgcmV0dXJuIHByb3A7XG5cbiAgaWYgKCFwcmVmaXhlZFByb3BzW3Byb3BdKSB7XG4gICAgdmFyIHByb3BDQyA9IGNhbWVsQ2FzZShwcm9wKSxcbiAgICAgICAgcHJvcFVDID0gXCJcIiArIHByb3BDQ1swXS50b1VwcGVyQ2FzZSgpICsgcHJvcENDLnNsaWNlKDEpLFxuICAgICAgICBwcm9wcyA9IChwcm9wQ0MgKyBcIiBcIiArIHZlbmRvcnNQcmVmaXhlcy5qb2luKHByb3BVQyArIFwiIFwiKSArIHByb3BVQykuc3BsaXQoJyAnKTtcbiAgICBlYWNoKHByb3BzLCBmdW5jdGlvbiAoaSwgcCkge1xuICAgICAgaWYgKHAgaW4gc3R5bGUpIHtcbiAgICAgICAgcHJlZml4ZWRQcm9wc1twcm9wXSA9IHA7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBwcmVmaXhlZFByb3BzW3Byb3BdO1xufVxuXG47IC8vIEByZXF1aXJlIGNvcmUvdHlwZV9jaGVja2luZy50c1xuLy8gQHJlcXVpcmUgLi9pc19jc3NfdmFyaWFibGUudHNcblxudmFyIG51bWVyaWNQcm9wcyA9IHtcbiAgYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6IHRydWUsXG4gIGNvbHVtbkNvdW50OiB0cnVlLFxuICBmbGV4R3JvdzogdHJ1ZSxcbiAgZmxleFNocmluazogdHJ1ZSxcbiAgZm9udFdlaWdodDogdHJ1ZSxcbiAgZ3JpZEFyZWE6IHRydWUsXG4gIGdyaWRDb2x1bW46IHRydWUsXG4gIGdyaWRDb2x1bW5FbmQ6IHRydWUsXG4gIGdyaWRDb2x1bW5TdGFydDogdHJ1ZSxcbiAgZ3JpZFJvdzogdHJ1ZSxcbiAgZ3JpZFJvd0VuZDogdHJ1ZSxcbiAgZ3JpZFJvd1N0YXJ0OiB0cnVlLFxuICBsaW5lSGVpZ2h0OiB0cnVlLFxuICBvcGFjaXR5OiB0cnVlLFxuICBvcmRlcjogdHJ1ZSxcbiAgb3JwaGFuczogdHJ1ZSxcbiAgd2lkb3dzOiB0cnVlLFxuICB6SW5kZXg6IHRydWVcbn07XG5cbmZ1bmN0aW9uIGdldFN1ZmZpeGVkVmFsdWUocHJvcCwgdmFsdWUsIGlzVmFyaWFibGUpIHtcbiAgaWYgKGlzVmFyaWFibGUgPT09IHZvaWQgMCkge1xuICAgIGlzVmFyaWFibGUgPSBpc0NTU1ZhcmlhYmxlKHByb3ApO1xuICB9XG5cbiAgcmV0dXJuICFpc1ZhcmlhYmxlICYmICFudW1lcmljUHJvcHNbcHJvcF0gJiYgaXNOdW1lcmljKHZhbHVlKSA/IHZhbHVlICsgXCJweFwiIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGNzcyhwcm9wLCB2YWx1ZSkge1xuICBpZiAoaXNTdHJpbmcocHJvcCkpIHtcbiAgICB2YXIgaXNWYXJpYWJsZV8xID0gaXNDU1NWYXJpYWJsZShwcm9wKTtcbiAgICBwcm9wID0gZ2V0UHJlZml4ZWRQcm9wKHByb3AsIGlzVmFyaWFibGVfMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gdGhpc1swXSAmJiBjb21wdXRlU3R5bGUodGhpc1swXSwgcHJvcCwgaXNWYXJpYWJsZV8xKTtcbiAgICBpZiAoIXByb3ApIHJldHVybiB0aGlzO1xuICAgIHZhbHVlID0gZ2V0U3VmZml4ZWRWYWx1ZShwcm9wLCB2YWx1ZSwgaXNWYXJpYWJsZV8xKTtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICAgIGlmICghaXNFbGVtZW50KGVsZSkpIHJldHVybjtcblxuICAgICAgaWYgKGlzVmFyaWFibGVfMSkge1xuICAgICAgICBlbGUuc3R5bGUuc2V0UHJvcGVydHkocHJvcCwgdmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlLnN0eWxlW3Byb3BdID0gdmFsdWU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmb3IgKHZhciBrZXkgaW4gcHJvcCkge1xuICAgIHRoaXMuY3NzKGtleSwgcHJvcFtrZXldKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufVxuXG47XG5mbi5jc3MgPSBjc3M7IC8vIEBvcHRpb25hbCAuL2Nzcy50c1xuLy8gQHJlcXVpcmUgY29yZS9hdHRlbXB0LnRzXG4vLyBAcmVxdWlyZSBjb3JlL2NhbWVsX2Nhc2UudHNcblxudmFyIEpTT05TdHJpbmdSZSA9IC9eXFxzK3xcXHMrJC87XG5cbmZ1bmN0aW9uIGdldERhdGEoZWxlLCBrZXkpIHtcbiAgdmFyIHZhbHVlID0gZWxlLmRhdGFzZXRba2V5XSB8fCBlbGUuZGF0YXNldFtjYW1lbENhc2Uoa2V5KV07XG4gIGlmIChKU09OU3RyaW5nUmUudGVzdCh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgcmV0dXJuIGF0dGVtcHQoSlNPTi5wYXJzZSwgdmFsdWUpO1xufSAvLyBAcmVxdWlyZSBjb3JlL2F0dGVtcHQudHNcbi8vIEByZXF1aXJlIGNvcmUvY2FtZWxfY2FzZS50c1xuXG5cbmZ1bmN0aW9uIHNldERhdGEoZWxlLCBrZXksIHZhbHVlKSB7XG4gIHZhbHVlID0gYXR0ZW1wdChKU09OLnN0cmluZ2lmeSwgdmFsdWUpO1xuICBlbGUuZGF0YXNldFtjYW1lbENhc2Uoa2V5KV0gPSB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gZGF0YShuYW1lLCB2YWx1ZSkge1xuICBpZiAoIW5hbWUpIHtcbiAgICBpZiAoIXRoaXNbMF0pIHJldHVybjtcbiAgICB2YXIgZGF0YXMgPSB7fTtcblxuICAgIGZvciAodmFyIGtleSBpbiB0aGlzWzBdLmRhdGFzZXQpIHtcbiAgICAgIGRhdGFzW2tleV0gPSBnZXREYXRhKHRoaXNbMF0sIGtleSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGFzO1xuICB9XG5cbiAgaWYgKGlzU3RyaW5nKG5hbWUpKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gdGhpc1swXSAmJiBnZXREYXRhKHRoaXNbMF0sIG5hbWUpO1xuICAgIGlmIChpc1VuZGVmaW5lZCh2YWx1ZSkpIHJldHVybiB0aGlzO1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgICAgc2V0RGF0YShlbGUsIG5hbWUsIHZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZvciAodmFyIGtleSBpbiBuYW1lKSB7XG4gICAgdGhpcy5kYXRhKGtleSwgbmFtZVtrZXldKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufVxuXG5mbi5kYXRhID0gZGF0YTsgLy8gQG9wdGlvbmFsIC4vZGF0YS50c1xuXG5mdW5jdGlvbiBnZXREb2N1bWVudERpbWVuc2lvbihkb2MsIGRpbWVuc2lvbikge1xuICB2YXIgZG9jRWxlID0gZG9jLmRvY3VtZW50RWxlbWVudDtcbiAgcmV0dXJuIE1hdGgubWF4KGRvYy5ib2R5W1wic2Nyb2xsXCIgKyBkaW1lbnNpb25dLCBkb2NFbGVbXCJzY3JvbGxcIiArIGRpbWVuc2lvbl0sIGRvYy5ib2R5W1wib2Zmc2V0XCIgKyBkaW1lbnNpb25dLCBkb2NFbGVbXCJvZmZzZXRcIiArIGRpbWVuc2lvbl0sIGRvY0VsZVtcImNsaWVudFwiICsgZGltZW5zaW9uXSk7XG59IC8vIEByZXF1aXJlIGNzcy9oZWxwZXJzL2NvbXB1dGVfc3R5bGVfaW50LnRzXG5cblxuZnVuY3Rpb24gZ2V0RXh0cmFTcGFjZShlbGUsIHhBeGlzKSB7XG4gIHJldHVybiBjb21wdXRlU3R5bGVJbnQoZWxlLCBcImJvcmRlclwiICsgKHhBeGlzID8gJ0xlZnQnIDogJ1RvcCcpICsgXCJXaWR0aFwiKSArIGNvbXB1dGVTdHlsZUludChlbGUsIFwicGFkZGluZ1wiICsgKHhBeGlzID8gJ0xlZnQnIDogJ1RvcCcpKSArIGNvbXB1dGVTdHlsZUludChlbGUsIFwicGFkZGluZ1wiICsgKHhBeGlzID8gJ1JpZ2h0JyA6ICdCb3R0b20nKSkgKyBjb21wdXRlU3R5bGVJbnQoZWxlLCBcImJvcmRlclwiICsgKHhBeGlzID8gJ1JpZ2h0JyA6ICdCb3R0b20nKSArIFwiV2lkdGhcIik7XG59XG5cbmVhY2goW3RydWUsIGZhbHNlXSwgZnVuY3Rpb24gKGksIG91dGVyKSB7XG4gIGVhY2goWydXaWR0aCcsICdIZWlnaHQnXSwgZnVuY3Rpb24gKGksIHByb3ApIHtcbiAgICB2YXIgbmFtZSA9IFwiXCIgKyAob3V0ZXIgPyAnb3V0ZXInIDogJ2lubmVyJykgKyBwcm9wO1xuXG4gICAgZm5bbmFtZV0gPSBmdW5jdGlvbiAoaW5jbHVkZU1hcmdpbnMpIHtcbiAgICAgIGlmICghdGhpc1swXSkgcmV0dXJuO1xuICAgICAgaWYgKGlzV2luZG93KHRoaXNbMF0pKSByZXR1cm4gb3V0ZXIgPyB0aGlzWzBdW1wiaW5uZXJcIiArIHByb3BdIDogdGhpc1swXS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbXCJjbGllbnRcIiArIHByb3BdO1xuICAgICAgaWYgKGlzRG9jdW1lbnQodGhpc1swXSkpIHJldHVybiBnZXREb2N1bWVudERpbWVuc2lvbih0aGlzWzBdLCBwcm9wKTtcbiAgICAgIHJldHVybiB0aGlzWzBdW1wiXCIgKyAob3V0ZXIgPyAnb2Zmc2V0JyA6ICdjbGllbnQnKSArIHByb3BdICsgKGluY2x1ZGVNYXJnaW5zICYmIG91dGVyID8gY29tcHV0ZVN0eWxlSW50KHRoaXNbMF0sIFwibWFyZ2luXCIgKyAoaSA/ICdUb3AnIDogJ0xlZnQnKSkgKyBjb21wdXRlU3R5bGVJbnQodGhpc1swXSwgXCJtYXJnaW5cIiArIChpID8gJ0JvdHRvbScgOiAnUmlnaHQnKSkgOiAwKTtcbiAgICB9O1xuICB9KTtcbn0pO1xuZWFjaChbJ1dpZHRoJywgJ0hlaWdodCddLCBmdW5jdGlvbiAoaW5kZXgsIHByb3ApIHtcbiAgdmFyIHByb3BMQyA9IHByb3AudG9Mb3dlckNhc2UoKTtcblxuICBmbltwcm9wTENdID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgaWYgKCF0aGlzWzBdKSByZXR1cm4gaXNVbmRlZmluZWQodmFsdWUpID8gdW5kZWZpbmVkIDogdGhpcztcblxuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgaWYgKGlzV2luZG93KHRoaXNbMF0pKSByZXR1cm4gdGhpc1swXS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbXCJjbGllbnRcIiArIHByb3BdO1xuICAgICAgaWYgKGlzRG9jdW1lbnQodGhpc1swXSkpIHJldHVybiBnZXREb2N1bWVudERpbWVuc2lvbih0aGlzWzBdLCBwcm9wKTtcbiAgICAgIHJldHVybiB0aGlzWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW3Byb3BMQ10gLSBnZXRFeHRyYVNwYWNlKHRoaXNbMF0sICFpbmRleCk7XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlTnVtYmVyID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICAgIGlmICghaXNFbGVtZW50KGVsZSkpIHJldHVybjtcbiAgICAgIHZhciBib3hTaXppbmcgPSBjb21wdXRlU3R5bGUoZWxlLCAnYm94U2l6aW5nJyk7XG4gICAgICBlbGUuc3R5bGVbcHJvcExDXSA9IGdldFN1ZmZpeGVkVmFsdWUocHJvcExDLCB2YWx1ZU51bWJlciArIChib3hTaXppbmcgPT09ICdib3JkZXItYm94JyA/IGdldEV4dHJhU3BhY2UoZWxlLCAhaW5kZXgpIDogMCkpO1xuICAgIH0pO1xuICB9O1xufSk7IC8vIEBvcHRpb25hbCAuL2lubmVyX291dGVyLnRzXG4vLyBAb3B0aW9uYWwgLi9ub3JtYWwudHNcbi8vIEByZXF1aXJlIGNzcy9oZWxwZXJzL2NvbXB1dGVfc3R5bGUudHNcblxudmFyIGRlZmF1bHREaXNwbGF5ID0ge307XG5cbmZ1bmN0aW9uIGdldERlZmF1bHREaXNwbGF5KHRhZ05hbWUpIHtcbiAgaWYgKGRlZmF1bHREaXNwbGF5W3RhZ05hbWVdKSByZXR1cm4gZGVmYXVsdERpc3BsYXlbdGFnTmFtZV07XG4gIHZhciBlbGUgPSBjcmVhdGVFbGVtZW50KHRhZ05hbWUpO1xuICBkb2MuYm9keS5pbnNlcnRCZWZvcmUoZWxlLCBudWxsKTtcbiAgdmFyIGRpc3BsYXkgPSBjb21wdXRlU3R5bGUoZWxlLCAnZGlzcGxheScpO1xuICBkb2MuYm9keS5yZW1vdmVDaGlsZChlbGUpO1xuICByZXR1cm4gZGVmYXVsdERpc3BsYXlbdGFnTmFtZV0gPSBkaXNwbGF5ICE9PSAnbm9uZScgPyBkaXNwbGF5IDogJ2Jsb2NrJztcbn0gLy8gQHJlcXVpcmUgY3NzL2hlbHBlcnMvY29tcHV0ZV9zdHlsZS50c1xuXG5cbmZ1bmN0aW9uIGlzSGlkZGVuKGVsZSkge1xuICByZXR1cm4gY29tcHV0ZVN0eWxlKGVsZSwgJ2Rpc3BsYXknKSA9PT0gJ25vbmUnO1xufVxuXG52YXIgZGlzcGxheVByb3BlcnR5ID0gJ19fX2NkJztcblxuZm4udG9nZ2xlID0gZnVuY3Rpb24gKGZvcmNlKSB7XG4gIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIGlmICghaXNFbGVtZW50KGVsZSkpIHJldHVybjtcbiAgICB2YXIgc2hvdyA9IGlzVW5kZWZpbmVkKGZvcmNlKSA/IGlzSGlkZGVuKGVsZSkgOiBmb3JjZTtcblxuICAgIGlmIChzaG93KSB7XG4gICAgICBlbGUuc3R5bGUuZGlzcGxheSA9IGVsZVtkaXNwbGF5UHJvcGVydHldIHx8ICcnO1xuXG4gICAgICBpZiAoaXNIaWRkZW4oZWxlKSkge1xuICAgICAgICBlbGUuc3R5bGUuZGlzcGxheSA9IGdldERlZmF1bHREaXNwbGF5KGVsZS50YWdOYW1lKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZWxlW2Rpc3BsYXlQcm9wZXJ0eV0gPSBjb21wdXRlU3R5bGUoZWxlLCAnZGlzcGxheScpO1xuICAgICAgZWxlLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxuICB9KTtcbn07XG5cbmZuLmhpZGUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnRvZ2dsZShmYWxzZSk7XG59O1xuXG5mbi5zaG93ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy50b2dnbGUodHJ1ZSk7XG59OyAvLyBAb3B0aW9uYWwgLi9oaWRlLnRzXG4vLyBAb3B0aW9uYWwgLi9zaG93LnRzXG4vLyBAb3B0aW9uYWwgLi90b2dnbGUudHNcblxuXG5mdW5jdGlvbiBoYXNOYW1lc3BhY2VzKG5zMSwgbnMyKSB7XG4gIHJldHVybiAhbnMyIHx8ICFzb21lLmNhbGwobnMyLCBmdW5jdGlvbiAobnMpIHtcbiAgICByZXR1cm4gbnMxLmluZGV4T2YobnMpIDwgMDtcbiAgfSk7XG59XG5cbnZhciBldmVudHNOYW1lc3BhY2UgPSAnX19fY2UnLFxuICAgIGV2ZW50c05hbWVzcGFjZXNTZXBhcmF0b3IgPSAnLicsXG4gICAgZXZlbnRzRm9jdXMgPSB7XG4gIGZvY3VzOiAnZm9jdXNpbicsXG4gIGJsdXI6ICdmb2N1c291dCdcbn0sXG4gICAgZXZlbnRzSG92ZXIgPSB7XG4gIG1vdXNlZW50ZXI6ICdtb3VzZW92ZXInLFxuICBtb3VzZWxlYXZlOiAnbW91c2VvdXQnXG59LFxuICAgIGV2ZW50c01vdXNlUmUgPSAvXihtb3VzZXxwb2ludGVyfGNvbnRleHRtZW51fGRyYWd8ZHJvcHxjbGlja3xkYmxjbGljaykvaTsgLy8gQHJlcXVpcmUgLi92YXJpYWJsZXMudHNcblxuZnVuY3Rpb24gZ2V0RXZlbnROYW1lQnViYmxpbmcobmFtZSkge1xuICByZXR1cm4gZXZlbnRzSG92ZXJbbmFtZV0gfHwgZXZlbnRzRm9jdXNbbmFtZV0gfHwgbmFtZTtcbn0gLy8gQHJlcXVpcmUgLi92YXJpYWJsZXMudHNcblxuXG5mdW5jdGlvbiBnZXRFdmVudHNDYWNoZShlbGUpIHtcbiAgcmV0dXJuIGVsZVtldmVudHNOYW1lc3BhY2VdID0gZWxlW2V2ZW50c05hbWVzcGFjZV0gfHwge307XG59IC8vIEByZXF1aXJlIGNvcmUvZ3VpZC50c1xuLy8gQHJlcXVpcmUgZXZlbnRzL2hlbHBlcnMvZ2V0X2V2ZW50c19jYWNoZS50c1xuXG5cbmZ1bmN0aW9uIGFkZEV2ZW50KGVsZSwgbmFtZSwgbmFtZXNwYWNlcywgc2VsZWN0b3IsIGNhbGxiYWNrKSB7XG4gIHZhciBldmVudENhY2hlID0gZ2V0RXZlbnRzQ2FjaGUoZWxlKTtcbiAgZXZlbnRDYWNoZVtuYW1lXSA9IGV2ZW50Q2FjaGVbbmFtZV0gfHwgW107XG4gIGV2ZW50Q2FjaGVbbmFtZV0ucHVzaChbbmFtZXNwYWNlcywgc2VsZWN0b3IsIGNhbGxiYWNrXSk7XG4gIGVsZS5hZGRFdmVudExpc3RlbmVyKG5hbWUsIGNhbGxiYWNrKTtcbn0gLy8gQHJlcXVpcmUgLi92YXJpYWJsZXMudHNcblxuXG5mdW5jdGlvbiBwYXJzZUV2ZW50TmFtZShldmVudE5hbWUpIHtcbiAgdmFyIHBhcnRzID0gZXZlbnROYW1lLnNwbGl0KGV2ZW50c05hbWVzcGFjZXNTZXBhcmF0b3IpO1xuICByZXR1cm4gW3BhcnRzWzBdLCBwYXJ0cy5zbGljZSgxKS5zb3J0KCldOyAvLyBbbmFtZSwgbmFtZXNwYWNlW11dXG59IC8vIEByZXF1aXJlIC4vZ2V0X2V2ZW50c19jYWNoZS50c1xuLy8gQHJlcXVpcmUgLi9oYXNfbmFtZXNwYWNlcy50c1xuLy8gQHJlcXVpcmUgLi9wYXJzZV9ldmVudF9uYW1lLnRzXG5cblxuZnVuY3Rpb24gcmVtb3ZlRXZlbnQoZWxlLCBuYW1lLCBuYW1lc3BhY2VzLCBzZWxlY3RvciwgY2FsbGJhY2spIHtcbiAgdmFyIGNhY2hlID0gZ2V0RXZlbnRzQ2FjaGUoZWxlKTtcblxuICBpZiAoIW5hbWUpIHtcbiAgICBmb3IgKG5hbWUgaW4gY2FjaGUpIHtcbiAgICAgIHJlbW92ZUV2ZW50KGVsZSwgbmFtZSwgbmFtZXNwYWNlcywgc2VsZWN0b3IsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY2FjaGVbbmFtZV0pIHtcbiAgICBjYWNoZVtuYW1lXSA9IGNhY2hlW25hbWVdLmZpbHRlcihmdW5jdGlvbiAoX2EpIHtcbiAgICAgIHZhciBucyA9IF9hWzBdLFxuICAgICAgICAgIHNlbCA9IF9hWzFdLFxuICAgICAgICAgIGNiID0gX2FbMl07XG4gICAgICBpZiAoY2FsbGJhY2sgJiYgY2IuZ3VpZCAhPT0gY2FsbGJhY2suZ3VpZCB8fCAhaGFzTmFtZXNwYWNlcyhucywgbmFtZXNwYWNlcykgfHwgc2VsZWN0b3IgJiYgc2VsZWN0b3IgIT09IHNlbCkgcmV0dXJuIHRydWU7XG4gICAgICBlbGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCBjYik7XG4gICAgfSk7XG4gIH1cbn1cblxuZm4ub2ZmID0gZnVuY3Rpb24gKGV2ZW50RnVsbE5hbWUsIHNlbGVjdG9yLCBjYWxsYmFjaykge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIGlmIChpc1VuZGVmaW5lZChldmVudEZ1bGxOYW1lKSkge1xuICAgIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgICBpZiAoIWlzRWxlbWVudChlbGUpICYmICFpc0RvY3VtZW50KGVsZSkgJiYgIWlzV2luZG93KGVsZSkpIHJldHVybjtcbiAgICAgIHJlbW92ZUV2ZW50KGVsZSk7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoIWlzU3RyaW5nKGV2ZW50RnVsbE5hbWUpKSB7XG4gICAgZm9yICh2YXIga2V5IGluIGV2ZW50RnVsbE5hbWUpIHtcbiAgICAgIHRoaXMub2ZmKGtleSwgZXZlbnRGdWxsTmFtZVtrZXldKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oc2VsZWN0b3IpKSB7XG4gICAgICBjYWxsYmFjayA9IHNlbGVjdG9yO1xuICAgICAgc2VsZWN0b3IgPSAnJztcbiAgICB9XG5cbiAgICBlYWNoKGdldFNwbGl0VmFsdWVzKGV2ZW50RnVsbE5hbWUpLCBmdW5jdGlvbiAoaSwgZXZlbnRGdWxsTmFtZSkge1xuICAgICAgdmFyIF9hID0gcGFyc2VFdmVudE5hbWUoZXZlbnRGdWxsTmFtZSksXG4gICAgICAgICAgbmFtZU9yaWdpbmFsID0gX2FbMF0sXG4gICAgICAgICAgbmFtZXNwYWNlcyA9IF9hWzFdLFxuICAgICAgICAgIG5hbWUgPSBnZXRFdmVudE5hbWVCdWJibGluZyhuYW1lT3JpZ2luYWwpO1xuXG4gICAgICBfdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICAgICAgaWYgKCFpc0VsZW1lbnQoZWxlKSAmJiAhaXNEb2N1bWVudChlbGUpICYmICFpc1dpbmRvdyhlbGUpKSByZXR1cm47XG4gICAgICAgIHJlbW92ZUV2ZW50KGVsZSwgbmFtZSwgbmFtZXNwYWNlcywgc2VsZWN0b3IsIGNhbGxiYWNrKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBvbihldmVudEZ1bGxOYW1lLCBzZWxlY3RvciwgZGF0YSwgY2FsbGJhY2ssIF9vbmUpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICBpZiAoIWlzU3RyaW5nKGV2ZW50RnVsbE5hbWUpKSB7XG4gICAgZm9yICh2YXIga2V5IGluIGV2ZW50RnVsbE5hbWUpIHtcbiAgICAgIHRoaXMub24oa2V5LCBzZWxlY3RvciwgZGF0YSwgZXZlbnRGdWxsTmFtZVtrZXldLCBfb25lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGlmICghaXNTdHJpbmcoc2VsZWN0b3IpKSB7XG4gICAgaWYgKGlzVW5kZWZpbmVkKHNlbGVjdG9yKSB8fCBpc051bGwoc2VsZWN0b3IpKSB7XG4gICAgICBzZWxlY3RvciA9ICcnO1xuICAgIH0gZWxzZSBpZiAoaXNVbmRlZmluZWQoZGF0YSkpIHtcbiAgICAgIGRhdGEgPSBzZWxlY3RvcjtcbiAgICAgIHNlbGVjdG9yID0gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxiYWNrID0gZGF0YTtcbiAgICAgIGRhdGEgPSBzZWxlY3RvcjtcbiAgICAgIHNlbGVjdG9yID0gJyc7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFpc0Z1bmN0aW9uKGNhbGxiYWNrKSkge1xuICAgIGNhbGxiYWNrID0gZGF0YTtcbiAgICBkYXRhID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKCFjYWxsYmFjaykgcmV0dXJuIHRoaXM7XG4gIGVhY2goZ2V0U3BsaXRWYWx1ZXMoZXZlbnRGdWxsTmFtZSksIGZ1bmN0aW9uIChpLCBldmVudEZ1bGxOYW1lKSB7XG4gICAgdmFyIF9hID0gcGFyc2VFdmVudE5hbWUoZXZlbnRGdWxsTmFtZSksXG4gICAgICAgIG5hbWVPcmlnaW5hbCA9IF9hWzBdLFxuICAgICAgICBuYW1lc3BhY2VzID0gX2FbMV0sXG4gICAgICAgIG5hbWUgPSBnZXRFdmVudE5hbWVCdWJibGluZyhuYW1lT3JpZ2luYWwpLFxuICAgICAgICBpc0V2ZW50SG92ZXIgPSBuYW1lT3JpZ2luYWwgaW4gZXZlbnRzSG92ZXIsXG4gICAgICAgIGlzRXZlbnRGb2N1cyA9IG5hbWVPcmlnaW5hbCBpbiBldmVudHNGb2N1cztcblxuICAgIGlmICghbmFtZSkgcmV0dXJuO1xuXG4gICAgX3RoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgICBpZiAoIWlzRWxlbWVudChlbGUpICYmICFpc0RvY3VtZW50KGVsZSkgJiYgIWlzV2luZG93KGVsZSkpIHJldHVybjtcblxuICAgICAgdmFyIGZpbmFsQ2FsbGJhY2sgPSBmdW5jdGlvbiBmaW5hbENhbGxiYWNrKGV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC50YXJnZXRbXCJfX19pXCIgKyBldmVudC50eXBlXSkgcmV0dXJuIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOyAvLyBJZ25vcmluZyBuYXRpdmUgZXZlbnQgaW4gZmF2b3Igb2YgdGhlIHVwY29taW5nIGN1c3RvbSBvbmVcblxuICAgICAgICBpZiAoZXZlbnQubmFtZXNwYWNlICYmICFoYXNOYW1lc3BhY2VzKG5hbWVzcGFjZXMsIGV2ZW50Lm5hbWVzcGFjZS5zcGxpdChldmVudHNOYW1lc3BhY2VzU2VwYXJhdG9yKSkpIHJldHVybjtcbiAgICAgICAgaWYgKCFzZWxlY3RvciAmJiAoaXNFdmVudEZvY3VzICYmIChldmVudC50YXJnZXQgIT09IGVsZSB8fCBldmVudC5fX19vdCA9PT0gbmFtZSkgfHwgaXNFdmVudEhvdmVyICYmIGV2ZW50LnJlbGF0ZWRUYXJnZXQgJiYgZWxlLmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQpKSkgcmV0dXJuO1xuICAgICAgICB2YXIgdGhpc0FyZyA9IGVsZTtcblxuICAgICAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgICAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuXG4gICAgICAgICAgd2hpbGUgKCFtYXRjaGVzKHRhcmdldCwgc2VsZWN0b3IpKSB7XG4gICAgICAgICAgICBpZiAodGFyZ2V0ID09PSBlbGUpIHJldHVybjtcbiAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlO1xuICAgICAgICAgICAgaWYgKCF0YXJnZXQpIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzQXJnID0gdGFyZ2V0O1xuICAgICAgICAgIGV2ZW50Ll9fX2NkID0gdHJ1ZTsgLy8gRGVsZWdhdGVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5fX19jZCkge1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShldmVudCwgJ2N1cnJlbnRUYXJnZXQnLCB7XG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXNBcmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXZlbnQsICdkYXRhJywge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHZhciByZXR1cm5WYWx1ZSA9IGNhbGxiYWNrLmNhbGwodGhpc0FyZywgZXZlbnQsIGV2ZW50Ll9fX3RkKTtcblxuICAgICAgICBpZiAoX29uZSkge1xuICAgICAgICAgIHJlbW92ZUV2ZW50KGVsZSwgbmFtZSwgbmFtZXNwYWNlcywgc2VsZWN0b3IsIGZpbmFsQ2FsbGJhY2spO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJldHVyblZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGZpbmFsQ2FsbGJhY2suZ3VpZCA9IGNhbGxiYWNrLmd1aWQgPSBjYWxsYmFjay5ndWlkIHx8IGNhc2guZ3VpZCsrO1xuICAgICAgYWRkRXZlbnQoZWxlLCBuYW1lLCBuYW1lc3BhY2VzLCBzZWxlY3RvciwgZmluYWxDYWxsYmFjayk7XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gdGhpcztcbn1cblxuZm4ub24gPSBvbjtcblxuZnVuY3Rpb24gb25lKGV2ZW50RnVsbE5hbWUsIHNlbGVjdG9yLCBkYXRhLCBjYWxsYmFjaykge1xuICByZXR1cm4gdGhpcy5vbihldmVudEZ1bGxOYW1lLCBzZWxlY3RvciwgZGF0YSwgY2FsbGJhY2ssIHRydWUpO1xufVxuXG47XG5mbi5vbmUgPSBvbmU7XG5cbmZuLnJlYWR5ID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIHZhciBjYiA9IGZ1bmN0aW9uIGNiKCkge1xuICAgIHJldHVybiBzZXRUaW1lb3V0KGNhbGxiYWNrLCAwLCBjYXNoKTtcbiAgfTtcblxuICBpZiAoZG9jLnJlYWR5U3RhdGUgIT09ICdsb2FkaW5nJykge1xuICAgIGNiKCk7XG4gIH0gZWxzZSB7XG4gICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBjYik7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbmZuLnRyaWdnZXIgPSBmdW5jdGlvbiAoZXZlbnQsIGRhdGEpIHtcbiAgaWYgKGlzU3RyaW5nKGV2ZW50KSkge1xuICAgIHZhciBfYSA9IHBhcnNlRXZlbnROYW1lKGV2ZW50KSxcbiAgICAgICAgbmFtZU9yaWdpbmFsID0gX2FbMF0sXG4gICAgICAgIG5hbWVzcGFjZXMgPSBfYVsxXSxcbiAgICAgICAgbmFtZV8xID0gZ2V0RXZlbnROYW1lQnViYmxpbmcobmFtZU9yaWdpbmFsKTtcblxuICAgIGlmICghbmFtZV8xKSByZXR1cm4gdGhpcztcbiAgICB2YXIgdHlwZSA9IGV2ZW50c01vdXNlUmUudGVzdChuYW1lXzEpID8gJ01vdXNlRXZlbnRzJyA6ICdIVE1MRXZlbnRzJztcbiAgICBldmVudCA9IGRvYy5jcmVhdGVFdmVudCh0eXBlKTtcbiAgICBldmVudC5pbml0RXZlbnQobmFtZV8xLCB0cnVlLCB0cnVlKTtcbiAgICBldmVudC5uYW1lc3BhY2UgPSBuYW1lc3BhY2VzLmpvaW4oZXZlbnRzTmFtZXNwYWNlc1NlcGFyYXRvcik7XG4gICAgZXZlbnQuX19fb3QgPSBuYW1lT3JpZ2luYWw7XG4gIH1cblxuICBldmVudC5fX190ZCA9IGRhdGE7XG4gIHZhciBpc0V2ZW50Rm9jdXMgPSBldmVudC5fX19vdCBpbiBldmVudHNGb2N1cztcbiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgaWYgKGlzRXZlbnRGb2N1cyAmJiBpc0Z1bmN0aW9uKGVsZVtldmVudC5fX19vdF0pKSB7XG4gICAgICBlbGVbXCJfX19pXCIgKyBldmVudC50eXBlXSA9IHRydWU7IC8vIEVuc3VyaW5nIHRoZSBuYXRpdmUgZXZlbnQgaXMgaWdub3JlZFxuXG4gICAgICBlbGVbZXZlbnQuX19fb3RdKCk7XG5cbiAgICAgIGVsZVtcIl9fX2lcIiArIGV2ZW50LnR5cGVdID0gZmFsc2U7IC8vIEVuc3VyaW5nIHRoZSBjdXN0b20gZXZlbnQgaXMgbm90IGlnbm9yZWRcbiAgICB9XG5cbiAgICBlbGUuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gIH0pO1xufTsgLy8gQG9wdGlvbmFsIC4vb2ZmLnRzXG4vLyBAb3B0aW9uYWwgLi9vbi50c1xuLy8gQG9wdGlvbmFsIC4vb25lLnRzXG4vLyBAb3B0aW9uYWwgLi9yZWFkeS50c1xuLy8gQG9wdGlvbmFsIC4vdHJpZ2dlci50c1xuLy8gQHJlcXVpcmUgY29yZS9wbHVjay50c1xuLy8gQHJlcXVpcmUgY29yZS92YXJpYWJsZXMudHNcblxuXG5mdW5jdGlvbiBnZXRWYWx1ZShlbGUpIHtcbiAgaWYgKGVsZS5tdWx0aXBsZSAmJiBlbGUub3B0aW9ucykgcmV0dXJuIHBsdWNrKGZpbHRlci5jYWxsKGVsZS5vcHRpb25zLCBmdW5jdGlvbiAob3B0aW9uKSB7XG4gICAgcmV0dXJuIG9wdGlvbi5zZWxlY3RlZCAmJiAhb3B0aW9uLmRpc2FibGVkICYmICFvcHRpb24ucGFyZW50Tm9kZS5kaXNhYmxlZDtcbiAgfSksICd2YWx1ZScpO1xuICByZXR1cm4gZWxlLnZhbHVlIHx8ICcnO1xufVxuXG52YXIgcXVlcnlFbmNvZGVTcGFjZVJlID0gLyUyMC9nLFxuICAgIHF1ZXJ5RW5jb2RlQ1JMRlJlID0gL1xccj9cXG4vZztcblxuZnVuY3Rpb24gcXVlcnlFbmNvZGUocHJvcCwgdmFsdWUpIHtcbiAgcmV0dXJuIFwiJlwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHByb3ApICsgXCI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUucmVwbGFjZShxdWVyeUVuY29kZUNSTEZSZSwgJ1xcclxcbicpKS5yZXBsYWNlKHF1ZXJ5RW5jb2RlU3BhY2VSZSwgJysnKTtcbn1cblxudmFyIHNraXBwYWJsZVJlID0gL2ZpbGV8cmVzZXR8c3VibWl0fGJ1dHRvbnxpbWFnZS9pLFxuICAgIGNoZWNrYWJsZVJlID0gL3JhZGlvfGNoZWNrYm94L2k7XG5cbmZuLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHF1ZXJ5ID0gJyc7XG4gIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgZWFjaChlbGUuZWxlbWVudHMgfHwgW2VsZV0sIGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICAgIGlmIChlbGUuZGlzYWJsZWQgfHwgIWVsZS5uYW1lIHx8IGVsZS50YWdOYW1lID09PSAnRklFTERTRVQnIHx8IHNraXBwYWJsZVJlLnRlc3QoZWxlLnR5cGUpIHx8IGNoZWNrYWJsZVJlLnRlc3QoZWxlLnR5cGUpICYmICFlbGUuY2hlY2tlZCkgcmV0dXJuO1xuICAgICAgdmFyIHZhbHVlID0gZ2V0VmFsdWUoZWxlKTtcblxuICAgICAgaWYgKCFpc1VuZGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgICAgdmFyIHZhbHVlcyA9IGlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgICAgICBlYWNoKHZhbHVlcywgZnVuY3Rpb24gKGksIHZhbHVlKSB7XG4gICAgICAgICAgcXVlcnkgKz0gcXVlcnlFbmNvZGUoZWxlLm5hbWUsIHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gcXVlcnkuc2xpY2UoMSk7XG59O1xuXG5mdW5jdGlvbiB2YWwodmFsdWUpIHtcbiAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGhpc1swXSAmJiBnZXRWYWx1ZSh0aGlzWzBdKTtcbiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgdmFyIGlzU2VsZWN0ID0gZWxlLm11bHRpcGxlICYmIGVsZS5vcHRpb25zO1xuXG4gICAgaWYgKGlzU2VsZWN0IHx8IGNoZWNrYWJsZVJlLnRlc3QoZWxlLnR5cGUpKSB7XG4gICAgICB2YXIgZWxlVmFsdWVfMSA9IGlzQXJyYXkodmFsdWUpID8gbWFwLmNhbGwodmFsdWUsIFN0cmluZykgOiBpc051bGwodmFsdWUpID8gW10gOiBbU3RyaW5nKHZhbHVlKV07XG5cbiAgICAgIGlmIChpc1NlbGVjdCkge1xuICAgICAgICBlYWNoKGVsZS5vcHRpb25zLCBmdW5jdGlvbiAoaSwgb3B0aW9uKSB7XG4gICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gZWxlVmFsdWVfMS5pbmRleE9mKG9wdGlvbi52YWx1ZSkgPj0gMDtcbiAgICAgICAgfSwgdHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGUuY2hlY2tlZCA9IGVsZVZhbHVlXzEuaW5kZXhPZihlbGUudmFsdWUpID49IDA7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZS52YWx1ZSA9IGlzVW5kZWZpbmVkKHZhbHVlKSB8fCBpc051bGwodmFsdWUpID8gJycgOiB2YWx1ZTtcbiAgICB9XG4gIH0pO1xufVxuXG5mbi52YWwgPSB2YWw7XG5cbmZuLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIHJldHVybiBlbGUuY2xvbmVOb2RlKHRydWUpO1xuICB9KTtcbn07XG5cbmZuLmRldGFjaCA9IGZ1bmN0aW9uIChjb21wYXJhdG9yKSB7XG4gIGZpbHRlcmVkKHRoaXMsIGNvbXBhcmF0b3IpLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIGlmIChlbGUucGFyZW50Tm9kZSkge1xuICAgICAgZWxlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbnZhciBmcmFnbWVudFJlID0gL15cXHMqPChcXHcrKVtePl0qPi8sXG4gICAgc2luZ2xlVGFnUmUgPSAvXjwoXFx3KylcXHMqXFwvPz4oPzo8XFwvXFwxPik/JC87XG52YXIgY29udGFpbmVycyA9IHtcbiAgJyonOiBkaXYsXG4gIHRyOiB0Ym9keSxcbiAgdGQ6IHRyLFxuICB0aDogdHIsXG4gIHRoZWFkOiB0YWJsZSxcbiAgdGJvZHk6IHRhYmxlLFxuICB0Zm9vdDogdGFibGVcbn07IC8vVE9ETzogQ3JlYXRlIGVsZW1lbnRzIGluc2lkZSBhIGRvY3VtZW50IGZyYWdtZW50LCBpbiBvcmRlciB0byBwcmV2ZW50IGlubGluZSBldmVudCBoYW5kbGVycyBmcm9tIGZpcmluZ1xuLy9UT0RPOiBFbnN1cmUgdGhlIGNyZWF0ZWQgZWxlbWVudHMgaGF2ZSB0aGUgZnJhZ21lbnQgYXMgdGhlaXIgcGFyZW50IGluc3RlYWQgb2YgbnVsbCwgdGhpcyBhbHNvIGVuc3VyZXMgd2UgY2FuIGRlYWwgd2l0aCBkZXRhdGNoZWQgbm9kZXMgbW9yZSByZWxpYWJseVxuXG5mdW5jdGlvbiBwYXJzZUhUTUwoaHRtbCkge1xuICBpZiAoIWlzU3RyaW5nKGh0bWwpKSByZXR1cm4gW107XG4gIGlmIChzaW5nbGVUYWdSZS50ZXN0KGh0bWwpKSByZXR1cm4gW2NyZWF0ZUVsZW1lbnQoUmVnRXhwLiQxKV07XG4gIHZhciBmcmFnbWVudCA9IGZyYWdtZW50UmUudGVzdChodG1sKSAmJiBSZWdFeHAuJDEsXG4gICAgICBjb250YWluZXIgPSBjb250YWluZXJzW2ZyYWdtZW50XSB8fCBjb250YWluZXJzWycqJ107XG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuICByZXR1cm4gY2FzaChjb250YWluZXIuY2hpbGROb2RlcykuZGV0YWNoKCkuZ2V0KCk7XG59XG5cbmNhc2gucGFyc2VIVE1MID0gcGFyc2VIVE1MO1xuXG5mbi5lbXB0eSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgd2hpbGUgKGVsZS5maXJzdENoaWxkKSB7XG4gICAgICBlbGUucmVtb3ZlQ2hpbGQoZWxlLmZpcnN0Q2hpbGQpO1xuICAgIH1cbiAgfSk7XG59O1xuXG5mdW5jdGlvbiBodG1sKGh0bWwpIHtcbiAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGhpc1swXSAmJiB0aGlzWzBdLmlubmVySFRNTDtcbiAgaWYgKGlzVW5kZWZpbmVkKGh0bWwpKSByZXR1cm4gdGhpcztcbiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgaWYgKCFpc0VsZW1lbnQoZWxlKSkgcmV0dXJuO1xuICAgIGVsZS5pbm5lckhUTUwgPSBodG1sO1xuICB9KTtcbn1cblxuZm4uaHRtbCA9IGh0bWw7XG5cbmZuLnJlbW92ZSA9IGZ1bmN0aW9uIChjb21wYXJhdG9yKSB7XG4gIGZpbHRlcmVkKHRoaXMsIGNvbXBhcmF0b3IpLmRldGFjaCgpLm9mZigpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIHRleHQodGV4dCkge1xuICBpZiAoaXNVbmRlZmluZWQodGV4dCkpIHJldHVybiB0aGlzWzBdID8gdGhpc1swXS50ZXh0Q29udGVudCA6ICcnO1xuICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICBpZiAoIWlzRWxlbWVudChlbGUpKSByZXR1cm47XG4gICAgZWxlLnRleHRDb250ZW50ID0gdGV4dDtcbiAgfSk7XG59XG5cbjtcbmZuLnRleHQgPSB0ZXh0O1xuXG5mbi51bndyYXAgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgaWYgKGVsZS50YWdOYW1lID09PSAnQk9EWScpIHJldHVybjtcbiAgICB2YXIgJGVsZSA9IGNhc2goZWxlKTtcbiAgICAkZWxlLnJlcGxhY2VXaXRoKCRlbGUuY2hpbGRyZW4oKSk7XG4gIH0pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbmZuLm9mZnNldCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVsZSA9IHRoaXNbMF07XG4gIGlmICghZWxlKSByZXR1cm47XG4gIHZhciByZWN0ID0gZWxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICByZXR1cm4ge1xuICAgIHRvcDogcmVjdC50b3AgKyB3aW4ucGFnZVlPZmZzZXQsXG4gICAgbGVmdDogcmVjdC5sZWZ0ICsgd2luLnBhZ2VYT2Zmc2V0XG4gIH07XG59O1xuXG5mbi5vZmZzZXRQYXJlbnQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgdmFyIG9mZnNldFBhcmVudCA9IGVsZS5vZmZzZXRQYXJlbnQ7XG5cbiAgICB3aGlsZSAob2Zmc2V0UGFyZW50ICYmIGNvbXB1dGVTdHlsZShvZmZzZXRQYXJlbnQsICdwb3NpdGlvbicpID09PSAnc3RhdGljJykge1xuICAgICAgb2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50Lm9mZnNldFBhcmVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gb2Zmc2V0UGFyZW50IHx8IGRvY0VsZTtcbiAgfSk7XG59O1xuXG5mbi5wb3NpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVsZSA9IHRoaXNbMF07XG4gIGlmICghZWxlKSByZXR1cm47XG4gIHZhciBpc0ZpeGVkID0gY29tcHV0ZVN0eWxlKGVsZSwgJ3Bvc2l0aW9uJykgPT09ICdmaXhlZCcsXG4gICAgICBvZmZzZXQgPSBpc0ZpeGVkID8gZWxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIDogdGhpcy5vZmZzZXQoKTtcblxuICBpZiAoIWlzRml4ZWQpIHtcbiAgICB2YXIgZG9jXzEgPSBlbGUub3duZXJEb2N1bWVudDtcbiAgICB2YXIgb2Zmc2V0UGFyZW50ID0gZWxlLm9mZnNldFBhcmVudCB8fCBkb2NfMS5kb2N1bWVudEVsZW1lbnQ7XG5cbiAgICB3aGlsZSAoKG9mZnNldFBhcmVudCA9PT0gZG9jXzEuYm9keSB8fCBvZmZzZXRQYXJlbnQgPT09IGRvY18xLmRvY3VtZW50RWxlbWVudCkgJiYgY29tcHV0ZVN0eWxlKG9mZnNldFBhcmVudCwgJ3Bvc2l0aW9uJykgPT09ICdzdGF0aWMnKSB7XG4gICAgICBvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQucGFyZW50Tm9kZTtcbiAgICB9XG5cbiAgICBpZiAob2Zmc2V0UGFyZW50ICE9PSBlbGUgJiYgaXNFbGVtZW50KG9mZnNldFBhcmVudCkpIHtcbiAgICAgIHZhciBwYXJlbnRPZmZzZXQgPSBjYXNoKG9mZnNldFBhcmVudCkub2Zmc2V0KCk7XG4gICAgICBvZmZzZXQudG9wIC09IHBhcmVudE9mZnNldC50b3AgKyBjb21wdXRlU3R5bGVJbnQob2Zmc2V0UGFyZW50LCAnYm9yZGVyVG9wV2lkdGgnKTtcbiAgICAgIG9mZnNldC5sZWZ0IC09IHBhcmVudE9mZnNldC5sZWZ0ICsgY29tcHV0ZVN0eWxlSW50KG9mZnNldFBhcmVudCwgJ2JvcmRlckxlZnRXaWR0aCcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdG9wOiBvZmZzZXQudG9wIC0gY29tcHV0ZVN0eWxlSW50KGVsZSwgJ21hcmdpblRvcCcpLFxuICAgIGxlZnQ6IG9mZnNldC5sZWZ0IC0gY29tcHV0ZVN0eWxlSW50KGVsZSwgJ21hcmdpbkxlZnQnKVxuICB9O1xufTtcblxuZm4uY2hpbGRyZW4gPSBmdW5jdGlvbiAoY29tcGFyYXRvcikge1xuICByZXR1cm4gZmlsdGVyZWQoY2FzaCh1bmlxdWUocGx1Y2sodGhpcywgZnVuY3Rpb24gKGVsZSkge1xuICAgIHJldHVybiBlbGUuY2hpbGRyZW47XG4gIH0pKSksIGNvbXBhcmF0b3IpO1xufTtcblxuZm4uY29udGVudHMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBjYXNoKHVuaXF1ZShwbHVjayh0aGlzLCBmdW5jdGlvbiAoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS50YWdOYW1lID09PSAnSUZSQU1FJyA/IFtlbGUuY29udGVudERvY3VtZW50XSA6IGVsZS50YWdOYW1lID09PSAnVEVNUExBVEUnID8gZWxlLmNvbnRlbnQuY2hpbGROb2RlcyA6IGVsZS5jaGlsZE5vZGVzO1xuICB9KSkpO1xufTtcblxuZm4uZmluZCA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICByZXR1cm4gY2FzaCh1bmlxdWUocGx1Y2sodGhpcywgZnVuY3Rpb24gKGVsZSkge1xuICAgIHJldHVybiBmaW5kKHNlbGVjdG9yLCBlbGUpO1xuICB9KSkpO1xufTsgLy8gQHJlcXVpcmUgY29yZS92YXJpYWJsZXMudHNcbi8vIEByZXF1aXJlIGNvbGxlY3Rpb24vZmlsdGVyLnRzXG4vLyBAcmVxdWlyZSB0cmF2ZXJzYWwvZmluZC50c1xuXG5cbnZhciBIVE1MQ0RBVEFSZSA9IC9eXFxzKjwhKD86XFxbQ0RBVEFcXFt8LS0pfCg/OlxcXVxcXXwtLSk+XFxzKiQvZyxcbiAgICBzY3JpcHRUeXBlUmUgPSAvXiR8Xm1vZHVsZSR8XFwvKGphdmF8ZWNtYSlzY3JpcHQvaSxcbiAgICBzY3JpcHRBdHRyaWJ1dGVzID0gWyd0eXBlJywgJ3NyYycsICdub25jZScsICdub01vZHVsZSddO1xuXG5mdW5jdGlvbiBldmFsU2NyaXB0cyhub2RlLCBkb2MpIHtcbiAgdmFyIGNvbGxlY3Rpb24gPSBjYXNoKG5vZGUpO1xuICBjb2xsZWN0aW9uLmZpbHRlcignc2NyaXB0JykuYWRkKGNvbGxlY3Rpb24uZmluZCgnc2NyaXB0JykpLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIGlmIChzY3JpcHRUeXBlUmUudGVzdChlbGUudHlwZSkgJiYgZG9jRWxlLmNvbnRhaW5zKGVsZSkpIHtcbiAgICAgIC8vIFRoZSBzY3JpcHQgdHlwZSBpcyBzdXBwb3J0ZWQgLy8gVGhlIGVsZW1lbnQgaXMgYXR0YWNoZWQgdG8gdGhlIERPTSAvLyBVc2luZyBgZG9jdW1lbnRFbGVtZW50YCBmb3IgYnJvYWRlciBicm93c2VyIHN1cHBvcnRcbiAgICAgIHZhciBzY3JpcHRfMSA9IGNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgc2NyaXB0XzEudGV4dCA9IGVsZS50ZXh0Q29udGVudC5yZXBsYWNlKEhUTUxDREFUQVJlLCAnJyk7XG4gICAgICBlYWNoKHNjcmlwdEF0dHJpYnV0ZXMsIGZ1bmN0aW9uIChpLCBhdHRyKSB7XG4gICAgICAgIGlmIChlbGVbYXR0cl0pIHNjcmlwdF8xW2F0dHJdID0gZWxlW2F0dHJdO1xuICAgICAgfSk7XG4gICAgICBkb2MuaGVhZC5pbnNlcnRCZWZvcmUoc2NyaXB0XzEsIG51bGwpO1xuICAgICAgZG9jLmhlYWQucmVtb3ZlQ2hpbGQoc2NyaXB0XzEpO1xuICAgIH1cbiAgfSk7XG59IC8vIEByZXF1aXJlIC4vZXZhbF9zY3JpcHRzLnRzXG5cblxuZnVuY3Rpb24gaW5zZXJ0RWxlbWVudChhbmNob3IsIHRhcmdldCwgbGVmdCwgaW5zaWRlLCBldmFsdWF0ZSkge1xuICBpZiAoaW5zaWRlKSB7XG4gICAgLy8gcHJlcGVuZC9hcHBlbmRcbiAgICBhbmNob3IuaW5zZXJ0QmVmb3JlKHRhcmdldCwgbGVmdCA/IGFuY2hvci5maXJzdENoaWxkIDogbnVsbCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYmVmb3JlL2FmdGVyXG4gICAgYW5jaG9yLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRhcmdldCwgbGVmdCA/IGFuY2hvciA6IGFuY2hvci5uZXh0U2libGluZyk7XG4gIH1cblxuICBpZiAoZXZhbHVhdGUpIHtcbiAgICBldmFsU2NyaXB0cyh0YXJnZXQsIGFuY2hvci5vd25lckRvY3VtZW50KTtcbiAgfVxufSAvLyBAcmVxdWlyZSAuL2luc2VydF9lbGVtZW50LnRzXG5cblxuZnVuY3Rpb24gaW5zZXJ0U2VsZWN0b3JzKHNlbGVjdG9ycywgYW5jaG9ycywgaW52ZXJzZSwgbGVmdCwgaW5zaWRlLCByZXZlcnNlTG9vcDEsIHJldmVyc2VMb29wMiwgcmV2ZXJzZUxvb3AzKSB7XG4gIGVhY2goc2VsZWN0b3JzLCBmdW5jdGlvbiAoc2ksIHNlbGVjdG9yKSB7XG4gICAgZWFjaChjYXNoKHNlbGVjdG9yKSwgZnVuY3Rpb24gKHRpLCB0YXJnZXQpIHtcbiAgICAgIGVhY2goY2FzaChhbmNob3JzKSwgZnVuY3Rpb24gKGFpLCBhbmNob3IpIHtcbiAgICAgICAgdmFyIGFuY2hvckZpbmFsID0gaW52ZXJzZSA/IHRhcmdldCA6IGFuY2hvcixcbiAgICAgICAgICAgIHRhcmdldEZpbmFsID0gaW52ZXJzZSA/IGFuY2hvciA6IHRhcmdldCxcbiAgICAgICAgICAgIGluZGV4RmluYWwgPSBpbnZlcnNlID8gdGkgOiBhaTtcbiAgICAgICAgaW5zZXJ0RWxlbWVudChhbmNob3JGaW5hbCwgIWluZGV4RmluYWwgPyB0YXJnZXRGaW5hbCA6IHRhcmdldEZpbmFsLmNsb25lTm9kZSh0cnVlKSwgbGVmdCwgaW5zaWRlLCAhaW5kZXhGaW5hbCk7XG4gICAgICB9LCByZXZlcnNlTG9vcDMpO1xuICAgIH0sIHJldmVyc2VMb29wMik7XG4gIH0sIHJldmVyc2VMb29wMSk7XG4gIHJldHVybiBhbmNob3JzO1xufVxuXG5mbi5hZnRlciA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGluc2VydFNlbGVjdG9ycyhhcmd1bWVudHMsIHRoaXMsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIHRydWUpO1xufTtcblxuZm4uYXBwZW5kID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gaW5zZXJ0U2VsZWN0b3JzKGFyZ3VtZW50cywgdGhpcywgZmFsc2UsIGZhbHNlLCB0cnVlKTtcbn07XG5cbmZuLmFwcGVuZFRvID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gIHJldHVybiBpbnNlcnRTZWxlY3RvcnMoYXJndW1lbnRzLCB0aGlzLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7XG59O1xuXG5mbi5iZWZvcmUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBpbnNlcnRTZWxlY3RvcnMoYXJndW1lbnRzLCB0aGlzLCBmYWxzZSwgdHJ1ZSk7XG59O1xuXG5mbi5pbnNlcnRBZnRlciA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICByZXR1cm4gaW5zZXJ0U2VsZWN0b3JzKGFyZ3VtZW50cywgdGhpcywgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUpO1xufTtcblxuZm4uaW5zZXJ0QmVmb3JlID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gIHJldHVybiBpbnNlcnRTZWxlY3RvcnMoYXJndW1lbnRzLCB0aGlzLCB0cnVlLCB0cnVlKTtcbn07XG5cbmZuLnByZXBlbmQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBpbnNlcnRTZWxlY3RvcnMoYXJndW1lbnRzLCB0aGlzLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7XG59O1xuXG5mbi5wcmVwZW5kVG8gPSBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgcmV0dXJuIGluc2VydFNlbGVjdG9ycyhhcmd1bWVudHMsIHRoaXMsIHRydWUsIHRydWUsIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7XG59O1xuXG5mbi5yZXBsYWNlV2l0aCA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICByZXR1cm4gdGhpcy5iZWZvcmUoc2VsZWN0b3IpLnJlbW92ZSgpO1xufTtcblxuZm4ucmVwbGFjZUFsbCA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICBjYXNoKHNlbGVjdG9yKS5yZXBsYWNlV2l0aCh0aGlzKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mbi53cmFwQWxsID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gIHZhciBzdHJ1Y3R1cmUgPSBjYXNoKHNlbGVjdG9yKSxcbiAgICAgIHdyYXBwZXIgPSBzdHJ1Y3R1cmVbMF07XG5cbiAgd2hpbGUgKHdyYXBwZXIuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgd3JhcHBlciA9IHdyYXBwZXIuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gIH1cblxuICB0aGlzLmZpcnN0KCkuYmVmb3JlKHN0cnVjdHVyZSk7XG4gIHJldHVybiB0aGlzLmFwcGVuZFRvKHdyYXBwZXIpO1xufTtcblxuZm4ud3JhcCA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICB2YXIgd3JhcHBlciA9IGNhc2goc2VsZWN0b3IpWzBdO1xuICAgIGNhc2goZWxlKS53cmFwQWxsKCFpID8gd3JhcHBlciA6IHdyYXBwZXIuY2xvbmVOb2RlKHRydWUpKTtcbiAgfSk7XG59O1xuXG5mbi53cmFwSW5uZXIgPSBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgdmFyICRlbGUgPSBjYXNoKGVsZSksXG4gICAgICAgIGNvbnRlbnRzID0gJGVsZS5jb250ZW50cygpO1xuICAgIGNvbnRlbnRzLmxlbmd0aCA/IGNvbnRlbnRzLndyYXBBbGwoc2VsZWN0b3IpIDogJGVsZS5hcHBlbmQoc2VsZWN0b3IpO1xuICB9KTtcbn07XG5cbmZuLmhhcyA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICB2YXIgY29tcGFyYXRvciA9IGlzU3RyaW5nKHNlbGVjdG9yKSA/IGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICByZXR1cm4gZmluZChzZWxlY3RvciwgZWxlKS5sZW5ndGg7XG4gIH0gOiBmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5jb250YWlucyhzZWxlY3Rvcik7XG4gIH07XG4gIHJldHVybiB0aGlzLmZpbHRlcihjb21wYXJhdG9yKTtcbn07XG5cbmZuLmlzID0gZnVuY3Rpb24gKGNvbXBhcmF0b3IpIHtcbiAgdmFyIGNvbXBhcmUgPSBnZXRDb21wYXJlRnVuY3Rpb24oY29tcGFyYXRvcik7XG4gIHJldHVybiBzb21lLmNhbGwodGhpcywgZnVuY3Rpb24gKGVsZSwgaSkge1xuICAgIHJldHVybiBjb21wYXJlLmNhbGwoZWxlLCBpLCBlbGUpO1xuICB9KTtcbn07XG5cbmZuLm5leHQgPSBmdW5jdGlvbiAoY29tcGFyYXRvciwgX2FsbCwgX3VudGlsKSB7XG4gIHJldHVybiBmaWx0ZXJlZChjYXNoKHVuaXF1ZShwbHVjayh0aGlzLCAnbmV4dEVsZW1lbnRTaWJsaW5nJywgX2FsbCwgX3VudGlsKSkpLCBjb21wYXJhdG9yKTtcbn07XG5cbmZuLm5leHRBbGwgPSBmdW5jdGlvbiAoY29tcGFyYXRvcikge1xuICByZXR1cm4gdGhpcy5uZXh0KGNvbXBhcmF0b3IsIHRydWUpO1xufTtcblxuZm4ubmV4dFVudGlsID0gZnVuY3Rpb24gKHVudGlsLCBjb21wYXJhdG9yKSB7XG4gIHJldHVybiB0aGlzLm5leHQoY29tcGFyYXRvciwgdHJ1ZSwgdW50aWwpO1xufTtcblxuZm4ubm90ID0gZnVuY3Rpb24gKGNvbXBhcmF0b3IpIHtcbiAgdmFyIGNvbXBhcmUgPSBnZXRDb21wYXJlRnVuY3Rpb24oY29tcGFyYXRvcik7XG4gIHJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgcmV0dXJuICghaXNTdHJpbmcoY29tcGFyYXRvcikgfHwgaXNFbGVtZW50KGVsZSkpICYmICFjb21wYXJlLmNhbGwoZWxlLCBpLCBlbGUpO1xuICB9KTtcbn07XG5cbmZuLnBhcmVudCA9IGZ1bmN0aW9uIChjb21wYXJhdG9yKSB7XG4gIHJldHVybiBmaWx0ZXJlZChjYXNoKHVuaXF1ZShwbHVjayh0aGlzLCAncGFyZW50Tm9kZScpKSksIGNvbXBhcmF0b3IpO1xufTtcblxuZm4uaW5kZXggPSBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgdmFyIGNoaWxkID0gc2VsZWN0b3IgPyBjYXNoKHNlbGVjdG9yKVswXSA6IHRoaXNbMF0sXG4gICAgICBjb2xsZWN0aW9uID0gc2VsZWN0b3IgPyB0aGlzIDogY2FzaChjaGlsZCkucGFyZW50KCkuY2hpbGRyZW4oKTtcbiAgcmV0dXJuIGluZGV4T2YuY2FsbChjb2xsZWN0aW9uLCBjaGlsZCk7XG59O1xuXG5mbi5jbG9zZXN0ID0gZnVuY3Rpb24gKGNvbXBhcmF0b3IpIHtcbiAgdmFyIGZpbHRlcmVkID0gdGhpcy5maWx0ZXIoY29tcGFyYXRvcik7XG4gIGlmIChmaWx0ZXJlZC5sZW5ndGgpIHJldHVybiBmaWx0ZXJlZDtcbiAgdmFyICRwYXJlbnQgPSB0aGlzLnBhcmVudCgpO1xuICBpZiAoISRwYXJlbnQubGVuZ3RoKSByZXR1cm4gZmlsdGVyZWQ7XG4gIHJldHVybiAkcGFyZW50LmNsb3Nlc3QoY29tcGFyYXRvcik7XG59O1xuXG5mbi5wYXJlbnRzID0gZnVuY3Rpb24gKGNvbXBhcmF0b3IsIF91bnRpbCkge1xuICByZXR1cm4gZmlsdGVyZWQoY2FzaCh1bmlxdWUocGx1Y2sodGhpcywgJ3BhcmVudEVsZW1lbnQnLCB0cnVlLCBfdW50aWwpKSksIGNvbXBhcmF0b3IpO1xufTtcblxuZm4ucGFyZW50c1VudGlsID0gZnVuY3Rpb24gKHVudGlsLCBjb21wYXJhdG9yKSB7XG4gIHJldHVybiB0aGlzLnBhcmVudHMoY29tcGFyYXRvciwgdW50aWwpO1xufTtcblxuZm4ucHJldiA9IGZ1bmN0aW9uIChjb21wYXJhdG9yLCBfYWxsLCBfdW50aWwpIHtcbiAgcmV0dXJuIGZpbHRlcmVkKGNhc2godW5pcXVlKHBsdWNrKHRoaXMsICdwcmV2aW91c0VsZW1lbnRTaWJsaW5nJywgX2FsbCwgX3VudGlsKSkpLCBjb21wYXJhdG9yKTtcbn07XG5cbmZuLnByZXZBbGwgPSBmdW5jdGlvbiAoY29tcGFyYXRvcikge1xuICByZXR1cm4gdGhpcy5wcmV2KGNvbXBhcmF0b3IsIHRydWUpO1xufTtcblxuZm4ucHJldlVudGlsID0gZnVuY3Rpb24gKHVudGlsLCBjb21wYXJhdG9yKSB7XG4gIHJldHVybiB0aGlzLnByZXYoY29tcGFyYXRvciwgdHJ1ZSwgdW50aWwpO1xufTtcblxuZm4uc2libGluZ3MgPSBmdW5jdGlvbiAoY29tcGFyYXRvcikge1xuICByZXR1cm4gZmlsdGVyZWQoY2FzaCh1bmlxdWUocGx1Y2sodGhpcywgZnVuY3Rpb24gKGVsZSkge1xuICAgIHJldHVybiBjYXNoKGVsZSkucGFyZW50KCkuY2hpbGRyZW4oKS5ub3QoZWxlKTtcbiAgfSkpKSwgY29tcGFyYXRvcik7XG59OyAvLyBAb3B0aW9uYWwgLi9jaGlsZHJlbi50c1xuLy8gQG9wdGlvbmFsIC4vY2xvc2VzdC50c1xuLy8gQG9wdGlvbmFsIC4vY29udGVudHMudHNcbi8vIEBvcHRpb25hbCAuL2ZpbmQudHNcbi8vIEBvcHRpb25hbCAuL2hhcy50c1xuLy8gQG9wdGlvbmFsIC4vaXMudHNcbi8vIEBvcHRpb25hbCAuL25leHQudHNcbi8vIEBvcHRpb25hbCAuL25leHRfYWxsLnRzXG4vLyBAb3B0aW9uYWwgLi9uZXh0X3VudGlsLnRzXG4vLyBAb3B0aW9uYWwgLi9ub3QudHNcbi8vIEBvcHRpb25hbCAuL3BhcmVudC50c1xuLy8gQG9wdGlvbmFsIC4vcGFyZW50cy50c1xuLy8gQG9wdGlvbmFsIC4vcGFyZW50c191bnRpbC50c1xuLy8gQG9wdGlvbmFsIC4vcHJldi50c1xuLy8gQG9wdGlvbmFsIC4vcHJldl9hbGwudHNcbi8vIEBvcHRpb25hbCAuL3ByZXZfdW50aWwudHNcbi8vIEBvcHRpb25hbCAuL3NpYmxpbmdzLnRzXG4vLyBAb3B0aW9uYWwgYXR0cmlidXRlcy9pbmRleC50c1xuLy8gQG9wdGlvbmFsIGNvbGxlY3Rpb24vaW5kZXgudHNcbi8vIEBvcHRpb25hbCBjc3MvaW5kZXgudHNcbi8vIEBvcHRpb25hbCBkYXRhL2luZGV4LnRzXG4vLyBAb3B0aW9uYWwgZGltZW5zaW9ucy9pbmRleC50c1xuLy8gQG9wdGlvbmFsIGVmZmVjdHMvaW5kZXgudHNcbi8vIEBvcHRpb25hbCBldmVudHMvaW5kZXgudHNcbi8vIEBvcHRpb25hbCBmb3Jtcy9pbmRleC50c1xuLy8gQG9wdGlvbmFsIG1hbmlwdWxhdGlvbi9pbmRleC50c1xuLy8gQG9wdGlvbmFsIG9mZnNldC9pbmRleC50c1xuLy8gQG9wdGlvbmFsIHRyYXZlcnNhbC9pbmRleC50c1xuLy8gQHJlcXVpcmUgY29yZS9pbmRleC50c1xuLy8gQHByaW9yaXR5IC0xMDBcbi8vIEByZXF1aXJlIC4vY2FzaC50c1xuLy8gQHJlcXVpcmUgLi92YXJpYWJsZXMudHNcblxuXG5pZiAodHlwZW9mIGV4cG9ydHMgIT09ICd1bmRlZmluZWQnKSB7XG4gIC8vIE5vZGUuanNcbiAgbW9kdWxlLmV4cG9ydHMgPSBjYXNoO1xufSBlbHNlIHtcbiAgLy8gQnJvd3NlclxuICB3aW5bJ2Nhc2gnXSA9IHdpblsnJCddID0gY2FzaDtcbn1cbn0pKCk7IiwiJ3VzZSBzdHJpY3QnO1xuXG4oZnVuY3Rpb24gKCkge1xuICB2YXIgb3V0JCA9IHR5cGVvZiBleHBvcnRzICE9ICd1bmRlZmluZWQnICYmIGV4cG9ydHMgfHwgdHlwZW9mIGRlZmluZSAhPSAndW5kZWZpbmVkJyAmJiB7fSB8fCB0aGlzIHx8IHdpbmRvdztcbiAgaWYgKHR5cGVvZiBkZWZpbmUgIT09ICd1bmRlZmluZWQnKSBkZWZpbmUoJ3NhdmUtc3ZnLWFzLXBuZycsIFtdLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG91dCQ7XG4gIH0pO1xuICBvdXQkLmRlZmF1bHQgPSBvdXQkO1xuXG4gIHZhciB4bWxOcyA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyc7XG4gIHZhciB4aHRtbE5zID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnO1xuICB2YXIgc3ZnTnMgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnO1xuICB2YXIgZG9jdHlwZSA9ICc8P3htbCB2ZXJzaW9uPVwiMS4wXCIgc3RhbmRhbG9uZT1cIm5vXCI/PjwhRE9DVFlQRSBzdmcgUFVCTElDIFwiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU5cIiBcImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZFwiIFs8IUVOVElUWSBuYnNwIFwiJiMxNjA7XCI+XT4nO1xuICB2YXIgdXJsUmVnZXggPSAvdXJsXFwoW1wiJ10/KC4rPylbXCInXT9cXCkvO1xuICB2YXIgZm9udEZvcm1hdHMgPSB7XG4gICAgd29mZjI6ICdmb250L3dvZmYyJyxcbiAgICB3b2ZmOiAnZm9udC93b2ZmJyxcbiAgICBvdGY6ICdhcHBsaWNhdGlvbi94LWZvbnQtb3BlbnR5cGUnLFxuICAgIHR0ZjogJ2FwcGxpY2F0aW9uL3gtZm9udC10dGYnLFxuICAgIGVvdDogJ2FwcGxpY2F0aW9uL3ZuZC5tcy1mb250b2JqZWN0JyxcbiAgICBzZm50OiAnYXBwbGljYXRpb24vZm9udC1zZm50JyxcbiAgICBzdmc6ICdpbWFnZS9zdmcreG1sJ1xuICB9O1xuXG4gIHZhciBpc0VsZW1lbnQgPSBmdW5jdGlvbiBpc0VsZW1lbnQob2JqKSB7XG4gICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8IG9iaiBpbnN0YW5jZW9mIFNWR0VsZW1lbnQ7XG4gIH07XG4gIHZhciByZXF1aXJlRG9tTm9kZSA9IGZ1bmN0aW9uIHJlcXVpcmVEb21Ob2RlKGVsKSB7XG4gICAgaWYgKCFpc0VsZW1lbnQoZWwpKSB0aHJvdyBuZXcgRXJyb3IoJ2FuIEhUTUxFbGVtZW50IG9yIFNWR0VsZW1lbnQgaXMgcmVxdWlyZWQ7IGdvdCAnICsgZWwpO1xuICB9O1xuICB2YXIgcmVxdWlyZURvbU5vZGVQcm9taXNlID0gZnVuY3Rpb24gcmVxdWlyZURvbU5vZGVQcm9taXNlKGVsKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGlmIChpc0VsZW1lbnQoZWwpKSByZXNvbHZlKGVsKTtlbHNlIHJlamVjdChuZXcgRXJyb3IoJ2FuIEhUTUxFbGVtZW50IG9yIFNWR0VsZW1lbnQgaXMgcmVxdWlyZWQ7IGdvdCAnICsgZWwpKTtcbiAgICB9KTtcbiAgfTtcbiAgdmFyIGlzRXh0ZXJuYWwgPSBmdW5jdGlvbiBpc0V4dGVybmFsKHVybCkge1xuICAgIHJldHVybiB1cmwgJiYgdXJsLmxhc3RJbmRleE9mKCdodHRwJywgMCkgPT09IDAgJiYgdXJsLmxhc3RJbmRleE9mKHdpbmRvdy5sb2NhdGlvbi5ob3N0KSA9PT0gLTE7XG4gIH07XG5cbiAgdmFyIGdldEZvbnRNaW1lVHlwZUZyb21VcmwgPSBmdW5jdGlvbiBnZXRGb250TWltZVR5cGVGcm9tVXJsKGZvbnRVcmwpIHtcbiAgICB2YXIgZm9ybWF0cyA9IE9iamVjdC5rZXlzKGZvbnRGb3JtYXRzKS5maWx0ZXIoZnVuY3Rpb24gKGV4dGVuc2lvbikge1xuICAgICAgcmV0dXJuIGZvbnRVcmwuaW5kZXhPZignLicgKyBleHRlbnNpb24pID4gMDtcbiAgICB9KS5tYXAoZnVuY3Rpb24gKGV4dGVuc2lvbikge1xuICAgICAgcmV0dXJuIGZvbnRGb3JtYXRzW2V4dGVuc2lvbl07XG4gICAgfSk7XG4gICAgaWYgKGZvcm1hdHMpIHJldHVybiBmb3JtYXRzWzBdO1xuICAgIGNvbnNvbGUuZXJyb3IoJ1Vua25vd24gZm9udCBmb3JtYXQgZm9yICcgKyBmb250VXJsICsgJy4gRm9udHMgbWF5IG5vdCBiZSB3b3JraW5nIGNvcnJlY3RseS4nKTtcbiAgICByZXR1cm4gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7XG4gIH07XG5cbiAgdmFyIGFycmF5QnVmZmVyVG9CYXNlNjQgPSBmdW5jdGlvbiBhcnJheUJ1ZmZlclRvQmFzZTY0KGJ1ZmZlcikge1xuICAgIHZhciBiaW5hcnkgPSAnJztcbiAgICB2YXIgYnl0ZXMgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMuYnl0ZUxlbmd0aDsgaSsrKSB7XG4gICAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSk7XG4gICAgfXJldHVybiB3aW5kb3cuYnRvYShiaW5hcnkpO1xuICB9O1xuXG4gIHZhciBnZXREaW1lbnNpb24gPSBmdW5jdGlvbiBnZXREaW1lbnNpb24oZWwsIGNsb25lLCBkaW0pIHtcbiAgICB2YXIgdiA9IGVsLnZpZXdCb3ggJiYgZWwudmlld0JveC5iYXNlVmFsICYmIGVsLnZpZXdCb3guYmFzZVZhbFtkaW1dIHx8IGNsb25lLmdldEF0dHJpYnV0ZShkaW0pICE9PSBudWxsICYmICFjbG9uZS5nZXRBdHRyaWJ1dGUoZGltKS5tYXRjaCgvJSQvKSAmJiBwYXJzZUludChjbG9uZS5nZXRBdHRyaWJ1dGUoZGltKSkgfHwgZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbZGltXSB8fCBwYXJzZUludChjbG9uZS5zdHlsZVtkaW1dKSB8fCBwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCkuZ2V0UHJvcGVydHlWYWx1ZShkaW0pKTtcbiAgICByZXR1cm4gdHlwZW9mIHYgPT09ICd1bmRlZmluZWQnIHx8IHYgPT09IG51bGwgfHwgaXNOYU4ocGFyc2VGbG9hdCh2KSkgPyAwIDogdjtcbiAgfTtcblxuICB2YXIgZ2V0RGltZW5zaW9ucyA9IGZ1bmN0aW9uIGdldERpbWVuc2lvbnMoZWwsIGNsb25lLCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgaWYgKGVsLnRhZ05hbWUgPT09ICdzdmcnKSByZXR1cm4ge1xuICAgICAgd2lkdGg6IHdpZHRoIHx8IGdldERpbWVuc2lvbihlbCwgY2xvbmUsICd3aWR0aCcpLFxuICAgICAgaGVpZ2h0OiBoZWlnaHQgfHwgZ2V0RGltZW5zaW9uKGVsLCBjbG9uZSwgJ2hlaWdodCcpXG4gICAgfTtlbHNlIGlmIChlbC5nZXRCQm94KSB7XG4gICAgICB2YXIgX2VsJGdldEJCb3ggPSBlbC5nZXRCQm94KCksXG4gICAgICAgICAgeCA9IF9lbCRnZXRCQm94LngsXG4gICAgICAgICAgeSA9IF9lbCRnZXRCQm94LnksXG4gICAgICAgICAgX3dpZHRoID0gX2VsJGdldEJCb3gud2lkdGgsXG4gICAgICAgICAgX2hlaWdodCA9IF9lbCRnZXRCQm94LmhlaWdodDtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgd2lkdGg6IHggKyBfd2lkdGgsXG4gICAgICAgIGhlaWdodDogeSArIF9oZWlnaHRcbiAgICAgIH07XG4gICAgfVxuICB9O1xuXG4gIHZhciByZUVuY29kZSA9IGZ1bmN0aW9uIHJlRW5jb2RlKGRhdGEpIHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVuY29kZVVSSUNvbXBvbmVudChkYXRhKS5yZXBsYWNlKC8lKFswLTlBLUZdezJ9KS9nLCBmdW5jdGlvbiAobWF0Y2gsIHAxKSB7XG4gICAgICB2YXIgYyA9IFN0cmluZy5mcm9tQ2hhckNvZGUoJzB4JyArIHAxKTtcbiAgICAgIHJldHVybiBjID09PSAnJScgPyAnJTI1JyA6IGM7XG4gICAgfSkpO1xuICB9O1xuXG4gIHZhciB1cmlUb0Jsb2IgPSBmdW5jdGlvbiB1cmlUb0Jsb2IodXJpKSB7XG4gICAgdmFyIGJ5dGVTdHJpbmcgPSB3aW5kb3cuYXRvYih1cmkuc3BsaXQoJywnKVsxXSk7XG4gICAgdmFyIG1pbWVTdHJpbmcgPSB1cmkuc3BsaXQoJywnKVswXS5zcGxpdCgnOicpWzFdLnNwbGl0KCc7JylbMF07XG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihieXRlU3RyaW5nLmxlbmd0aCk7XG4gICAgdmFyIGludEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVTdHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIGludEFycmF5W2ldID0gYnl0ZVN0cmluZy5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEJsb2IoW2J1ZmZlcl0sIHsgdHlwZTogbWltZVN0cmluZyB9KTtcbiAgfTtcblxuICB2YXIgcXVlcnkgPSBmdW5jdGlvbiBxdWVyeShlbCwgc2VsZWN0b3IpIHtcbiAgICBpZiAoIXNlbGVjdG9yKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBlbC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSB8fCBlbC5wYXJlbnROb2RlICYmIGVsLnBhcmVudE5vZGUucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQgQ1NTIHNlbGVjdG9yIFwiJyArIHNlbGVjdG9yICsgJ1wiJywgZXJyKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGRldGVjdENzc0ZvbnQgPSBmdW5jdGlvbiBkZXRlY3RDc3NGb250KHJ1bGUsIGhyZWYpIHtcbiAgICAvLyBNYXRjaCBDU1MgZm9udC1mYWNlIHJ1bGVzIHRvIGV4dGVybmFsIGxpbmtzLlxuICAgIC8vIEBmb250LWZhY2Uge1xuICAgIC8vICAgc3JjOiBsb2NhbCgnQWJlbCcpLCB1cmwoaHR0cHM6Ly9mb250cy5nc3RhdGljLmNvbS9zL2FiZWwvdjYvVXpOLWllalIxVm9YVTJPYy03THNidmVzWlcyeE9RLXhzTnFPNDdtNTVEQS53b2ZmMik7XG4gICAgLy8gfVxuICAgIHZhciBtYXRjaCA9IHJ1bGUuY3NzVGV4dC5tYXRjaCh1cmxSZWdleCk7XG4gICAgdmFyIHVybCA9IG1hdGNoICYmIG1hdGNoWzFdIHx8ICcnO1xuICAgIGlmICghdXJsIHx8IHVybC5tYXRjaCgvXmRhdGE6LykgfHwgdXJsID09PSAnYWJvdXQ6YmxhbmsnKSByZXR1cm47XG4gICAgdmFyIGZ1bGxVcmwgPSB1cmwuc3RhcnRzV2l0aCgnLi4vJykgPyBocmVmICsgJy8uLi8nICsgdXJsIDogdXJsLnN0YXJ0c1dpdGgoJy4vJykgPyBocmVmICsgJy8uJyArIHVybCA6IHVybDtcbiAgICByZXR1cm4ge1xuICAgICAgdGV4dDogcnVsZS5jc3NUZXh0LFxuICAgICAgZm9ybWF0OiBnZXRGb250TWltZVR5cGVGcm9tVXJsKGZ1bGxVcmwpLFxuICAgICAgdXJsOiBmdWxsVXJsXG4gICAgfTtcbiAgfTtcblxuICB2YXIgaW5saW5lSW1hZ2VzID0gZnVuY3Rpb24gaW5saW5lSW1hZ2VzKGVsKSB7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKEFycmF5LmZyb20oZWwucXVlcnlTZWxlY3RvckFsbCgnaW1hZ2UnKSkubWFwKGZ1bmN0aW9uIChpbWFnZSkge1xuICAgICAgdmFyIGhyZWYgPSBpbWFnZS5nZXRBdHRyaWJ1dGVOUygnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycsICdocmVmJykgfHwgaW1hZ2UuZ2V0QXR0cmlidXRlKCdocmVmJyk7XG4gICAgICBpZiAoIWhyZWYpIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gICAgICBpZiAoaXNFeHRlcm5hbChocmVmKSkge1xuICAgICAgICBocmVmICs9IChocmVmLmluZGV4T2YoJz8nKSA9PT0gLTEgPyAnPycgOiAnJicpICsgJ3Q9JyArIG5ldyBEYXRlKCkudmFsdWVPZigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICB2YXIgaW1nID0gbmV3IEltYWdlKCk7XG4gICAgICAgIGltZy5jcm9zc09yaWdpbiA9ICdhbm9ueW1vdXMnO1xuICAgICAgICBpbWcuc3JjID0gaHJlZjtcbiAgICAgICAgaW1nLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoJ0NvdWxkIG5vdCBsb2FkICcgKyBocmVmKSk7XG4gICAgICAgIH07XG4gICAgICAgIGltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY2FudmFzLndpZHRoID0gaW1nLndpZHRoO1xuICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSBpbWcuaGVpZ2h0O1xuICAgICAgICAgIGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpLmRyYXdJbWFnZShpbWcsIDAsIDApO1xuICAgICAgICAgIGltYWdlLnNldEF0dHJpYnV0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywgJ2hyZWYnLCBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKSk7XG4gICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH0pKTtcbiAgfTtcblxuICB2YXIgY2FjaGVkRm9udHMgPSB7fTtcbiAgdmFyIGlubGluZUZvbnRzID0gZnVuY3Rpb24gaW5saW5lRm9udHMoZm9udHMpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoZm9udHMubWFwKGZ1bmN0aW9uIChmb250KSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBpZiAoY2FjaGVkRm9udHNbZm9udC51cmxdKSByZXR1cm4gcmVzb2x2ZShjYWNoZWRGb250c1tmb250LnVybF0pO1xuXG4gICAgICAgIHZhciByZXEgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgcmVxLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gVE9ETzogaXQgbWF5IGFsc28gYmUgd29ydGggaXQgdG8gd2FpdCB1bnRpbCBmb250cyBhcmUgZnVsbHkgbG9hZGVkIGJlZm9yZVxuICAgICAgICAgIC8vIGF0dGVtcHRpbmcgdG8gcmFzdGVyaXplIHRoZW0uIChlLmcuIHVzZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRm9udEZhY2VTZXQpXG4gICAgICAgICAgdmFyIGZvbnRJbkJhc2U2NCA9IGFycmF5QnVmZmVyVG9CYXNlNjQocmVxLnJlc3BvbnNlKTtcbiAgICAgICAgICB2YXIgZm9udFVyaSA9IGZvbnQudGV4dC5yZXBsYWNlKHVybFJlZ2V4LCAndXJsKFwiZGF0YTonICsgZm9udC5mb3JtYXQgKyAnO2Jhc2U2NCwnICsgZm9udEluQmFzZTY0ICsgJ1wiKScpICsgJ1xcbic7XG4gICAgICAgICAgY2FjaGVkRm9udHNbZm9udC51cmxdID0gZm9udFVyaTtcbiAgICAgICAgICByZXNvbHZlKGZvbnRVcmkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVxLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBsb2FkIGZvbnQgZnJvbTogJyArIGZvbnQudXJsLCBlKTtcbiAgICAgICAgICBjYWNoZWRGb250c1tmb250LnVybF0gPSBudWxsO1xuICAgICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXEuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybignQWJvcnRlZCBsb2FkaW5nIGZvbnQgZnJvbTogJyArIGZvbnQudXJsLCBlKTtcbiAgICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVxLm9wZW4oJ0dFVCcsIGZvbnQudXJsKTtcbiAgICAgICAgcmVxLnJlc3BvbnNlVHlwZSA9ICdhcnJheWJ1ZmZlcic7XG4gICAgICAgIHJlcS5zZW5kKCk7XG4gICAgICB9KTtcbiAgICB9KSkudGhlbihmdW5jdGlvbiAoZm9udENzcykge1xuICAgICAgcmV0dXJuIGZvbnRDc3MuZmlsdGVyKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiB4O1xuICAgICAgfSkuam9pbignJyk7XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIGNhY2hlZFJ1bGVzID0gbnVsbDtcbiAgdmFyIHN0eWxlU2hlZXRSdWxlcyA9IGZ1bmN0aW9uIHN0eWxlU2hlZXRSdWxlcygpIHtcbiAgICBpZiAoY2FjaGVkUnVsZXMpIHJldHVybiBjYWNoZWRSdWxlcztcbiAgICByZXR1cm4gY2FjaGVkUnVsZXMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnN0eWxlU2hlZXRzKS5tYXAoZnVuY3Rpb24gKHNoZWV0KSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4geyBydWxlczogc2hlZXQuY3NzUnVsZXMsIGhyZWY6IHNoZWV0LmhyZWYgfTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdTdHlsZXNoZWV0IGNvdWxkIG5vdCBiZSBsb2FkZWQ6ICcgKyBzaGVldC5ocmVmLCBlKTtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIHZhciBpbmxpbmVDc3MgPSBmdW5jdGlvbiBpbmxpbmVDc3MoZWwsIG9wdGlvbnMpIHtcbiAgICB2YXIgX3JlZiA9IG9wdGlvbnMgfHwge30sXG4gICAgICAgIHNlbGVjdG9yUmVtYXAgPSBfcmVmLnNlbGVjdG9yUmVtYXAsXG4gICAgICAgIG1vZGlmeVN0eWxlID0gX3JlZi5tb2RpZnlTdHlsZSxcbiAgICAgICAgbW9kaWZ5Q3NzID0gX3JlZi5tb2RpZnlDc3MsXG4gICAgICAgIGZvbnRzID0gX3JlZi5mb250cyxcbiAgICAgICAgZXhjbHVkZVVudXNlZENzcyA9IF9yZWYuZXhjbHVkZVVudXNlZENzcztcblxuICAgIHZhciBnZW5lcmF0ZUNzcyA9IG1vZGlmeUNzcyB8fCBmdW5jdGlvbiAoc2VsZWN0b3IsIHByb3BlcnRpZXMpIHtcbiAgICAgIHZhciBzZWwgPSBzZWxlY3RvclJlbWFwID8gc2VsZWN0b3JSZW1hcChzZWxlY3RvcikgOiBzZWxlY3RvcjtcbiAgICAgIHZhciBwcm9wcyA9IG1vZGlmeVN0eWxlID8gbW9kaWZ5U3R5bGUocHJvcGVydGllcykgOiBwcm9wZXJ0aWVzO1xuICAgICAgcmV0dXJuIHNlbCArICd7JyArIHByb3BzICsgJ31cXG4nO1xuICAgIH07XG4gICAgdmFyIGNzcyA9IFtdO1xuICAgIHZhciBkZXRlY3RGb250cyA9IHR5cGVvZiBmb250cyA9PT0gJ3VuZGVmaW5lZCc7XG4gICAgdmFyIGZvbnRMaXN0ID0gZm9udHMgfHwgW107XG4gICAgc3R5bGVTaGVldFJ1bGVzKCkuZm9yRWFjaChmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgIHZhciBydWxlcyA9IF9yZWYyLnJ1bGVzLFxuICAgICAgICAgIGhyZWYgPSBfcmVmMi5ocmVmO1xuXG4gICAgICBpZiAoIXJ1bGVzKSByZXR1cm47XG4gICAgICBBcnJheS5mcm9tKHJ1bGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChydWxlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcnVsZS5zdHlsZSAhPSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGlmIChxdWVyeShlbCwgcnVsZS5zZWxlY3RvclRleHQpKSBjc3MucHVzaChnZW5lcmF0ZUNzcyhydWxlLnNlbGVjdG9yVGV4dCwgcnVsZS5zdHlsZS5jc3NUZXh0KSk7ZWxzZSBpZiAoZGV0ZWN0Rm9udHMgJiYgcnVsZS5jc3NUZXh0Lm1hdGNoKC9eQGZvbnQtZmFjZS8pKSB7XG4gICAgICAgICAgICB2YXIgZm9udCA9IGRldGVjdENzc0ZvbnQocnVsZSwgaHJlZik7XG4gICAgICAgICAgICBpZiAoZm9udCkgZm9udExpc3QucHVzaChmb250KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFleGNsdWRlVW51c2VkQ3NzKSB7XG4gICAgICAgICAgICBjc3MucHVzaChydWxlLmNzc1RleHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaW5saW5lRm9udHMoZm9udExpc3QpLnRoZW4oZnVuY3Rpb24gKGZvbnRDc3MpIHtcbiAgICAgIHJldHVybiBjc3Muam9pbignXFxuJykgKyBmb250Q3NzO1xuICAgIH0pO1xuICB9O1xuXG4gIHZhciBkb3dubG9hZE9wdGlvbnMgPSBmdW5jdGlvbiBkb3dubG9hZE9wdGlvbnMoKSB7XG4gICAgaWYgKCFuYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYiAmJiAhKCdkb3dubG9hZCcgaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpKSkge1xuICAgICAgcmV0dXJuIHsgcG9wdXA6IHdpbmRvdy5vcGVuKCkgfTtcbiAgICB9XG4gIH07XG5cbiAgb3V0JC5wcmVwYXJlU3ZnID0gZnVuY3Rpb24gKGVsLCBvcHRpb25zLCBkb25lKSB7XG4gICAgcmVxdWlyZURvbU5vZGUoZWwpO1xuXG4gICAgdmFyIF9yZWYzID0gb3B0aW9ucyB8fCB7fSxcbiAgICAgICAgX3JlZjMkbGVmdCA9IF9yZWYzLmxlZnQsXG4gICAgICAgIGxlZnQgPSBfcmVmMyRsZWZ0ID09PSB1bmRlZmluZWQgPyAwIDogX3JlZjMkbGVmdCxcbiAgICAgICAgX3JlZjMkdG9wID0gX3JlZjMudG9wLFxuICAgICAgICB0b3AgPSBfcmVmMyR0b3AgPT09IHVuZGVmaW5lZCA/IDAgOiBfcmVmMyR0b3AsXG4gICAgICAgIHcgPSBfcmVmMy53aWR0aCxcbiAgICAgICAgaCA9IF9yZWYzLmhlaWdodCxcbiAgICAgICAgX3JlZjMkc2NhbGUgPSBfcmVmMy5zY2FsZSxcbiAgICAgICAgc2NhbGUgPSBfcmVmMyRzY2FsZSA9PT0gdW5kZWZpbmVkID8gMSA6IF9yZWYzJHNjYWxlLFxuICAgICAgICBfcmVmMyRyZXNwb25zaXZlID0gX3JlZjMucmVzcG9uc2l2ZSxcbiAgICAgICAgcmVzcG9uc2l2ZSA9IF9yZWYzJHJlc3BvbnNpdmUgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogX3JlZjMkcmVzcG9uc2l2ZSxcbiAgICAgICAgX3JlZjMkZXhjbHVkZUNzcyA9IF9yZWYzLmV4Y2x1ZGVDc3MsXG4gICAgICAgIGV4Y2x1ZGVDc3MgPSBfcmVmMyRleGNsdWRlQ3NzID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IF9yZWYzJGV4Y2x1ZGVDc3M7XG5cbiAgICByZXR1cm4gaW5saW5lSW1hZ2VzKGVsKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBjbG9uZSA9IGVsLmNsb25lTm9kZSh0cnVlKTtcbiAgICAgIGNsb25lLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IChvcHRpb25zIHx8IHt9KS5iYWNrZ3JvdW5kQ29sb3IgfHwgZWwuc3R5bGUuYmFja2dyb3VuZENvbG9yO1xuXG4gICAgICB2YXIgX2dldERpbWVuc2lvbnMgPSBnZXREaW1lbnNpb25zKGVsLCBjbG9uZSwgdywgaCksXG4gICAgICAgICAgd2lkdGggPSBfZ2V0RGltZW5zaW9ucy53aWR0aCxcbiAgICAgICAgICBoZWlnaHQgPSBfZ2V0RGltZW5zaW9ucy5oZWlnaHQ7XG5cbiAgICAgIGlmIChlbC50YWdOYW1lICE9PSAnc3ZnJykge1xuICAgICAgICBpZiAoZWwuZ2V0QkJveCkge1xuICAgICAgICAgIGlmIChjbG9uZS5nZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScpICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNsb25lLnNldEF0dHJpYnV0ZSgndHJhbnNmb3JtJywgY2xvbmUuZ2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nKS5yZXBsYWNlKC90cmFuc2xhdGVcXCguKj9cXCkvLCAnJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgc3ZnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdzdmcnKTtcbiAgICAgICAgICBzdmcuYXBwZW5kQ2hpbGQoY2xvbmUpO1xuICAgICAgICAgIGNsb25lID0gc3ZnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0F0dGVtcHRlZCB0byByZW5kZXIgbm9uLVNWRyBlbGVtZW50JywgZWwpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjbG9uZS5zZXRBdHRyaWJ1dGUoJ3ZlcnNpb24nLCAnMS4xJyk7XG4gICAgICBjbG9uZS5zZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnLCBbbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0XS5qb2luKCcgJykpO1xuICAgICAgaWYgKCFjbG9uZS5nZXRBdHRyaWJ1dGUoJ3htbG5zJykpIGNsb25lLnNldEF0dHJpYnV0ZU5TKHhtbE5zLCAneG1sbnMnLCBzdmdOcyk7XG4gICAgICBpZiAoIWNsb25lLmdldEF0dHJpYnV0ZSgneG1sbnM6eGxpbmsnKSkgY2xvbmUuc2V0QXR0cmlidXRlTlMoeG1sTnMsICd4bWxuczp4bGluaycsICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJyk7XG5cbiAgICAgIGlmIChyZXNwb25zaXZlKSB7XG4gICAgICAgIGNsb25lLnJlbW92ZUF0dHJpYnV0ZSgnd2lkdGgnKTtcbiAgICAgICAgY2xvbmUucmVtb3ZlQXR0cmlidXRlKCdoZWlnaHQnKTtcbiAgICAgICAgY2xvbmUuc2V0QXR0cmlidXRlKCdwcmVzZXJ2ZUFzcGVjdFJhdGlvJywgJ3hNaW5ZTWluIG1lZXQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNsb25lLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCB3aWR0aCAqIHNjYWxlKTtcbiAgICAgICAgY2xvbmUuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBoZWlnaHQgKiBzY2FsZSk7XG4gICAgICB9XG5cbiAgICAgIEFycmF5LmZyb20oY2xvbmUucXVlcnlTZWxlY3RvckFsbCgnZm9yZWlnbk9iamVjdCA+IConKSkuZm9yRWFjaChmdW5jdGlvbiAoZm9yZWlnbk9iamVjdCkge1xuICAgICAgICBmb3JlaWduT2JqZWN0LnNldEF0dHJpYnV0ZU5TKHhtbE5zLCAneG1sbnMnLCBmb3JlaWduT2JqZWN0LnRhZ05hbWUgPT09ICdzdmcnID8gc3ZnTnMgOiB4aHRtbE5zKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZXhjbHVkZUNzcykge1xuICAgICAgICB2YXIgb3V0ZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgb3V0ZXIuYXBwZW5kQ2hpbGQoY2xvbmUpO1xuICAgICAgICB2YXIgc3JjID0gb3V0ZXIuaW5uZXJIVE1MO1xuICAgICAgICBpZiAodHlwZW9mIGRvbmUgPT09ICdmdW5jdGlvbicpIGRvbmUoc3JjLCB3aWR0aCwgaGVpZ2h0KTtlbHNlIHJldHVybiB7IHNyYzogc3JjLCB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaW5saW5lQ3NzKGVsLCBvcHRpb25zKS50aGVuKGZ1bmN0aW9uIChjc3MpIHtcbiAgICAgICAgICB2YXIgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICAgIHN0eWxlLnNldEF0dHJpYnV0ZSgndHlwZScsICd0ZXh0L2NzcycpO1xuICAgICAgICAgIHN0eWxlLmlubmVySFRNTCA9ICc8IVtDREFUQVtcXG4nICsgY3NzICsgJ1xcbl1dPic7XG5cbiAgICAgICAgICB2YXIgZGVmcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RlZnMnKTtcbiAgICAgICAgICBkZWZzLmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICAgICAgICBjbG9uZS5pbnNlcnRCZWZvcmUoZGVmcywgY2xvbmUuZmlyc3RDaGlsZCk7XG5cbiAgICAgICAgICB2YXIgb3V0ZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICBvdXRlci5hcHBlbmRDaGlsZChjbG9uZSk7XG4gICAgICAgICAgdmFyIHNyYyA9IG91dGVyLmlubmVySFRNTC5yZXBsYWNlKC9OU1xcZCs6aHJlZi9naSwgJ3htbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHhsaW5rOmhyZWYnKTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgZG9uZSA9PT0gJ2Z1bmN0aW9uJykgZG9uZShzcmMsIHdpZHRoLCBoZWlnaHQpO2Vsc2UgcmV0dXJuIHsgc3JjOiBzcmMsIHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgb3V0JC5zdmdBc0RhdGFVcmkgPSBmdW5jdGlvbiAoZWwsIG9wdGlvbnMsIGRvbmUpIHtcbiAgICByZXF1aXJlRG9tTm9kZShlbCk7XG4gICAgcmV0dXJuIG91dCQucHJlcGFyZVN2ZyhlbCwgb3B0aW9ucykudGhlbihmdW5jdGlvbiAoX3JlZjQpIHtcbiAgICAgIHZhciBzcmMgPSBfcmVmNC5zcmMsXG4gICAgICAgICAgd2lkdGggPSBfcmVmNC53aWR0aCxcbiAgICAgICAgICBoZWlnaHQgPSBfcmVmNC5oZWlnaHQ7XG5cbiAgICAgIHZhciBzdmdYbWwgPSAnZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCwnICsgd2luZG93LmJ0b2EocmVFbmNvZGUoZG9jdHlwZSArIHNyYykpO1xuICAgICAgaWYgKHR5cGVvZiBkb25lID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGRvbmUoc3ZnWG1sLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdmdYbWw7XG4gICAgfSk7XG4gIH07XG5cbiAgb3V0JC5zdmdBc1BuZ1VyaSA9IGZ1bmN0aW9uIChlbCwgb3B0aW9ucywgZG9uZSkge1xuICAgIHJlcXVpcmVEb21Ob2RlKGVsKTtcblxuICAgIHZhciBfcmVmNSA9IG9wdGlvbnMgfHwge30sXG4gICAgICAgIF9yZWY1JGVuY29kZXJUeXBlID0gX3JlZjUuZW5jb2RlclR5cGUsXG4gICAgICAgIGVuY29kZXJUeXBlID0gX3JlZjUkZW5jb2RlclR5cGUgPT09IHVuZGVmaW5lZCA/ICdpbWFnZS9wbmcnIDogX3JlZjUkZW5jb2RlclR5cGUsXG4gICAgICAgIF9yZWY1JGVuY29kZXJPcHRpb25zID0gX3JlZjUuZW5jb2Rlck9wdGlvbnMsXG4gICAgICAgIGVuY29kZXJPcHRpb25zID0gX3JlZjUkZW5jb2Rlck9wdGlvbnMgPT09IHVuZGVmaW5lZCA/IDAuOCA6IF9yZWY1JGVuY29kZXJPcHRpb25zLFxuICAgICAgICBjYW52ZyA9IF9yZWY1LmNhbnZnO1xuXG4gICAgdmFyIGNvbnZlcnRUb1BuZyA9IGZ1bmN0aW9uIGNvbnZlcnRUb1BuZyhfcmVmNikge1xuICAgICAgdmFyIHNyYyA9IF9yZWY2LnNyYyxcbiAgICAgICAgICB3aWR0aCA9IF9yZWY2LndpZHRoLFxuICAgICAgICAgIGhlaWdodCA9IF9yZWY2LmhlaWdodDtcblxuICAgICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgdmFyIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgIHZhciBwaXhlbFJhdGlvID0gd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMTtcblxuICAgICAgY2FudmFzLndpZHRoID0gd2lkdGggKiBwaXhlbFJhdGlvO1xuICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodCAqIHBpeGVsUmF0aW87XG4gICAgICBjYW52YXMuc3R5bGUud2lkdGggPSBjYW52YXMud2lkdGggKyAncHgnO1xuICAgICAgY2FudmFzLnN0eWxlLmhlaWdodCA9IGNhbnZhcy5oZWlnaHQgKyAncHgnO1xuICAgICAgY29udGV4dC5zZXRUcmFuc2Zvcm0ocGl4ZWxSYXRpbywgMCwgMCwgcGl4ZWxSYXRpbywgMCwgMCk7XG5cbiAgICAgIGlmIChjYW52ZykgY2FudmcoY2FudmFzLCBzcmMpO2Vsc2UgY29udGV4dC5kcmF3SW1hZ2Uoc3JjLCAwLCAwKTtcblxuICAgICAgdmFyIHBuZyA9IHZvaWQgMDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBuZyA9IGNhbnZhcy50b0RhdGFVUkwoZW5jb2RlclR5cGUsIGVuY29kZXJPcHRpb25zKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBTZWN1cml0eUVycm9yICE9PSAndW5kZWZpbmVkJyAmJiBlIGluc3RhbmNlb2YgU2VjdXJpdHlFcnJvciB8fCBlLm5hbWUgPT09ICdTZWN1cml0eUVycm9yJykge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1JlbmRlcmVkIFNWRyBpbWFnZXMgY2Fubm90IGJlIGRvd25sb2FkZWQgaW4gdGhpcyBicm93c2VyLicpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHRocm93IGU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGRvbmUgPT09ICdmdW5jdGlvbicpIGRvbmUocG5nLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwbmcpO1xuICAgIH07XG5cbiAgICBpZiAoY2FudmcpIHJldHVybiBvdXQkLnByZXBhcmVTdmcoZWwsIG9wdGlvbnMpLnRoZW4oY29udmVydFRvUG5nKTtlbHNlIHJldHVybiBvdXQkLnN2Z0FzRGF0YVVyaShlbCwgb3B0aW9ucykudGhlbihmdW5jdGlvbiAodXJpKSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgaW1hZ2Uub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKGNvbnZlcnRUb1BuZyh7XG4gICAgICAgICAgICBzcmM6IGltYWdlLFxuICAgICAgICAgICAgd2lkdGg6IGltYWdlLndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBpbWFnZS5oZWlnaHRcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH07XG4gICAgICAgIGltYWdlLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmVqZWN0KCdUaGVyZSB3YXMgYW4gZXJyb3IgbG9hZGluZyB0aGUgZGF0YSBVUkkgYXMgYW4gaW1hZ2Ugb24gdGhlIGZvbGxvd2luZyBTVkdcXG4nICsgd2luZG93LmF0b2IodXJpLnNsaWNlKDI2KSkgKyAnT3BlbiB0aGUgZm9sbG93aW5nIGxpbmsgdG8gc2VlIGJyb3dzZXJcXCdzIGRpYWdub3Npc1xcbicgKyB1cmkpO1xuICAgICAgICB9O1xuICAgICAgICBpbWFnZS5zcmMgPSB1cmk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBvdXQkLmRvd25sb2FkID0gZnVuY3Rpb24gKG5hbWUsIHVyaSwgb3B0aW9ucykge1xuICAgIGlmIChuYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYikgbmF2aWdhdG9yLm1zU2F2ZU9yT3BlbkJsb2IodXJpVG9CbG9iKHVyaSksIG5hbWUpO2Vsc2Uge1xuICAgICAgdmFyIHNhdmVMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgaWYgKCdkb3dubG9hZCcgaW4gc2F2ZUxpbmspIHtcbiAgICAgICAgc2F2ZUxpbmsuZG93bmxvYWQgPSBuYW1lO1xuICAgICAgICBzYXZlTGluay5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNhdmVMaW5rKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YXIgYmxvYiA9IHVyaVRvQmxvYih1cmkpO1xuICAgICAgICAgIHZhciB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgICAgIHNhdmVMaW5rLmhyZWYgPSB1cmw7XG4gICAgICAgICAgc2F2ZUxpbmsub25jbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4gVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdFcnJvciB3aGlsZSBnZXR0aW5nIG9iamVjdCBVUkwuIEZhbGxpbmcgYmFjayB0byBzdHJpbmcgVVJMLicpO1xuICAgICAgICAgIHNhdmVMaW5rLmhyZWYgPSB1cmk7XG4gICAgICAgIH1cbiAgICAgICAgc2F2ZUxpbmsuY2xpY2soKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChzYXZlTGluayk7XG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5wb3B1cCkge1xuICAgICAgICBvcHRpb25zLnBvcHVwLmRvY3VtZW50LnRpdGxlID0gbmFtZTtcbiAgICAgICAgb3B0aW9ucy5wb3B1cC5sb2NhdGlvbi5yZXBsYWNlKHVyaSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIG91dCQuc2F2ZVN2ZyA9IGZ1bmN0aW9uIChlbCwgbmFtZSwgb3B0aW9ucykge1xuICAgIHZhciBkb3dubG9hZE9wdHMgPSBkb3dubG9hZE9wdGlvbnMoKTsgLy8gZG9uJ3QgaW5saW5lLCBjYW4ndCBiZSBhc3luY1xuICAgIHJldHVybiByZXF1aXJlRG9tTm9kZVByb21pc2UoZWwpLnRoZW4oZnVuY3Rpb24gKGVsKSB7XG4gICAgICByZXR1cm4gb3V0JC5zdmdBc0RhdGFVcmkoZWwsIG9wdGlvbnMgfHwge30pO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHVyaSkge1xuICAgICAgcmV0dXJuIG91dCQuZG93bmxvYWQobmFtZSwgdXJpLCBkb3dubG9hZE9wdHMpO1xuICAgIH0pO1xuICB9O1xuXG4gIG91dCQuc2F2ZVN2Z0FzUG5nID0gZnVuY3Rpb24gKGVsLCBuYW1lLCBvcHRpb25zKSB7XG4gICAgdmFyIGRvd25sb2FkT3B0cyA9IGRvd25sb2FkT3B0aW9ucygpOyAvLyBkb24ndCBpbmxpbmUsIGNhbid0IGJlIGFzeW5jXG4gICAgcmV0dXJuIHJlcXVpcmVEb21Ob2RlUHJvbWlzZShlbCkudGhlbihmdW5jdGlvbiAoZWwpIHtcbiAgICAgIHJldHVybiBvdXQkLnN2Z0FzUG5nVXJpKGVsLCBvcHRpb25zIHx8IHt9KTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uICh1cmkpIHtcbiAgICAgIHJldHVybiBvdXQkLmRvd25sb2FkKG5hbWUsIHVyaSwgZG93bmxvYWRPcHRzKTtcbiAgICB9KTtcbiAgfTtcbn0pKCk7IiwiZXhwb3J0IGNvbnN0IElDRFMgPSBgRElTUExBWVxuTk8gREFUQVxuYDtcbiIsImV4cG9ydCBjb25zdCBJRFBTID0gYERJU1BMQVlcbk5PIERBVEFcbmA7XG4iLCJjb25zdCBybmFDb2xvciA9ICdyZ2IoMjU1LDIzMCwxNTMpJztcbmNvbnN0IGludkFiYXNpY0NvbG9yID0gJ3JnYigyNTUsMjMwLDE1MyknO1xuZXhwb3J0IGNvbnN0IGF4b2xhYnNNYXAgPSB7XG4gICAgJ1JOQSc6IHtcbiAgICAgICAgZnVsbE5hbWU6ICdSTkEgbnVjbGVvdGlkZXMnLFxuICAgICAgICBzeW1ib2xzOiBbJ0EnLCAnQycsICdHJywgJ1UnXSxcbiAgICAgICAgY29sb3I6IHJuYUNvbG9yLFxuICAgIH0sXG4gICAgJ0ROQSc6IHtcbiAgICAgICAgZnVsbE5hbWU6ICdETkEgbnVjbGVvdGlkZXMnLFxuICAgICAgICBzeW1ib2xzOiBbJ2RBJywgJ2RDJywgJ2RHJywgJ2RUJ10sXG4gICAgICAgIGNvbG9yOiAncmdiKDE5NywyMjQsMTgwKScsXG4gICAgfSxcbiAgICAnMlxcJy1GbHVvcm8nOiB7XG4gICAgICAgIGZ1bGxOYW1lOiAnMlxcJy1GbHVvcm8gbnVjbGVvdGlkZXMnLFxuICAgICAgICBzeW1ib2xzOiBbJ0FmJywgJ0NmJywgJ0dmJywgJ1VmJ10sXG4gICAgICAgIGNvbG9yOiAncmdiKDY4LDExNCwxOTYpJyxcbiAgICB9LFxuICAgICcyXFwnLU8tTWV0aHlsJzoge1xuICAgICAgICBmdWxsTmFtZTogJzJcXCctTy1NZXRoeWwgbnVjbGVvdGlkZXMnLFxuICAgICAgICBzeW1ib2xzOiBbJ2EnLCAnYycsICdnJywgJ3UnXSxcbiAgICAgICAgY29sb3I6ICdyZ2IoMTY2LDE2NiwxNjYpJyxcbiAgICB9LFxuICAgICcyXFwnLU8tTU9FJzoge1xuICAgICAgICBmdWxsTmFtZTogJzJcXCctTy1NT0UgbnVjbGVvdGlkZXMgKGluY2x1ZGluZyA1LU1ldGh5bCBDKScsXG4gICAgICAgIHN5bWJvbHM6IFsnQW0nLCAnQ20nLCAnR20nLCAnVG0nXSxcbiAgICAgICAgY29sb3I6ICdyZ2IoMTEyLDQ4LDE2MCknLFxuICAgIH0sXG4gICAgJ0dOQSc6IHtcbiAgICAgICAgZnVsbE5hbWU6ICdHbHljb2wgbnVjbGVpYyBhY2lkJyxcbiAgICAgICAgc3ltYm9sczogWycoR05BLUEpJywgJyhHTkEtQyknLCAnKEdOQS1HKScsICcoR05BLVQpJ10sXG4gICAgICAgIGNvbG9yOiAncmdiKDI1NSwxOTIsMCknLFxuICAgIH0sXG4gICAgJ0xOQSc6IHtcbiAgICAgICAgZnVsbE5hbWU6ICdMb2NrZWQgbnVjbGVpYyBhY2lkIChpbmNsdWRpbmcgNS1NZXRoeWwgQyknLFxuICAgICAgICBzeW1ib2xzOiBbJ0FiJywgJ0NiJywgJ0diJywgJ1RiJ10sXG4gICAgICAgIGNvbG9yOiAncmdiKDU0LDIyOSwyMzgpJyxcbiAgICB9LFxuICAgICdVTkEnOiB7XG4gICAgICAgIGZ1bGxOYW1lOiAnVW5sb2NrZWQgbnVjbGVvdGlkZXMnLFxuICAgICAgICBzeW1ib2xzOiBbJ0FvJywgJ0NvJywgJ0dvJywgJ1VvJ10sXG4gICAgICAgIGNvbG9yOiAncmdiKDI1NSwxOTIsMCknLFxuICAgIH0sXG4gICAgJ0EnOiB7XG4gICAgICAgIGZ1bGxOYW1lOiAnQWRlbmluZScsXG4gICAgICAgIHN5bWJvbHM6IFsnYScsICdhJywgJ2EnLCAnYSddLFxuICAgICAgICBjb2xvcjogcm5hQ29sb3IsXG4gICAgfSxcbiAgICAnQyc6IHtcbiAgICAgICAgZnVsbE5hbWU6ICdDeXRvc2luZScsXG4gICAgICAgIHN5bWJvbHM6IFsnYycsICdjJywgJ2MnLCAnYyddLFxuICAgICAgICBjb2xvcjogcm5hQ29sb3IsXG4gICAgfSxcbiAgICAnRyc6IHtcbiAgICAgICAgZnVsbE5hbWU6ICdHdWFuaW5lJyxcbiAgICAgICAgc3ltYm9sczogWydnJywgJ2cnLCAnZycsICdnJ10sXG4gICAgICAgIGNvbG9yOiBybmFDb2xvcixcbiAgICB9LFxuICAgICdVJzoge1xuICAgICAgICBmdWxsTmFtZTogJ1VyYWNpbCcsXG4gICAgICAgIHN5bWJvbHM6IFsndScsICd1JywgJ3UnLCAndSddLFxuICAgICAgICBjb2xvcjogcm5hQ29sb3IsXG4gICAgfSxcbiAgICAnWC1OZXcnOiB7XG4gICAgICAgIGZ1bGxOYW1lOiAnJyxcbiAgICAgICAgc3ltYm9sczogWydYJywgJ1gnLCAnWCcsICdYJ10sXG4gICAgICAgIGNvbG9yOiAncmdiKDEwOCwwLDApJyxcbiAgICB9LFxuICAgICdZLU5ldyc6IHtcbiAgICAgICAgZnVsbE5hbWU6ICcnLFxuICAgICAgICBzeW1ib2xzOiBbJ1knLCAnWScsICdZJywgJ1knXSxcbiAgICAgICAgY29sb3I6ICdyZ2IoMjEwLDE0NiwxNDYpJyxcbiAgICB9LFxuICAgICdaLU5ldyc6IHtcbiAgICAgICAgZnVsbE5hbWU6ICcnLFxuICAgICAgICBzeW1ib2xzOiBbJ1onLCAnWicsICdaJywgJ1onXSxcbiAgICAgICAgY29sb3I6ICdyZ2IoMTU1LDEwOCwxMzIpJyxcbiAgICB9LFxuICAgICdJbnZBYmFzaWMnOiB7XG4gICAgICAgIGZ1bGxOYW1lOiAnSW52ZXJ0ZWQgYWJhc2ljIGNhcHBlZCcsXG4gICAgICAgIHN5bWJvbHM6IFsnKGludmFiYXNpYyknLCAnKGludmFiYXNpYyknLCAnKGludmFiYXNpYyknLCAnKGludmFiYXNpYyknXSxcbiAgICAgICAgY29sb3I6IGludkFiYXNpY0NvbG9yLFxuICAgIH0sXG4gICAgJzVcXCctdmlueWxwcyc6IHtcbiAgICAgICAgZnVsbE5hbWU6ICc1XFwnLXZpbnlscGhvc3Bob25hdGUtMlxcJy1PTWUtdXJpZGluZScsXG4gICAgICAgIHN5bWJvbHM6IFsnKHZpbnUpJywgJyh2aW51KScsICcodmludSknLCAnKHZpbnUpJ10sXG4gICAgICAgIGNvbG9yOiAncmdiKDAsMCwxMzkpJyxcbiAgICB9LFxuICAgICdJbnZBYmFzaWMobyknOiB7XG4gICAgICAgIGZ1bGxOYW1lOiAnSW52ZXJ0ZWQgYWJhc2ljIGNhcHBlZCAob3ZlcmhhbmcpJyxcbiAgICAgICAgc3ltYm9sczogWycoaW52YWJhc2ljKScsICcoaW52YWJhc2ljKScsICcoaW52YWJhc2ljKScsICcoaW52YWJhc2ljKSddLFxuICAgICAgICBjb2xvcjogaW52QWJhc2ljQ29sb3IsXG4gICAgfSxcbiAgICAnMlxcJy1PTWUtVShvKSc6IHtcbiAgICAgICAgZnVsbE5hbWU6ICdOdWNsZW90aWRlIFVyaWRpbmUgd2l0aCAy4oCZTy1NZXRoeWwgcHJvdGVjdGlvbiAob3ZlcmhhbmcpJyxcbiAgICAgICAgc3ltYm9sczogWydtVScsICdtVScsICdtVScsICdtVSddLFxuICAgICAgICBjb2xvcjogJ3JnYig2NSwyMzMsODApJyxcbiAgICB9LFxufTtcbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuLyogRG8gbm90IGNoYW5nZSB0aGVzZSBpbXBvcnQgbGluZXMuIERhdGFncm9rIHdpbGwgaW1wb3J0IEFQSSBsaWJyYXJ5IGluIGV4YWN0bHkgdGhlIHNhbWUgbWFubmVyICovXG5pbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0ICogYXMgc3ZnIGZyb20gJ3NhdmUtc3ZnLWFzLXBuZyc7XG5pbXBvcnQgJCBmcm9tICdjYXNoLWRvbSc7XG5pbXBvcnQgeyBkcmF3QXhvbGFic1BhdHRlcm4gfSBmcm9tICcuL2RyYXdBeG9sYWJzUGF0dGVybic7XG5pbXBvcnQgeyBheG9sYWJzTWFwIH0gZnJvbSAnLi9heG9sYWJzTWFwJztcbmNvbnN0IGJhc2VDaG9pY2VzID0gT2JqZWN0LmtleXMoYXhvbGFic01hcCk7XG5jb25zdCBkZWZhdWx0QmFzZSA9IGJhc2VDaG9pY2VzWzBdO1xuY29uc3QgZGVmYXVsdFB0byA9IHRydWU7XG5jb25zdCBkZWZhdWx0U2VxdWVuY2VMZW5ndGggPSAyMztcbmNvbnN0IG1heGltYWxWYWxpZFNlcXVlbmNlTGVuZ3RoID0gMzU7XG5jb25zdCB1c2VyU3RvcmFnZUtleSA9ICdTZXF1ZW5jZVRyYW5zbGF0b3InO1xuY29uc3QgZXhhbXBsZU1pbldpZHRoID0gJzQwMHB4JztcbmZ1bmN0aW9uIGdlbmVyYXRlRXhhbXBsZShzZXF1ZW5jZUxlbmd0aCwgc2VxdWVuY2VCYXNpcykge1xuICAgIGNvbnN0IHVuaXF1ZVN5bWJvbHMgPSBheG9sYWJzTWFwW3NlcXVlbmNlQmFzaXNdLnN5bWJvbHMuam9pbignJyk7XG4gICAgcmV0dXJuIHVuaXF1ZVN5bWJvbHMucmVwZWF0KE1hdGguZmxvb3Ioc2VxdWVuY2VMZW5ndGggLyA0KSkgKyB1bmlxdWVTeW1ib2xzLnNsaWNlKDAsIHNlcXVlbmNlTGVuZ3RoICUgNCk7XG59XG5mdW5jdGlvbiBmaW5kRHVwbGljYXRlcyhkYXRhKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20obmV3IFNldChkYXRhKSkuZmlsdGVyKCh2YWx1ZSkgPT4gZGF0YS5pbmRleE9mKHZhbHVlKSAhPT0gZGF0YS5sYXN0SW5kZXhPZih2YWx1ZSkpO1xufVxuZnVuY3Rpb24gaXNDdXJyZW50VXNlckNyZWF0ZWRUaGlzUGF0dGVybihwYXR0ZXJuTmFtZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHJldHVybiB5aWVsZCBncm9rLmRhcGkudXNlcnMuY3VycmVudCgpLnRoZW4oKHVzZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IFtmaXJzdE5hbWUsIGxhc3ROYW1lXSA9IGdldFVzZXJOYW1lKHBhdHRlcm5OYW1lKTtcbiAgICAgICAgICAgIHJldHVybiAodXNlci5maXJzdE5hbWUgIT0gZmlyc3ROYW1lIHx8IHVzZXIubGFzdE5hbWUgIT0gbGFzdE5hbWUpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGdldFNob3J0TmFtZShwYXR0ZXJuTmFtZSkge1xuICAgIGxldCBmaXJzdCA9IHBhdHRlcm5OYW1lLmxlbmd0aCArIDE7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXR0ZXJuTmFtZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocGF0dGVybk5hbWVbaV0gPT0gJygnKSB7XG4gICAgICAgICAgICBmaXJzdCA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGF0dGVybk5hbWUuc2xpY2UoMCwgZmlyc3QgLSAxKTtcbn1cbmZ1bmN0aW9uIGdldFVzZXJOYW1lKHBhdHRlcm5OYW1lKSB7XG4gICAgbGV0IGZpcnN0ID0gLTE7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXR0ZXJuTmFtZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocGF0dGVybk5hbWVbaV0gPT0gJygnKSB7XG4gICAgICAgICAgICBmaXJzdCA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gKGZpcnN0ID09IC0xKSA/IFsnJywgJyddIDogcGF0dGVybk5hbWUuc2xpY2UoZmlyc3QgKyA5LCBwYXR0ZXJuTmFtZS5sZW5ndGggLSAxKS5zcGxpdCgnICcpLnNsaWNlKDEpO1xufVxuZnVuY3Rpb24gdHJhbnNsYXRlU2VxdWVuY2Uoc2VxdWVuY2UsIGJhc2VzLCBwdG9MaW5rYWdlcywgc3RhcnRNb2RpZmljYXRpb24sIGVuZE1vZGlmaWNhdGlvbiwgZmlyc3RQdG9FeGlzdCkge1xuICAgIGxldCBjb3VudGVyID0gLTE7XG4gICAgbGV0IG1haW5TZXF1ZW5jZSA9IHNlcXVlbmNlLnJlcGxhY2UoL1tBVUdDXS9nLCBmdW5jdGlvbiAoeCkge1xuICAgICAgICBjb3VudGVyKys7XG4gICAgICAgIGNvbnN0IGluZGV4T2ZTeW1ib2wgPSBheG9sYWJzTWFwWydSTkEnXVsnc3ltYm9scyddLmluZGV4T2YoeCk7XG4gICAgICAgIGNvbnN0IHN5bWJvbCA9IGF4b2xhYnNNYXBbYmFzZXNbY291bnRlcl0udmFsdWVdWydzeW1ib2xzJ11baW5kZXhPZlN5bWJvbF07XG4gICAgICAgIHJldHVybiAocHRvTGlua2FnZXNbY291bnRlcl0udmFsdWUpID8gc3ltYm9sICsgJ3MnIDogc3ltYm9sO1xuICAgIH0pO1xuICAgIGlmIChtYWluU2VxdWVuY2Uuc2xpY2UoMCwgNSkuc3BsaXQoJ21VJykubGVuZ3RoID09IDMpXG4gICAgICAgIG1haW5TZXF1ZW5jZSA9ICcodXUpJyArIG1haW5TZXF1ZW5jZS5zbGljZSg0KTtcbiAgICBpZiAobWFpblNlcXVlbmNlLnNsaWNlKG1haW5TZXF1ZW5jZS5sZW5ndGggLSA3KS5zcGxpdCgnbVUnKS5sZW5ndGggPT0gMylcbiAgICAgICAgbWFpblNlcXVlbmNlID0gbWFpblNlcXVlbmNlLnNsaWNlKDAsIG1haW5TZXF1ZW5jZS5sZW5ndGggLSA0KSArICcodXUpJztcbiAgICByZXR1cm4gc3RhcnRNb2RpZmljYXRpb24udmFsdWUgKyAoZmlyc3RQdG9FeGlzdCA/ICdzJyA6ICcnKSArIG1haW5TZXF1ZW5jZSArIGVuZE1vZGlmaWNhdGlvbi52YWx1ZTtcbn1cbmZ1bmN0aW9uIGFkZENvbHVtbldpdGhJZHModGFibGVOYW1lLCBjb2x1bW5OYW1lLCBwYXR0ZXJuTmFtZSkge1xuICAgIGNvbnN0IG5hbWVPZk5ld0NvbHVtbiA9ICdJRCAnICsgcGF0dGVybk5hbWU7XG4gICAgY29uc3QgY29sdW1ucyA9IGdyb2suc2hlbGwudGFibGUodGFibGVOYW1lKS5jb2x1bW5zO1xuICAgIGlmIChjb2x1bW5zLmNvbnRhaW5zKG5hbWVPZk5ld0NvbHVtbikpXG4gICAgICAgIGNvbHVtbnMucmVtb3ZlKG5hbWVPZk5ld0NvbHVtbik7XG4gICAgY29uc3QgY29sdW1uV2l0aElkcyA9IGNvbHVtbnMuYnlOYW1lKGNvbHVtbk5hbWUpO1xuICAgIHJldHVybiBjb2x1bW5zLmFkZE5ld1N0cmluZyhuYW1lT2ZOZXdDb2x1bW4pLmluaXQoKGkpID0+IGNvbHVtbldpdGhJZHMuZ2V0KGkpICsgJ18nICsgcGF0dGVybk5hbWUpO1xufVxuZnVuY3Rpb24gYWRkQ29sdW1uV2l0aFRyYW5zbGF0ZWRTZXF1ZW5jZXModGFibGVOYW1lLCBjb2x1bW5OYW1lLCBiYXNlcywgcHRvTGlua2FnZXMsIHN0YXJ0TW9kaWZpY2F0aW9uLCBlbmRNb2RpZmljYXRpb24sIGZpcnN0UHRvRXhpc3QpIHtcbiAgICBjb25zdCBuYW1lT2ZOZXdDb2x1bW4gPSAnQXhvbGFicyAnICsgY29sdW1uTmFtZTtcbiAgICBjb25zdCBjb2x1bW5zID0gZ3Jvay5zaGVsbC50YWJsZSh0YWJsZU5hbWUpLmNvbHVtbnM7XG4gICAgaWYgKGNvbHVtbnMuY29udGFpbnMobmFtZU9mTmV3Q29sdW1uKSlcbiAgICAgICAgY29sdW1ucy5yZW1vdmUobmFtZU9mTmV3Q29sdW1uKTtcbiAgICBjb25zdCBjb2x1bW5XaXRoSW5wdXRTZXF1ZW5jZXMgPSBjb2x1bW5zLmJ5TmFtZShjb2x1bW5OYW1lKTtcbiAgICByZXR1cm4gY29sdW1ucy5hZGROZXdTdHJpbmcobmFtZU9mTmV3Q29sdW1uKS5pbml0KChpKSA9PiB7XG4gICAgICAgIHJldHVybiB0cmFuc2xhdGVTZXF1ZW5jZShjb2x1bW5XaXRoSW5wdXRTZXF1ZW5jZXMuZ2V0U3RyaW5nKGkpLCBiYXNlcywgcHRvTGlua2FnZXMsIHN0YXJ0TW9kaWZpY2F0aW9uLCBlbmRNb2RpZmljYXRpb24sIGZpcnN0UHRvRXhpc3QpO1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUF4b2xhYnNQYXR0ZXJuKCkge1xuICAgIGNvbnN0IGVudW1lcmF0ZU1vZGlmaWNhdGlvbnMgPSBbZGVmYXVsdEJhc2VdO1xuICAgIGxldCBtYXhpbWFsU3NMZW5ndGggPSBkZWZhdWx0U2VxdWVuY2VMZW5ndGg7XG4gICAgbGV0IG1heGltYWxBc0xlbmd0aCA9IGRlZmF1bHRTZXF1ZW5jZUxlbmd0aDtcbiAgICBmdW5jdGlvbiB1cGRhdGVBc01vZGlmaWNhdGlvbigpIHtcbiAgICAgICAgYXNNb2RpZmljYXRpb25JdGVtcy5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgYXNQdG9MaW5rYWdlcyA9IGFzUHRvTGlua2FnZXMuY29uY2F0KEFycmF5KG1heGltYWxBc0xlbmd0aCAtIGFzQmFzZXMubGVuZ3RoKS5maWxsKGZ1bGx5UHRvKSk7XG4gICAgICAgIGFzQmFzZXMgPSBhc0Jhc2VzLmNvbmNhdChBcnJheShtYXhpbWFsQXNMZW5ndGggLSBhc0Jhc2VzLmxlbmd0aCkuZmlsbChzZXF1ZW5jZUJhc2UpKTtcbiAgICAgICAgbGV0IG51Y2xlb3RpZGVDb3VudGVyID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhc0xlbmd0aC52YWx1ZTsgaSsrKSB7XG4gICAgICAgICAgICBhc1B0b0xpbmthZ2VzW2ldID0gdWkuYm9vbElucHV0KCcnLCBhc1B0b0xpbmthZ2VzW2ldLnZhbHVlLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdXBkYXRlU3ZnU2NoZW1lKCk7XG4gICAgICAgICAgICAgICAgdXBkYXRlT3V0cHV0RXhhbXBsZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXNCYXNlc1tpXSA9IHVpLmNob2ljZUlucHV0KCcnLCBhc0Jhc2VzW2ldLnZhbHVlLCBiYXNlQ2hvaWNlcywgKHYpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWVudW1lcmF0ZU1vZGlmaWNhdGlvbnMuaW5jbHVkZXModikpIHtcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYXRlTW9kaWZpY2F0aW9ucy5wdXNoKHYpO1xuICAgICAgICAgICAgICAgICAgICBpc0VudW1lcmF0ZU1vZGlmaWNhdGlvbnNEaXYuYXBwZW5kKHVpLmJvb2xJbnB1dCh2LCB0cnVlLCAoYm9vbFYpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChib29sVikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW51bWVyYXRlTW9kaWZpY2F0aW9ucy5pbmNsdWRlcyh2KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYXRlTW9kaWZpY2F0aW9ucy5wdXNoKHYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBlbnVtZXJhdGVNb2RpZmljYXRpb25zLmluZGV4T2YodiwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmF0ZU1vZGlmaWNhdGlvbnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVN2Z1NjaGVtZSgpO1xuICAgICAgICAgICAgICAgICAgICB9KS5yb290KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdXBkYXRlQXNNb2RpZmljYXRpb24oKTtcbiAgICAgICAgICAgICAgICB1cGRhdGVTdmdTY2hlbWUoKTtcbiAgICAgICAgICAgICAgICB1cGRhdGVPdXRwdXRFeGFtcGxlcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoYXNCYXNlc1tpXS52YWx1ZS5zbGljZSgtMykgIT0gJyhvKScpXG4gICAgICAgICAgICAgICAgbnVjbGVvdGlkZUNvdW50ZXIrKztcbiAgICAgICAgICAgIGFzTW9kaWZpY2F0aW9uSXRlbXMuYXBwZW5kKHVpLmRpdkgoW1xuICAgICAgICAgICAgICAgIHVpLmRpdihbdWkubGFiZWwoYXNCYXNlc1tpXS52YWx1ZS5zbGljZSgtMykgPT0gJyhvKScgPyAnJyA6IFN0cmluZyhudWNsZW90aWRlQ291bnRlcikpXSwgeyBzdHlsZTogeyB3aWR0aDogJzIwcHgnIH0gfSksXG4gICAgICAgICAgICAgICAgdWkuYmxvY2s3NShbYXNCYXNlc1tpXV0pLFxuICAgICAgICAgICAgICAgIHVpLmRpdihbYXNQdG9MaW5rYWdlc1tpXV0pLFxuICAgICAgICAgICAgXSwgeyBzdHlsZTogeyBhbGlnbkl0ZW1zOiAnY2VudGVyJyB9IH0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVTc01vZGlmaWNhdGlvbigpIHtcbiAgICAgICAgc3NNb2RpZmljYXRpb25JdGVtcy5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgc3NQdG9MaW5rYWdlcyA9IHNzUHRvTGlua2FnZXMuY29uY2F0KEFycmF5KG1heGltYWxTc0xlbmd0aCAtIHNzQmFzZXMubGVuZ3RoKS5maWxsKGZ1bGx5UHRvKSk7XG4gICAgICAgIHNzQmFzZXMgPSBzc0Jhc2VzLmNvbmNhdChBcnJheShtYXhpbWFsU3NMZW5ndGggLSBzc0Jhc2VzLmxlbmd0aCkuZmlsbChzZXF1ZW5jZUJhc2UpKTtcbiAgICAgICAgbGV0IG51Y2xlb3RpZGVDb3VudGVyID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzc0xlbmd0aC52YWx1ZTsgaSsrKSB7XG4gICAgICAgICAgICBzc1B0b0xpbmthZ2VzW2ldID0gdWkuYm9vbElucHV0KCcnLCBzc1B0b0xpbmthZ2VzW2ldLnZhbHVlLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdXBkYXRlU3ZnU2NoZW1lKCk7XG4gICAgICAgICAgICAgICAgdXBkYXRlT3V0cHV0RXhhbXBsZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3NCYXNlc1tpXSA9IHVpLmNob2ljZUlucHV0KCcnLCBzc0Jhc2VzW2ldLnZhbHVlLCBiYXNlQ2hvaWNlcywgKHYpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWVudW1lcmF0ZU1vZGlmaWNhdGlvbnMuaW5jbHVkZXModikpIHtcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYXRlTW9kaWZpY2F0aW9ucy5wdXNoKHYpO1xuICAgICAgICAgICAgICAgICAgICBpc0VudW1lcmF0ZU1vZGlmaWNhdGlvbnNEaXYuYXBwZW5kKHVpLmJvb2xJbnB1dCh2LCB0cnVlLCAoYm9vbFYpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChib29sVikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW51bWVyYXRlTW9kaWZpY2F0aW9ucy5pbmNsdWRlcyh2KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYXRlTW9kaWZpY2F0aW9ucy5wdXNoKHYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBlbnVtZXJhdGVNb2RpZmljYXRpb25zLmluZGV4T2YodiwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmF0ZU1vZGlmaWNhdGlvbnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVN2Z1NjaGVtZSgpO1xuICAgICAgICAgICAgICAgICAgICB9KS5yb290KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdXBkYXRlU3NNb2RpZmljYXRpb24oKTtcbiAgICAgICAgICAgICAgICB1cGRhdGVTdmdTY2hlbWUoKTtcbiAgICAgICAgICAgICAgICB1cGRhdGVPdXRwdXRFeGFtcGxlcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoc3NCYXNlc1tpXS52YWx1ZS5zbGljZSgtMykgIT0gJyhvKScpXG4gICAgICAgICAgICAgICAgbnVjbGVvdGlkZUNvdW50ZXIrKztcbiAgICAgICAgICAgIHNzTW9kaWZpY2F0aW9uSXRlbXMuYXBwZW5kKHVpLmRpdkgoW1xuICAgICAgICAgICAgICAgIHVpLmRpdihbdWkubGFiZWwoc3NCYXNlc1tpXS52YWx1ZS5zbGljZSgtMykgPT0gJyhvKScgPyAnJyA6IFN0cmluZyhudWNsZW90aWRlQ291bnRlcikpXSwgeyBzdHlsZTogeyB3aWR0aDogJzIwcHgnIH0gfSksXG4gICAgICAgICAgICAgICAgdWkuYmxvY2s3NShbc3NCYXNlc1tpXV0pLFxuICAgICAgICAgICAgICAgIHVpLmRpdihbc3NQdG9MaW5rYWdlc1tpXV0pLFxuICAgICAgICAgICAgXSwgeyBzdHlsZTogeyBhbGlnbkl0ZW1zOiAnY2VudGVyJyB9IH0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVVaUZvck5ld1NlcXVlbmNlTGVuZ3RoKCkge1xuICAgICAgICBpZiAoc3NMZW5ndGgudmFsdWUgPCBtYXhpbWFsVmFsaWRTZXF1ZW5jZUxlbmd0aCAmJiBhc0xlbmd0aC52YWx1ZSA8IG1heGltYWxWYWxpZFNlcXVlbmNlTGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoc3NMZW5ndGgudmFsdWUgPiBtYXhpbWFsU3NMZW5ndGgpXG4gICAgICAgICAgICAgICAgbWF4aW1hbFNzTGVuZ3RoID0gc3NMZW5ndGgudmFsdWU7XG4gICAgICAgICAgICBpZiAoYXNMZW5ndGgudmFsdWUgPiBtYXhpbWFsQXNMZW5ndGgpXG4gICAgICAgICAgICAgICAgbWF4aW1hbEFzTGVuZ3RoID0gYXNMZW5ndGgudmFsdWU7XG4gICAgICAgICAgICB1cGRhdGVTc01vZGlmaWNhdGlvbigpO1xuICAgICAgICAgICAgdXBkYXRlQXNNb2RpZmljYXRpb24oKTtcbiAgICAgICAgICAgIHVwZGF0ZVN2Z1NjaGVtZSgpO1xuICAgICAgICAgICAgdXBkYXRlSW5wdXRFeGFtcGxlcygpO1xuICAgICAgICAgICAgdXBkYXRlT3V0cHV0RXhhbXBsZXMoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHVpLmRpYWxvZygnU2VxdWVuY2UgbGVuZ3RoIGlzIG91dCBvZiByYW5nZScpXG4gICAgICAgICAgICAgICAgLmFkZCh1aS5kaXZUZXh0KCdTZXF1ZW5jZSBsZW5ndGggc2hvdWxkIGJlIGxlc3MgdGhhbiAnICtcbiAgICAgICAgICAgICAgICBtYXhpbWFsVmFsaWRTZXF1ZW5jZUxlbmd0aC50b1N0cmluZygpICsgJyBkdWUgdG8gVUkgY29uc3RyYWlucy4nKSlcbiAgICAgICAgICAgICAgICAuYWRkKHVpLmRpdlRleHQoJ1BsZWFzZSBjaGFuZ2Ugc2VxdWVuY2UgbGVuZ3RoIGluIG9yZGVyIHRvIGRlZmluZSBuZXcgcGF0dGVybi4nKSlcbiAgICAgICAgICAgICAgICAuc2hvdygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZVB0byhuZXdQdG9WYWx1ZSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNzUHRvTGlua2FnZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBzc1B0b0xpbmthZ2VzW2ldLnZhbHVlID0gbmV3UHRvVmFsdWU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXNQdG9MaW5rYWdlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGFzUHRvTGlua2FnZXNbaV0udmFsdWUgPSBuZXdQdG9WYWx1ZTtcbiAgICAgICAgdXBkYXRlU3ZnU2NoZW1lKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZUJhc2VzKG5ld0Jhc2lzVmFsdWUpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzc0Jhc2VzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgc3NCYXNlc1tpXS52YWx1ZSA9IG5ld0Jhc2lzVmFsdWU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXNCYXNlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGFzQmFzZXNbaV0udmFsdWUgPSBuZXdCYXNpc1ZhbHVlO1xuICAgICAgICB1cGRhdGVTdmdTY2hlbWUoKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlSW5wdXRFeGFtcGxlcygpIHtcbiAgICAgICAgc3NJbnB1dEV4YW1wbGUudmFsdWUgPSBnZW5lcmF0ZUV4YW1wbGUoc3NMZW5ndGgudmFsdWUsIHNlcXVlbmNlQmFzZS52YWx1ZSk7XG4gICAgICAgIGlmIChjcmVhdGVBc1N0cmFuZC52YWx1ZSlcbiAgICAgICAgICAgIGFzSW5wdXRFeGFtcGxlLnZhbHVlID0gZ2VuZXJhdGVFeGFtcGxlKGFzTGVuZ3RoLnZhbHVlLCBzZXF1ZW5jZUJhc2UudmFsdWUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVPdXRwdXRFeGFtcGxlcygpIHtcbiAgICAgICAgc3NPdXRwdXRFeGFtcGxlLnZhbHVlID0gdHJhbnNsYXRlU2VxdWVuY2Uoc3NJbnB1dEV4YW1wbGUudmFsdWUsIHNzQmFzZXMsIHNzUHRvTGlua2FnZXMsIHNzRml2ZU1vZGlmaWNhdGlvbiwgc3NUaHJlZU1vZGlmaWNhdGlvbiwgZmlyc3RTc1B0by52YWx1ZSk7XG4gICAgICAgIGlmIChjcmVhdGVBc1N0cmFuZC52YWx1ZSkge1xuICAgICAgICAgICAgYXNPdXRwdXRFeGFtcGxlLnZhbHVlID0gdHJhbnNsYXRlU2VxdWVuY2UoYXNJbnB1dEV4YW1wbGUudmFsdWUsIGFzQmFzZXMsIGFzUHRvTGlua2FnZXMsIGFzRml2ZU1vZGlmaWNhdGlvbiwgYXNUaHJlZU1vZGlmaWNhdGlvbiwgZmlyc3RBc1B0by52YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlU3ZnU2NoZW1lKCkge1xuICAgICAgICBzdmdEaXYuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIHN2Z0Rpdi5hcHBlbmQodWkuc3BhbihbXG4gICAgICAgICAgICBkcmF3QXhvbGFic1BhdHRlcm4oZ2V0U2hvcnROYW1lKHNhdmVBcy52YWx1ZSksIGNyZWF0ZUFzU3RyYW5kLnZhbHVlLCBzc0Jhc2VzLnNsaWNlKDAsIHNzTGVuZ3RoLnZhbHVlKS5tYXAoKGUpID0+IGUudmFsdWUpLCBhc0Jhc2VzLnNsaWNlKDAsIGFzTGVuZ3RoLnZhbHVlKS5tYXAoKGUpID0+IGUudmFsdWUpLCBbZmlyc3RTc1B0by52YWx1ZV0uY29uY2F0KHNzUHRvTGlua2FnZXMuc2xpY2UoMCwgc3NMZW5ndGgudmFsdWUpLm1hcCgoZSkgPT4gZS52YWx1ZSkpLCBbZmlyc3RBc1B0by52YWx1ZV0uY29uY2F0KGFzUHRvTGlua2FnZXMuc2xpY2UoMCwgYXNMZW5ndGgudmFsdWUpLm1hcCgoZSkgPT4gZS52YWx1ZSkpLCBzc1RocmVlTW9kaWZpY2F0aW9uLnZhbHVlLCBzc0ZpdmVNb2RpZmljYXRpb24udmFsdWUsIGFzVGhyZWVNb2RpZmljYXRpb24udmFsdWUsIGFzRml2ZU1vZGlmaWNhdGlvbi52YWx1ZSwgY29tbWVudC52YWx1ZSwgZW51bWVyYXRlTW9kaWZpY2F0aW9ucyksXG4gICAgICAgIF0pKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGV0ZWN0RGVmYXVsdEJhc2lzKGFycmF5KSB7XG4gICAgICAgIGNvbnN0IG1vZGVNYXAgPSB7fTtcbiAgICAgICAgbGV0IG1heEVsID0gYXJyYXlbMF07XG4gICAgICAgIGxldCBtYXhDb3VudCA9IDE7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGVsID0gYXJyYXlbaV07XG4gICAgICAgICAgICBpZiAobW9kZU1hcFtlbF0gPT0gbnVsbClcbiAgICAgICAgICAgICAgICBtb2RlTWFwW2VsXSA9IDE7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbW9kZU1hcFtlbF0rKztcbiAgICAgICAgICAgIGlmIChtb2RlTWFwW2VsXSA+IG1heENvdW50KSB7XG4gICAgICAgICAgICAgICAgbWF4RWwgPSBlbDtcbiAgICAgICAgICAgICAgICBtYXhDb3VudCA9IG1vZGVNYXBbZWxdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXhFbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gcGFyc2VQYXR0ZXJuQW5kVXBkYXRlVWkobmV3TmFtZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgcGkgPSBERy5UYXNrQmFyUHJvZ3Jlc3NJbmRpY2F0b3IuY3JlYXRlKCdMb2FkaW5nIHBhdHRlcm4uLi4nKTtcbiAgICAgICAgICAgIHlpZWxkIGdyb2suZGFwaS51c2VyRGF0YVN0b3JhZ2UuZ2V0KHVzZXJTdG9yYWdlS2V5LCBmYWxzZSkudGhlbigoZW50aXRpZXMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBvYmogPSBKU09OLnBhcnNlKGVudGl0aWVzW25ld05hbWVdKTtcbiAgICAgICAgICAgICAgICBzZXF1ZW5jZUJhc2UudmFsdWUgPSBkZXRlY3REZWZhdWx0QmFzaXMob2JqWydhc0Jhc2VzJ10uY29uY2F0KG9ialsnc3NCYXNlcyddKSk7XG4gICAgICAgICAgICAgICAgY3JlYXRlQXNTdHJhbmQudmFsdWUgPSAob2JqWydhc0Jhc2VzJ10ubGVuZ3RoID4gMCk7XG4gICAgICAgICAgICAgICAgc2F2ZUFzLnZhbHVlID0gbmV3TmFtZTtcbiAgICAgICAgICAgICAgICBzc0Jhc2VzID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmpbJ3NzQmFzZXMnXS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgc3NCYXNlcy5wdXNoKHVpLmNob2ljZUlucHV0KCcnLCBvYmpbJ3NzQmFzZXMnXVtpXSwgYmFzZUNob2ljZXMpKTtcbiAgICAgICAgICAgICAgICBhc0Jhc2VzID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmpbJ2FzQmFzZXMnXS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgYXNCYXNlcy5wdXNoKHVpLmNob2ljZUlucHV0KCcnLCBvYmpbJ2FzQmFzZXMnXVtpXSwgYmFzZUNob2ljZXMpKTtcbiAgICAgICAgICAgICAgICBmaXJzdFNzUHRvLnZhbHVlID0gb2JqWydzc1B0b0xpbmthZ2VzJ11bMF07XG4gICAgICAgICAgICAgICAgc3NQdG9MaW5rYWdlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgb2JqWydzc1B0b0xpbmthZ2VzJ10ubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgICAgIHNzUHRvTGlua2FnZXMucHVzaCh1aS5ib29sSW5wdXQoJycsIG9ialsnc3NQdG9MaW5rYWdlcyddW2ldKSk7XG4gICAgICAgICAgICAgICAgZmlyc3RBc1B0by52YWx1ZSA9IG9ialsnYXNQdG9MaW5rYWdlcyddWzBdO1xuICAgICAgICAgICAgICAgIGFzUHRvTGlua2FnZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG9ialsnYXNQdG9MaW5rYWdlcyddLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICBhc1B0b0xpbmthZ2VzLnB1c2godWkuYm9vbElucHV0KCcnLCBvYmpbJ2FzUHRvTGlua2FnZXMnXVtpXSkpO1xuICAgICAgICAgICAgICAgIHNzTGVuZ3RoLnZhbHVlID0gb2JqWydzc0Jhc2VzJ10ubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGFzTGVuZ3RoLnZhbHVlID0gb2JqWydhc0Jhc2VzJ10ubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHNzVGhyZWVNb2RpZmljYXRpb24udmFsdWUgPSBvYmpbJ3NzVGhyZWVNb2RpZmljYXRpb24nXTtcbiAgICAgICAgICAgICAgICBzc0ZpdmVNb2RpZmljYXRpb24udmFsdWUgPSBvYmpbJ3NzRml2ZU1vZGlmaWNhdGlvbiddO1xuICAgICAgICAgICAgICAgIGFzVGhyZWVNb2RpZmljYXRpb24udmFsdWUgPSBvYmpbJ2FzVGhyZWVNb2RpZmljYXRpb24nXTtcbiAgICAgICAgICAgICAgICBhc0ZpdmVNb2RpZmljYXRpb24udmFsdWUgPSBvYmpbJ2FzRml2ZU1vZGlmaWNhdGlvbiddO1xuICAgICAgICAgICAgICAgIGNvbW1lbnQudmFsdWUgPSBvYmpbJ2NvbW1lbnQnXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcGkuY2xvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNoZWNrV2hldGhlckFsbFZhbHVlc0luQ29sdW1uSGF2ZVRoZVNhbWVMZW5ndGgoY29sTmFtZSkge1xuICAgICAgICBjb25zdCBjb2wgPSB0YWJsZXMudmFsdWUuY29sdW1ucy5ieU5hbWUoY29sTmFtZSk7XG4gICAgICAgIGxldCBhbGxMZW5ndGhzQXJlVGhlU2FtZSA9IHRydWU7XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgY29sLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoY29sLmdldChpIC0gMSkubGVuZ3RoICE9IGNvbC5nZXQoaSkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgYWxsTGVuZ3Roc0FyZVRoZVNhbWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFsbExlbmd0aHNBcmVUaGVTYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBkaWFsb2cgPSB1aS5kaWFsb2coJ1NlcXVlbmNlcyBsZW5ndGhzIG1pc21hdGNoJyk7XG4gICAgICAgICAgICAkKGRpYWxvZy5nZXRCdXR0b24oJ09LJykpLmhpZGUoKTtcbiAgICAgICAgICAgIGRpYWxvZ1xuICAgICAgICAgICAgICAgIC5hZGQodWkuZGl2VGV4dCgnVGhlIHNlcXVlbmNlIGxlbmd0aCBzaG91bGQgbWF0Y2ggdGhlIG51bWJlciBvZiBSYXcgc2VxdWVuY2VzIGluIHRoZSBpbnB1dCBmaWxlJykpXG4gICAgICAgICAgICAgICAgLmFkZCh1aS5kaXZUZXh0KCdcXCdBREQgQ09MVU1OXFwnIHRvIHNlZSBzZXF1ZW5jZXMgbGVuZ3RocycpKVxuICAgICAgICAgICAgICAgIC5hZGRCdXR0b24oJ0FERCBDT0xVTU4nLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGFibGVzLnZhbHVlLmNvbHVtbnMuYWRkTmV3SW50KCdTZXF1ZW5jZXMgbGVuZ3RocyBpbiAnICsgY29sTmFtZSkuaW5pdCgoaikgPT4gY29sLmdldChqKS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGdyb2suc2hlbGwuaW5mbygnQ29sdW1uIHdpdGggbGVuZ3RocyBhZGRlZCB0byBcXCcnICsgdGFibGVzLnZhbHVlLm5hbWUgKyAnXFwnJyk7XG4gICAgICAgICAgICAgICAgZGlhbG9nLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgZ3Jvay5zaGVsbC52ID0gZ3Jvay5zaGVsbC5nZXRUYWJsZVZpZXcodGFibGVzLnZhbHVlLm5hbWUpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuc2hvdygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhbGxMZW5ndGhzQXJlVGhlU2FtZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0Q3VycmVudFVzZXJOYW1lKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIHlpZWxkIGdyb2suZGFwaS51c2Vycy5jdXJyZW50KCkudGhlbigodXNlcikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAnIChjcmVhdGVkIGJ5ICcgKyB1c2VyLmZpcnN0TmFtZSArICcgJyArIHVzZXIubGFzdE5hbWUgKyAnKSc7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBvc3RQYXR0ZXJuVG9Vc2VyU3RvcmFnZSgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGF1dGhvciA9IHlpZWxkIGdldEN1cnJlbnRVc2VyTmFtZSgpO1xuICAgICAgICAgICAgaWYgKCFzYXZlQXMuc3RyaW5nVmFsdWUuaW5jbHVkZXMoJyhjcmVhdGVkIGJ5ICcpKVxuICAgICAgICAgICAgICAgIHNhdmVBcy52YWx1ZSA9IHNhdmVBcy5zdHJpbmdWYWx1ZSArIGF1dGhvcjtcbiAgICAgICAgICAgIHJldHVybiBncm9rLmRhcGkudXNlckRhdGFTdG9yYWdlLnBvc3RWYWx1ZSh1c2VyU3RvcmFnZUtleSwgc2F2ZUFzLnN0cmluZ1ZhbHVlLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgJ3NzQmFzZXMnOiBzc0Jhc2VzLnNsaWNlKDAsIHNzTGVuZ3RoLnZhbHVlKS5tYXAoKGUpID0+IGUudmFsdWUpLFxuICAgICAgICAgICAgICAgICdhc0Jhc2VzJzogYXNCYXNlcy5zbGljZSgwLCBhc0xlbmd0aC52YWx1ZSkubWFwKChlKSA9PiBlLnZhbHVlKSxcbiAgICAgICAgICAgICAgICAnc3NQdG9MaW5rYWdlcyc6IFtmaXJzdFNzUHRvLnZhbHVlXS5jb25jYXQoc3NQdG9MaW5rYWdlcy5zbGljZSgwLCBzc0xlbmd0aC52YWx1ZSkubWFwKChlKSA9PiBlLnZhbHVlKSksXG4gICAgICAgICAgICAgICAgJ2FzUHRvTGlua2FnZXMnOiBbZmlyc3RBc1B0by52YWx1ZV0uY29uY2F0KGFzUHRvTGlua2FnZXMuc2xpY2UoMCwgYXNMZW5ndGgudmFsdWUpLm1hcCgoZSkgPT4gZS52YWx1ZSkpLFxuICAgICAgICAgICAgICAgICdzc1RocmVlTW9kaWZpY2F0aW9uJzogc3NUaHJlZU1vZGlmaWNhdGlvbi52YWx1ZSxcbiAgICAgICAgICAgICAgICAnc3NGaXZlTW9kaWZpY2F0aW9uJzogc3NGaXZlTW9kaWZpY2F0aW9uLnZhbHVlLFxuICAgICAgICAgICAgICAgICdhc1RocmVlTW9kaWZpY2F0aW9uJzogYXNUaHJlZU1vZGlmaWNhdGlvbi52YWx1ZSxcbiAgICAgICAgICAgICAgICAnYXNGaXZlTW9kaWZpY2F0aW9uJzogYXNGaXZlTW9kaWZpY2F0aW9uLnZhbHVlLFxuICAgICAgICAgICAgICAgICdjb21tZW50JzogY29tbWVudC52YWx1ZSxcbiAgICAgICAgICAgIH0pLCBmYWxzZSkudGhlbigoKSA9PiBncm9rLnNoZWxsLmluZm8oJ1BhdHRlcm4gXFwnJyArIHNhdmVBcy52YWx1ZSArICdcXCcgd2FzIHN1Y2Nlc3NmdWxseSB1cGxvYWRlZCEnKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVQYXR0ZXJuc0xpc3QoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBncm9rLmRhcGkudXNlckRhdGFTdG9yYWdlLmdldCh1c2VyU3RvcmFnZUtleSwgZmFsc2UpLnRoZW4oKGVudGl0aWVzKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbHN0TXkgPSBbXTtcbiAgICAgICAgICAgICAgICBjb25zdCBsc3RPdGhlcnMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVudCBvZiBPYmplY3Qua2V5cyhlbnRpdGllcykpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHlpZWxkIGlzQ3VycmVudFVzZXJDcmVhdGVkVGhpc1BhdHRlcm4oZW50KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGxzdE90aGVycy5wdXNoKGVudCk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGxzdE15LnB1c2goZ2V0U2hvcnROYW1lKGVudCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgbG9hZFBhdHRlcm4gPSB1aS5jaG9pY2VJbnB1dCgnTG9hZCBQYXR0ZXJuJywgJycsIGxzdE15LCAodikgPT4gcGFyc2VQYXR0ZXJuQW5kVXBkYXRlVWkodikpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG15T3JPdGhlcnNQYXR0ZXJuTGlzdCA9IHVpLmNob2ljZUlucHV0KCcnLCAnTWluZScsIFsnTWluZScsICdPdGhlcnMnXSwgKHYpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudExpc3QgPSB2ID09ICdNaW5lJyA/IGxzdE15IDogbHN0T3RoZXJzO1xuICAgICAgICAgICAgICAgICAgICBsb2FkUGF0dGVybiA9IHVpLmNob2ljZUlucHV0KCdMb2FkIFBhdHRlcm4nLCAnJywgY3VycmVudExpc3QsICh2KSA9PiBwYXJzZVBhdHRlcm5BbmRVcGRhdGVVaSh2KSk7XG4gICAgICAgICAgICAgICAgICAgIGxvYWRQYXR0ZXJuLnJvb3QuYXBwZW5kKG15T3JPdGhlcnNQYXR0ZXJuTGlzdC5pbnB1dCk7XG4gICAgICAgICAgICAgICAgICAgIGxvYWRQYXR0ZXJuLnJvb3QuYXBwZW5kKGxvYWRQYXR0ZXJuLmlucHV0KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBsb2FkUGF0dGVybi5pbnB1dC5zdHlsZS5tYXhXaWR0aCA9ICcxMDBweCc7XG4gICAgICAgICAgICAgICAgICAgIGxvYWRQYXR0ZXJuLnNldFRvb2x0aXAoJ0FwcGx5IEV4aXN0aW5nIFBhdHRlcm4nKTtcbiAgICAgICAgICAgICAgICAgICAgbG9hZFBhdHRlcm5EaXYuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIGxvYWRQYXR0ZXJuRGl2LmFwcGVuZChsb2FkUGF0dGVybi5yb290KTtcbiAgICAgICAgICAgICAgICAgICAgbG9hZFBhdHRlcm4ucm9vdC5hcHBlbmQodWkuZGl2KFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVpLmJ1dHRvbih1aS5pY29uRkEoJ3RyYXNoLWFsdCcsICgpID0+IHsgfSksICgpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9hZFBhdHRlcm4udmFsdWUgPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3Jvay5zaGVsbC53YXJuaW5nKCdDaG9vc2UgcGF0dGVybiB0byBkZWxldGUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh5aWVsZCBpc0N1cnJlbnRVc2VyQ3JlYXRlZFRoaXNQYXR0ZXJuKHNhdmVBcy52YWx1ZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb2suc2hlbGwud2FybmluZygnQ2Fubm90IGRlbGV0ZSBwYXR0ZXJuLCBjcmVhdGVkIGJ5IG90aGVyIHVzZXInKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgZ3Jvay5kYXBpLnVzZXJEYXRhU3RvcmFnZS5yZW1vdmUodXNlclN0b3JhZ2VLZXksIGxvYWRQYXR0ZXJuLnZhbHVlLCBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IGdyb2suc2hlbGwuaW5mbygnUGF0dGVybiBcXCcnICsgbG9hZFBhdHRlcm4udmFsdWUgKyAnXFwnIGRlbGV0ZWQnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHVwZGF0ZVBhdHRlcm5zTGlzdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICBdLCAndWktaW5wdXQtb3B0aW9ucycpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBsb2FkUGF0dGVybi5yb290LmFwcGVuZChteU9yT3RoZXJzUGF0dGVybkxpc3QuaW5wdXQpO1xuICAgICAgICAgICAgICAgIGxvYWRQYXR0ZXJuLnJvb3QuYXBwZW5kKGxvYWRQYXR0ZXJuLmlucHV0KTtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgbG9hZFBhdHRlcm4uaW5wdXQuc3R5bGUubWF4V2lkdGggPSAnMTAwcHgnO1xuICAgICAgICAgICAgICAgIGxvYWRQYXR0ZXJuLnNldFRvb2x0aXAoJ0FwcGx5IEV4aXN0aW5nIFBhdHRlcm4nKTtcbiAgICAgICAgICAgICAgICBsb2FkUGF0dGVybkRpdi5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgICAgICAgICBsb2FkUGF0dGVybkRpdi5hcHBlbmQobG9hZFBhdHRlcm4ucm9vdCk7XG4gICAgICAgICAgICAgICAgbG9hZFBhdHRlcm4ucm9vdC5hcHBlbmQodWkuZGl2KFtcbiAgICAgICAgICAgICAgICAgICAgdWkuYnV0dG9uKHVpLmljb25GQSgndHJhc2gtYWx0JywgKCkgPT4geyB9KSwgKCkgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRQYXR0ZXJuLnZhbHVlID09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3Jvay5zaGVsbC53YXJuaW5nKCdDaG9vc2UgcGF0dGVybiB0byBkZWxldGUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHlpZWxkIGlzQ3VycmVudFVzZXJDcmVhdGVkVGhpc1BhdHRlcm4oc2F2ZUFzLnZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm9rLnNoZWxsLndhcm5pbmcoJ0Nhbm5vdCBkZWxldGUgcGF0dGVybiwgY3JlYXRlZCBieSBvdGhlciB1c2VyJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBncm9rLmRhcGkudXNlckRhdGFTdG9yYWdlLnJlbW92ZSh1c2VyU3RvcmFnZUtleSwgbG9hZFBhdHRlcm4udmFsdWUsIGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiBncm9rLnNoZWxsLmluZm8oJ1BhdHRlcm4gXFwnJyArIGxvYWRQYXR0ZXJuLnZhbHVlICsgJ1xcJyBkZWxldGVkJykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgdXBkYXRlUGF0dGVybnNMaXN0KCk7XG4gICAgICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICBdLCAndWktaW5wdXQtb3B0aW9ucycpKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNhdmVQYXR0ZXJuKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgeWllbGQgZ3Jvay5kYXBpLnVzZXJEYXRhU3RvcmFnZS5nZXQodXNlclN0b3JhZ2VLZXksIGZhbHNlKVxuICAgICAgICAgICAgICAgIC50aGVuKChlbnRpdGllcykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhlbnRpdGllcykuaW5jbHVkZXMoc2F2ZUFzLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWFsb2cgPSB1aS5kaWFsb2coJ1BhdHRlcm4gYWxyZWFkeSBleGlzdHMnKTtcbiAgICAgICAgICAgICAgICAgICAgJChkaWFsb2cuZ2V0QnV0dG9uKCdPSycpKS5oaWRlKCk7XG4gICAgICAgICAgICAgICAgICAgIGRpYWxvZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLmFkZCh1aS5kaXZUZXh0KCdQYXR0ZXJuIG5hbWUgXFwnJyArIHNhdmVBcy52YWx1ZSArICdcXCcgYWxyZWFkeSBleGlzdHMuJykpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYWRkKHVpLmRpdlRleHQoJ1JlcGxhY2UgcGF0dGVybj8nKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRCdXR0b24oJ1lFUycsICgpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGdyb2suZGFwaS51c2VyRGF0YVN0b3JhZ2UucmVtb3ZlKHVzZXJTdG9yYWdlS2V5LCBzYXZlQXMudmFsdWUsIGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHBvc3RQYXR0ZXJuVG9Vc2VyU3RvcmFnZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpYWxvZy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zaG93KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgcG9zdFBhdHRlcm5Ub1VzZXJTdG9yYWdlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHlpZWxkIHVwZGF0ZVBhdHRlcm5zTGlzdCgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRTc0NvbHVtbkRpdiA9IHVpLmRpdihbXSk7XG4gICAgY29uc3QgaW5wdXRBc0NvbHVtbkRpdiA9IHVpLmRpdihbXSk7XG4gICAgY29uc3QgaW5wdXRJZENvbHVtbkRpdiA9IHVpLmRpdihbXSk7XG4gICAgY29uc3Qgc3NNb2RpZmljYXRpb25JdGVtcyA9IHVpLmRpdihbXSk7XG4gICAgY29uc3QgYXNNb2RpZmljYXRpb25JdGVtcyA9IHVpLmRpdihbXSk7XG4gICAgY29uc3Qgc3ZnRGl2ID0gdWkuZGl2KFtdKTtcbiAgICBjb25zdCBhc0V4YW1wbGVEaXYgPSB1aS5kaXYoW10pO1xuICAgIGNvbnN0IGFwcEF4b2xhYnNEZXNjcmlwdGlvbiA9IHVpLmRpdihbXSk7XG4gICAgY29uc3QgbG9hZFBhdHRlcm5EaXYgPSB1aS5kaXYoW10pO1xuICAgIGNvbnN0IGFzTW9kaWZpY2F0aW9uRGl2ID0gdWkuZGl2KFtdKTtcbiAgICBjb25zdCBmaXJzdEFzUHRvRGl2ID0gdWkuZGl2KFtdKTtcbiAgICBjb25zdCBpc0VudW1lcmF0ZU1vZGlmaWNhdGlvbnNEaXYgPSB1aS5kaXZIKFt1aS5ib29sSW5wdXQoZGVmYXVsdEJhc2UsIHRydWUsICh2KSA9PiB7XG4gICAgICAgICAgICBpZiAodikge1xuICAgICAgICAgICAgICAgIGlmICghZW51bWVyYXRlTW9kaWZpY2F0aW9ucy5pbmNsdWRlcyhkZWZhdWx0QmFzZSkpXG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmF0ZU1vZGlmaWNhdGlvbnMucHVzaChkZWZhdWx0QmFzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGVudW1lcmF0ZU1vZGlmaWNhdGlvbnMuaW5kZXhPZihkZWZhdWx0QmFzZSwgMCk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpXG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmF0ZU1vZGlmaWNhdGlvbnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVwZGF0ZVN2Z1NjaGVtZSgpO1xuICAgICAgICAgICAgdXBkYXRlT3V0cHV0RXhhbXBsZXMoKTtcbiAgICAgICAgfSkucm9vdF0pO1xuICAgIGxldCBzc0Jhc2VzID0gQXJyYXkoZGVmYXVsdFNlcXVlbmNlTGVuZ3RoKS5maWxsKHVpLmNob2ljZUlucHV0KCcnLCBkZWZhdWx0QmFzZSwgYmFzZUNob2ljZXMpKTtcbiAgICBsZXQgYXNCYXNlcyA9IEFycmF5KGRlZmF1bHRTZXF1ZW5jZUxlbmd0aCkuZmlsbCh1aS5jaG9pY2VJbnB1dCgnJywgZGVmYXVsdEJhc2UsIGJhc2VDaG9pY2VzKSk7XG4gICAgbGV0IHNzUHRvTGlua2FnZXMgPSBBcnJheShkZWZhdWx0U2VxdWVuY2VMZW5ndGgpLmZpbGwodWkuYm9vbElucHV0KCcnLCBkZWZhdWx0UHRvKSk7XG4gICAgbGV0IGFzUHRvTGlua2FnZXMgPSBBcnJheShkZWZhdWx0U2VxdWVuY2VMZW5ndGgpLmZpbGwodWkuYm9vbElucHV0KCcnLCBkZWZhdWx0UHRvKSk7XG4gICAgY29uc3Qgc3NMZW5ndGggPSB1aS5pbnRJbnB1dCgnU1MgTGVuZ3RoJywgZGVmYXVsdFNlcXVlbmNlTGVuZ3RoLCAoKSA9PiB1cGRhdGVVaUZvck5ld1NlcXVlbmNlTGVuZ3RoKCkpO1xuICAgIGNvbnN0IGFzTGVuZ3RoID0gdWkuaW50SW5wdXQoJ0FTIExlbmd0aCcsIGRlZmF1bHRTZXF1ZW5jZUxlbmd0aCwgKCkgPT4gdXBkYXRlVWlGb3JOZXdTZXF1ZW5jZUxlbmd0aCgpKTtcbiAgICBjb25zdCBhc0xlbmd0aERpdiA9IHVpLmRpdihbYXNMZW5ndGgucm9vdF0pO1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlU3NDb2x1bW4oY29sTmFtZSkge1xuICAgICAgICBjb25zdCBhbGxMZW5ndGhzQXJlVGhlU2FtZSA9IGNoZWNrV2hldGhlckFsbFZhbHVlc0luQ29sdW1uSGF2ZVRoZVNhbWVMZW5ndGgoY29sTmFtZSk7XG4gICAgICAgIGNvbnN0IGZpcnN0U2VxdWVuY2UgPSB0YWJsZXMudmFsdWUuY29sdW1ucy5ieU5hbWUoY29sTmFtZSkuZ2V0KDApO1xuICAgICAgICBpZiAoYWxsTGVuZ3Roc0FyZVRoZVNhbWUgJiYgZmlyc3RTZXF1ZW5jZS5sZW5ndGggIT0gc3NMZW5ndGgudmFsdWUpXG4gICAgICAgICAgICBzc0xlbmd0aC52YWx1ZSA9IHRhYmxlcy52YWx1ZS5jb2x1bW5zLmJ5TmFtZShjb2xOYW1lKS5nZXQoMCkubGVuZ3RoO1xuICAgICAgICBzc0lucHV0RXhhbXBsZS52YWx1ZSA9IGZpcnN0U2VxdWVuY2U7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlQXNDb2x1bW4oY29sTmFtZSkge1xuICAgICAgICBjb25zdCBhbGxMZW5ndGhzQXJlVGhlU2FtZSA9IGNoZWNrV2hldGhlckFsbFZhbHVlc0luQ29sdW1uSGF2ZVRoZVNhbWVMZW5ndGgoY29sTmFtZSk7XG4gICAgICAgIGNvbnN0IGZpcnN0U2VxdWVuY2UgPSB0YWJsZXMudmFsdWUuY29sdW1ucy5ieU5hbWUoY29sTmFtZSkuZ2V0KDApO1xuICAgICAgICBpZiAoYWxsTGVuZ3Roc0FyZVRoZVNhbWUgJiYgZmlyc3RTZXF1ZW5jZS5sZW5ndGggIT0gYXNMZW5ndGgudmFsdWUpXG4gICAgICAgICAgICBhc0xlbmd0aC52YWx1ZSA9IHRhYmxlcy52YWx1ZS5jb2x1bW5zLmJ5TmFtZShjb2xOYW1lKS5nZXQoMCkubGVuZ3RoO1xuICAgICAgICBhc0xlbmd0aERpdi5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgYXNMZW5ndGhEaXYuYXBwZW5kKGFzTGVuZ3RoLnJvb3QpO1xuICAgICAgICBhc0lucHV0RXhhbXBsZS52YWx1ZSA9IGZpcnN0U2VxdWVuY2U7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlSWRzQ29sdW1uKGNvbE5hbWUpIHtcbiAgICAgICAgY29uc3QgY29sID0gdGFibGVzLnZhbHVlLmNvbHVtbnMuYnlOYW1lKGNvbE5hbWUpO1xuICAgICAgICBpZiAoY29sLnR5cGUgIT0gREcuVFlQRS5JTlQpXG4gICAgICAgICAgICBncm9rLnNoZWxsLmVycm9yKCdDb2x1bW4gc2hvdWxkIGNvbnRhaW4gaW50ZWdlcnMgb25seScpO1xuICAgICAgICBlbHNlIGlmIChjb2wuY2F0ZWdvcmllcy5sZW5ndGggPCBjb2wubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBkdXBsaWNhdGVzID0gZmluZER1cGxpY2F0ZXMoY29sLmdldFJhd0RhdGEoKSk7XG4gICAgICAgICAgICB1aS5kaWFsb2coJ05vbi11bmlxdWUgSURzJylcbiAgICAgICAgICAgICAgICAuYWRkKHVpLmRpdlRleHQoJ1ByZXNzIFxcJ09LXFwnIHRvIHNlbGVjdCByb3dzIHdpdGggbm9uLXVuaXF1ZSB2YWx1ZXMnKSlcbiAgICAgICAgICAgICAgICAub25PSygoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gdGFibGVzLnZhbHVlLnNlbGVjdGlvbjtcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24uaW5pdCgoaSkgPT4gZHVwbGljYXRlcy5pbmRleE9mKGNvbC5nZXQoaSkpID4gLTEpO1xuICAgICAgICAgICAgICAgIGdyb2suc2hlbGwudiA9IGdyb2suc2hlbGwuZ2V0VGFibGVWaWV3KHRhYmxlcy52YWx1ZS5uYW1lKTtcbiAgICAgICAgICAgICAgICBncm9rLnNoZWxsLmluZm8oJ1Jvd3MgYXJlIHNlbGVjdGVkIGluIHRhYmxlIFxcJycgKyB0YWJsZXMudmFsdWUubmFtZSArICdcXCcnKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnNob3coKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB0YWJsZXMgPSB1aS50YWJsZUlucHV0KCdUYWJsZXMnLCBncm9rLnNoZWxsLnRhYmxlc1swXSwgZ3Jvay5zaGVsbC50YWJsZXMsICh0KSA9PiB7XG4gICAgICAgIGNvbnN0IGlucHV0U3NDb2x1bW4gPSB1aS5jaG9pY2VJbnB1dCgnU1MgQ29sdW1uJywgJycsIHQuY29sdW1ucy5uYW1lcygpLCAoY29sTmFtZSkgPT4gdmFsaWRhdGVTc0NvbHVtbihjb2xOYW1lKSk7XG4gICAgICAgIGlucHV0U3NDb2x1bW5EaXYuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIGlucHV0U3NDb2x1bW5EaXYuYXBwZW5kKGlucHV0U3NDb2x1bW4ucm9vdCk7XG4gICAgICAgIGNvbnN0IGlucHV0QXNDb2x1bW4gPSB1aS5jaG9pY2VJbnB1dCgnQVMgQ29sdW1uJywgJycsIHQuY29sdW1ucy5uYW1lcygpLCAoY29sTmFtZSkgPT4gdmFsaWRhdGVBc0NvbHVtbihjb2xOYW1lKSk7XG4gICAgICAgIGlucHV0QXNDb2x1bW5EaXYuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIGlucHV0QXNDb2x1bW5EaXYuYXBwZW5kKGlucHV0QXNDb2x1bW4ucm9vdCk7XG4gICAgICAgIGNvbnN0IGlucHV0SWRDb2x1bW4gPSB1aS5jaG9pY2VJbnB1dCgnSUQgQ29sdW1uJywgJycsIHQuY29sdW1ucy5uYW1lcygpLCAoY29sTmFtZSkgPT4gdmFsaWRhdGVJZHNDb2x1bW4oY29sTmFtZSkpO1xuICAgICAgICBpbnB1dElkQ29sdW1uRGl2LmlubmVySFRNTCA9ICcnO1xuICAgICAgICBpbnB1dElkQ29sdW1uRGl2LmFwcGVuZChpbnB1dElkQ29sdW1uLnJvb3QpO1xuICAgIH0pO1xuICAgIGNvbnN0IGlucHV0U3NDb2x1bW4gPSB1aS5jaG9pY2VJbnB1dCgnU1MgQ29sdW1uJywgJycsIFtdKTtcbiAgICBpbnB1dFNzQ29sdW1uRGl2LmFwcGVuZChpbnB1dFNzQ29sdW1uLnJvb3QpO1xuICAgIGNvbnN0IGlucHV0QXNDb2x1bW4gPSB1aS5jaG9pY2VJbnB1dCgnQVMgQ29sdW1uJywgJycsIFtdKTtcbiAgICBpbnB1dEFzQ29sdW1uRGl2LmFwcGVuZChpbnB1dEFzQ29sdW1uLnJvb3QpO1xuICAgIGNvbnN0IGlucHV0SWRDb2x1bW4gPSB1aS5jaG9pY2VJbnB1dCgnSUQgQ29sdW1uJywgJycsIFtdKTtcbiAgICBpbnB1dElkQ29sdW1uRGl2LmFwcGVuZChpbnB1dElkQ29sdW1uLnJvb3QpO1xuICAgIHVwZGF0ZVBhdHRlcm5zTGlzdCgpO1xuICAgIGNvbnN0IHNlcXVlbmNlQmFzZSA9IHVpLmNob2ljZUlucHV0KCdTZXF1ZW5jZSBCYXNpcycsIGRlZmF1bHRCYXNlLCBiYXNlQ2hvaWNlcywgKHYpID0+IHtcbiAgICAgICAgdXBkYXRlQmFzZXModik7XG4gICAgICAgIHVwZGF0ZU91dHB1dEV4YW1wbGVzKCk7XG4gICAgfSk7XG4gICAgY29uc3QgZnVsbHlQdG8gPSB1aS5ib29sSW5wdXQoJ0Z1bGx5IFBUTycsIGRlZmF1bHRQdG8sICh2KSA9PiB7XG4gICAgICAgIGZpcnN0U3NQdG8udmFsdWUgPSB2O1xuICAgICAgICBmaXJzdEFzUHRvLnZhbHVlID0gdjtcbiAgICAgICAgdXBkYXRlUHRvKHYpO1xuICAgICAgICB1cGRhdGVPdXRwdXRFeGFtcGxlcygpO1xuICAgIH0pO1xuICAgIGNvbnN0IGZpcnN0U3NQdG8gPSB1aS5ib29sSW5wdXQoJ0ZpcnN0IFNTIFBUTycsIGZ1bGx5UHRvLnZhbHVlLCAoKSA9PiB1cGRhdGVTdmdTY2hlbWUoKSk7XG4gICAgY29uc3QgZmlyc3RBc1B0byA9IHVpLmJvb2xJbnB1dCgnRmlyc3QgQVMgUFRPJywgZnVsbHlQdG8udmFsdWUsICgpID0+IHVwZGF0ZVN2Z1NjaGVtZSgpKTtcbiAgICBmaXJzdEFzUHRvRGl2LmFwcGVuZChmaXJzdEFzUHRvLnJvb3QpO1xuICAgIGNvbnN0IGNyZWF0ZUFzU3RyYW5kID0gdWkuYm9vbElucHV0KCdDcmVhdGUgQVMgU3RyYW5kJywgdHJ1ZSwgKHYpID0+IHtcbiAgICAgICAgYXNNb2RpZmljYXRpb25TZWN0aW9uLmhpZGRlbiA9ICghdik7XG4gICAgICAgIGlucHV0QXNDb2x1bW5EaXYuaGlkZGVuID0gKCF2KTtcbiAgICAgICAgYXNMZW5ndGhEaXYuaGlkZGVuID0gKCF2KTtcbiAgICAgICAgYXNNb2RpZmljYXRpb25EaXYuaGlkZGVuID0gKCF2KTtcbiAgICAgICAgYXNFeGFtcGxlRGl2LmhpZGRlbiA9ICghdik7XG4gICAgICAgIGZpcnN0QXNQdG9EaXYuaGlkZGVuID0gKCF2KTtcbiAgICAgICAgdXBkYXRlU3ZnU2NoZW1lKCk7XG4gICAgfSk7XG4gICAgY29uc3Qgc2F2ZUFzID0gdWkudGV4dElucHV0KCdTYXZlIEFzJywgJ1BhdHRlcm4gTmFtZScsICgpID0+IHVwZGF0ZVN2Z1NjaGVtZSgpKTtcbiAgICBzYXZlQXMuc2V0VG9vbHRpcCgnTmFtZSBPZiBOZXcgUGF0dGVybicpO1xuICAgIGNvbnN0IHNzVGhyZWVNb2RpZmljYXRpb24gPSB1aS5zdHJpbmdJbnB1dCgnU1MgM1xcJyBNb2RpZmljYXRpb24nLCAnJywgKCkgPT4ge1xuICAgICAgICB1cGRhdGVTdmdTY2hlbWUoKTtcbiAgICAgICAgdXBkYXRlT3V0cHV0RXhhbXBsZXMoKTtcbiAgICB9KTtcbiAgICBzc1RocmVlTW9kaWZpY2F0aW9uLnNldFRvb2x0aXAoJ0FkZGl0aW9uYWwgU1MgM1xcJyBNb2RpZmljYXRpb24nKTtcbiAgICBjb25zdCBzc0ZpdmVNb2RpZmljYXRpb24gPSB1aS5zdHJpbmdJbnB1dCgnU1MgNVxcJyBNb2RpZmljYXRpb24nLCAnJywgKCkgPT4ge1xuICAgICAgICB1cGRhdGVTdmdTY2hlbWUoKTtcbiAgICAgICAgdXBkYXRlT3V0cHV0RXhhbXBsZXMoKTtcbiAgICB9KTtcbiAgICBzc0ZpdmVNb2RpZmljYXRpb24uc2V0VG9vbHRpcCgnQWRkaXRpb25hbCBTUyA1XFwnIE1vZGlmaWNhdGlvbicpO1xuICAgIGNvbnN0IGFzVGhyZWVNb2RpZmljYXRpb24gPSB1aS5zdHJpbmdJbnB1dCgnQVMgM1xcJyBNb2RpZmljYXRpb24nLCAnJywgKCkgPT4ge1xuICAgICAgICB1cGRhdGVTdmdTY2hlbWUoKTtcbiAgICAgICAgdXBkYXRlT3V0cHV0RXhhbXBsZXMoKTtcbiAgICB9KTtcbiAgICBhc1RocmVlTW9kaWZpY2F0aW9uLnNldFRvb2x0aXAoJ0FkZGl0aW9uYWwgQVMgM1xcJyBNb2RpZmljYXRpb24nKTtcbiAgICBjb25zdCBhc0ZpdmVNb2RpZmljYXRpb24gPSB1aS5zdHJpbmdJbnB1dCgnQVMgNVxcJyBNb2RpZmljYXRpb24nLCAnJywgKCkgPT4ge1xuICAgICAgICB1cGRhdGVTdmdTY2hlbWUoKTtcbiAgICAgICAgdXBkYXRlT3V0cHV0RXhhbXBsZXMoKTtcbiAgICB9KTtcbiAgICBhc0ZpdmVNb2RpZmljYXRpb24uc2V0VG9vbHRpcCgnQWRkaXRpb25hbCBBUyA1XFwnIE1vZGlmaWNhdGlvbicpO1xuICAgIGFzTW9kaWZpY2F0aW9uRGl2LmFwcGVuZChhc1RocmVlTW9kaWZpY2F0aW9uLnJvb3QpO1xuICAgIGFzTW9kaWZpY2F0aW9uRGl2LmFwcGVuZChhc0ZpdmVNb2RpZmljYXRpb24ucm9vdCk7XG4gICAgY29uc3QgY29tbWVudCA9IHVpLnRleHRJbnB1dCgnQ29tbWVudCcsICcnLCAoKSA9PiB1cGRhdGVTdmdTY2hlbWUoKSk7XG4gICAgY29uc3Qgc2F2ZVBhdHRlcm5CdXR0b24gPSB1aS5idXR0b24oJ1NhdmUnLCAoKSA9PiB7XG4gICAgICAgIGlmIChzYXZlQXMudmFsdWUgIT0gJycpXG4gICAgICAgICAgICBzYXZlUGF0dGVybigpLnRoZW4oKHIpID0+IGdyb2suc2hlbGwuaW5mbygnUGF0dGVybiBzYXZlZCcpKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gdWkuc3RyaW5nSW5wdXQoJ0VudGVyIE5hbWUnLCAnJyk7XG4gICAgICAgICAgICB1aS5kaWFsb2coJ1BhdHRlcm4gTmFtZScpXG4gICAgICAgICAgICAgICAgLmFkZChuYW1lLnJvb3QpXG4gICAgICAgICAgICAgICAgLm9uT0soKCkgPT4ge1xuICAgICAgICAgICAgICAgIHNhdmVBcy52YWx1ZSA9IG5hbWUudmFsdWU7XG4gICAgICAgICAgICAgICAgc2F2ZVBhdHRlcm4oKS50aGVuKChyKSA9PiBncm9rLnNoZWxsLmluZm8oJ1BhdHRlcm4gc2F2ZWQnKSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5zaG93KCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBjb252ZXJ0U2VxdWVuY2VCdXR0b24gPSB1aS5idXR0b24oJ0NvbnZlcnQgU2VxdWVuY2VzJywgKCkgPT4ge1xuICAgICAgICBpZiAoaW5wdXRTc0NvbHVtbi52YWx1ZSA9PSBudWxsIHx8IChjcmVhdGVBc1N0cmFuZC52YWx1ZSAmJiBpbnB1dEFzQ29sdW1uLnZhbHVlID09IG51bGwpKVxuICAgICAgICAgICAgZ3Jvay5zaGVsbC5pbmZvKCdQbGVhc2Ugc2VsZWN0IHRhYmxlIGFuZCBjb2x1bW5zIG9uIHdoaWNoIHRvIGFwcGx5IHBhdHRlcm4nKTtcbiAgICAgICAgZWxzZSBpZiAoc3NMZW5ndGgudmFsdWUgIT0gc3NJbnB1dEV4YW1wbGUudmFsdWUubGVuZ3RoIHx8IGFzTGVuZ3RoLnZhbHVlICE9IGFzSW5wdXRFeGFtcGxlLnZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZGlhbG9nID0gdWkuZGlhbG9nKCdMZW5ndGggTWlzbWF0Y2gnKTtcbiAgICAgICAgICAgICQoZGlhbG9nLmdldEJ1dHRvbignT0snKSkuaGlkZSgpO1xuICAgICAgICAgICAgZGlhbG9nXG4gICAgICAgICAgICAgICAgLmFkZCh1aS5kaXZUZXh0KCdMZW5ndGggb2Ygc2VxdWVuY2VzIGluIGNvbHVtbnMgZG9lc25cXCd0IG1hdGNoIGVudGVyZWQgbGVuZ3RoLiBVcGRhdGUgbGVuZ3RoIHZhbHVlPycpKVxuICAgICAgICAgICAgICAgIC5hZGRCdXR0b24oJ1lFUycsICgpID0+IHtcbiAgICAgICAgICAgICAgICBzc0xlbmd0aC52YWx1ZSA9IHRhYmxlcy52YWx1ZS5jb2x1bW5zLmJ5TmFtZShpbnB1dFNzQ29sdW1uLnZhbHVlKS5nZXRTdHJpbmcoMCkubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGFzTGVuZ3RoLnZhbHVlID0gdGFibGVzLnZhbHVlLmNvbHVtbnMuYnlOYW1lKGlucHV0QXNDb2x1bW4udmFsdWUpLmdldFN0cmluZygwKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgZGlhbG9nLmNsb3NlKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5zaG93KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoaW5wdXRJZENvbHVtbi52YWx1ZSAhPSBudWxsKVxuICAgICAgICAgICAgICAgIGFkZENvbHVtbldpdGhJZHModGFibGVzLnZhbHVlLm5hbWUsIGlucHV0SWRDb2x1bW4udmFsdWUsIGdldFNob3J0TmFtZShzYXZlQXMudmFsdWUpKTtcbiAgICAgICAgICAgIGFkZENvbHVtbldpdGhUcmFuc2xhdGVkU2VxdWVuY2VzKHRhYmxlcy52YWx1ZS5uYW1lLCBpbnB1dFNzQ29sdW1uLnZhbHVlLCBzc0Jhc2VzLCBzc1B0b0xpbmthZ2VzLCBzc0ZpdmVNb2RpZmljYXRpb24sIHNzVGhyZWVNb2RpZmljYXRpb24sIGZpcnN0U3NQdG8udmFsdWUpO1xuICAgICAgICAgICAgaWYgKGNyZWF0ZUFzU3RyYW5kLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgYWRkQ29sdW1uV2l0aFRyYW5zbGF0ZWRTZXF1ZW5jZXModGFibGVzLnZhbHVlLm5hbWUsIGlucHV0QXNDb2x1bW4udmFsdWUsIGFzQmFzZXMsIGFzUHRvTGlua2FnZXMsIGFzRml2ZU1vZGlmaWNhdGlvbiwgYXNUaHJlZU1vZGlmaWNhdGlvbiwgZmlyc3RBc1B0by52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBncm9rLnNoZWxsLnYgPSBncm9rLnNoZWxsLmdldFRhYmxlVmlldyh0YWJsZXMudmFsdWUubmFtZSk7XG4gICAgICAgICAgICBncm9rLnNoZWxsLmluZm8oKChjcmVhdGVBc1N0cmFuZC52YWx1ZSkgPyAnQ29sdW1ucyB3ZXJlJyA6ICdDb2x1bW4gd2FzJykgK1xuICAgICAgICAgICAgICAgICcgYWRkZWQgdG8gdGFibGUgXFwnJyArIHRhYmxlcy52YWx1ZS5uYW1lICsgJ1xcJycpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgY29uc3Qgc3NJbnB1dEV4YW1wbGUgPSB1aS50ZXh0SW5wdXQoJ1NlbnNlIFN0cmFuZCcsIGdlbmVyYXRlRXhhbXBsZShzc0xlbmd0aC52YWx1ZSwgc2VxdWVuY2VCYXNlLnZhbHVlKSwgKCkgPT4ge1xuICAgICAgICBzc091dHB1dEV4YW1wbGUudmFsdWUgPSB0cmFuc2xhdGVTZXF1ZW5jZShzc0lucHV0RXhhbXBsZS52YWx1ZSwgc3NCYXNlcywgc3NQdG9MaW5rYWdlcywgc3NGaXZlTW9kaWZpY2F0aW9uLCBzc1RocmVlTW9kaWZpY2F0aW9uLCBmaXJzdFNzUHRvLnZhbHVlKTtcbiAgICB9KTtcbiAgICBjb25zdCBzc091dHB1dEV4YW1wbGUgPSB1aS50ZXh0SW5wdXQoJyAnLCB0cmFuc2xhdGVTZXF1ZW5jZShzc0lucHV0RXhhbXBsZS52YWx1ZSwgc3NCYXNlcywgc3NQdG9MaW5rYWdlcywgc3NUaHJlZU1vZGlmaWNhdGlvbiwgc3NGaXZlTW9kaWZpY2F0aW9uLCBmaXJzdFNzUHRvLnZhbHVlKSk7XG4gICAgc3NJbnB1dEV4YW1wbGUuaW5wdXQuc3R5bGUucmVzaXplID0gJ25vbmUnO1xuICAgIHNzSW5wdXRFeGFtcGxlLmlucHV0LnN0eWxlLm1pbldpZHRoID0gZXhhbXBsZU1pbldpZHRoO1xuICAgIHNzT3V0cHV0RXhhbXBsZS5pbnB1dC5zdHlsZS5yZXNpemUgPSAnbm9uZSc7XG4gICAgc3NPdXRwdXRFeGFtcGxlLmlucHV0LnN0eWxlLm1pbldpZHRoID0gZXhhbXBsZU1pbldpZHRoO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBzc091dHB1dEV4YW1wbGUuaW5wdXQuZGlzYWJsZWQgPSAndHJ1ZSc7XG4gICAgc3NPdXRwdXRFeGFtcGxlLnJvb3QuYXBwZW5kKHVpLmRpdihbXG4gICAgICAgIHVpLmJ1dHRvbih1aS5pY29uRkEoJ2NvcHknLCAoKSA9PiB7IH0pLCAoKSA9PiB7XG4gICAgICAgICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChzc091dHB1dEV4YW1wbGUudmFsdWUpLnRoZW4oKCkgPT4gZ3Jvay5zaGVsbC5pbmZvKCdTZXF1ZW5jZSB3YXMgY29waWVkIHRvIGNsaXBib2FyZCcpKTtcbiAgICAgICAgfSksXG4gICAgXSwgJ3VpLWlucHV0LW9wdGlvbnMnKSk7XG4gICAgY29uc3QgYXNJbnB1dEV4YW1wbGUgPSB1aS50ZXh0SW5wdXQoJ0FudGlzZW5zZSBTdHJhbmQnLCBnZW5lcmF0ZUV4YW1wbGUoYXNMZW5ndGgudmFsdWUsIHNlcXVlbmNlQmFzZS52YWx1ZSksICgpID0+IHtcbiAgICAgICAgYXNPdXRwdXRFeGFtcGxlLnZhbHVlID0gdHJhbnNsYXRlU2VxdWVuY2UoYXNJbnB1dEV4YW1wbGUudmFsdWUsIGFzQmFzZXMsIGFzUHRvTGlua2FnZXMsIGFzRml2ZU1vZGlmaWNhdGlvbiwgYXNUaHJlZU1vZGlmaWNhdGlvbiwgZmlyc3RTc1B0by52YWx1ZSk7XG4gICAgfSk7XG4gICAgY29uc3QgYXNPdXRwdXRFeGFtcGxlID0gdWkudGV4dElucHV0KCcgJywgdHJhbnNsYXRlU2VxdWVuY2UoYXNJbnB1dEV4YW1wbGUudmFsdWUsIGFzQmFzZXMsIGFzUHRvTGlua2FnZXMsIGFzRml2ZU1vZGlmaWNhdGlvbiwgYXNUaHJlZU1vZGlmaWNhdGlvbiwgZmlyc3RTc1B0by52YWx1ZSkpO1xuICAgIGFzSW5wdXRFeGFtcGxlLmlucHV0LnN0eWxlLnJlc2l6ZSA9ICdub25lJztcbiAgICBhc0lucHV0RXhhbXBsZS5pbnB1dC5zdHlsZS5taW5XaWR0aCA9IGV4YW1wbGVNaW5XaWR0aDtcbiAgICBhc091dHB1dEV4YW1wbGUuaW5wdXQuc3R5bGUucmVzaXplID0gJ25vbmUnO1xuICAgIGFzT3V0cHV0RXhhbXBsZS5pbnB1dC5zdHlsZS5taW5XaWR0aCA9IGV4YW1wbGVNaW5XaWR0aDtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgYXNPdXRwdXRFeGFtcGxlLmlucHV0LmRpc2FibGVkID0gJ3RydWUnO1xuICAgIGFzT3V0cHV0RXhhbXBsZS5yb290LmFwcGVuZCh1aS5kaXYoW1xuICAgICAgICB1aS5idXR0b24odWkuaWNvbkZBKCdjb3B5JywgKCkgPT4geyB9KSwgKCkgPT4ge1xuICAgICAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoYXNPdXRwdXRFeGFtcGxlLnZhbHVlKS50aGVuKCgpID0+IGdyb2suc2hlbGwuaW5mbygnU2VxdWVuY2Ugd2FzIGNvcGllZCB0byBjbGlwYm9hcmQnKSk7XG4gICAgICAgIH0pLFxuICAgIF0sICd1aS1pbnB1dC1vcHRpb25zJykpO1xuICAgIGFzRXhhbXBsZURpdi5hcHBlbmQoYXNJbnB1dEV4YW1wbGUucm9vdCk7XG4gICAgYXNFeGFtcGxlRGl2LmFwcGVuZChhc091dHB1dEV4YW1wbGUucm9vdCk7XG4gICAgdXBkYXRlVWlGb3JOZXdTZXF1ZW5jZUxlbmd0aCgpO1xuICAgIGNvbnN0IGV4YW1wbGVTZWN0aW9uID0gdWkuZGl2KFtcbiAgICAgICAgdWkuaDEoJ0V4YW1wbGUnKSxcbiAgICAgICAgc3NJbnB1dEV4YW1wbGUucm9vdCxcbiAgICAgICAgc3NPdXRwdXRFeGFtcGxlLnJvb3QsXG4gICAgICAgIGFzRXhhbXBsZURpdixcbiAgICBdLCAndWktZm9ybScpO1xuICAgIGNvbnN0IGlucHV0c1NlY3Rpb24gPSB1aS5kaXYoW1xuICAgICAgICB1aS5oMSgnSW5wdXRzJyksXG4gICAgICAgIHVpLmRpdkgoW1xuICAgICAgICAgICAgdGFibGVzLnJvb3QsXG4gICAgICAgICAgICBpbnB1dFNzQ29sdW1uRGl2LFxuICAgICAgICBdKSxcbiAgICAgICAgdWkuZGl2SChbXG4gICAgICAgICAgICBpbnB1dEFzQ29sdW1uRGl2LFxuICAgICAgICAgICAgaW5wdXRJZENvbHVtbkRpdixcbiAgICAgICAgXSksXG4gICAgICAgIHVpLmJ1dHRvbnNJbnB1dChbXG4gICAgICAgICAgICBjb252ZXJ0U2VxdWVuY2VCdXR0b24sXG4gICAgICAgIF0pLFxuICAgIF0sICd1aS1mb3JtJyk7XG4gICAgY29uc3QgbWFpblNlY3Rpb24gPSB1aS5wYW5lbChbXG4gICAgICAgIHVpLmJsb2NrKFtcbiAgICAgICAgICAgIHN2Z0RpdixcbiAgICAgICAgXSwgeyBzdHlsZTogeyBvdmVyZmxvd1g6ICdzY3JvbGwnIH0gfSksXG4gICAgICAgIHVpLmJ1dHRvbignRG93bmxvYWQnLCAoKSA9PiBzdmcuc2F2ZVN2Z0FzUG5nKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdteVN2ZycpLCBzYXZlQXMudmFsdWUpKSxcbiAgICAgICAgaXNFbnVtZXJhdGVNb2RpZmljYXRpb25zRGl2LFxuICAgICAgICB1aS5kaXYoW1xuICAgICAgICAgICAgdWkuZGl2KFtcbiAgICAgICAgICAgICAgICB1aS5kaXZIKFtcbiAgICAgICAgICAgICAgICAgICAgdWkuaDEoJ1BhdHRlcm4nKSxcbiAgICAgICAgICAgICAgICAgICAgdWkuZGl2KFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVpLmljb25GQSgncXVlc3Rpb24tY2lyY2xlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcEF4b2xhYnNEZXNjcmlwdGlvbi5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBBeG9sYWJzRGVzY3JpcHRpb24uYXBwZW5kKGluZm8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIF0sIHsgc3R5bGU6IHsgcGFkZGluZzogJzJweCcgfSB9KSxcbiAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICAgICB1aS5kaXZIKFtcbiAgICAgICAgICAgICAgICAgICAgdWkuZGl2KFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNzTGVuZ3RoLnJvb3QsXG4gICAgICAgICAgICAgICAgICAgICAgICBhc0xlbmd0aERpdixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlQmFzZS5yb290LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudC5yb290LFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9hZFBhdHRlcm5EaXYsXG4gICAgICAgICAgICAgICAgICAgICAgICBzYXZlQXMucm9vdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVpLmJ1dHRvbnNJbnB1dChbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZVBhdHRlcm5CdXR0b24sXG4gICAgICAgICAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICAgICAgICAgXSwgJ3VpLWZvcm0nKSxcbiAgICAgICAgICAgICAgICAgICAgdWkuZGl2KFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUFzU3RyYW5kLnJvb3QsXG4gICAgICAgICAgICAgICAgICAgICAgICBmdWxseVB0by5yb290LFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RTc1B0by5yb290LFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RBc1B0b0RpdixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNzRml2ZU1vZGlmaWNhdGlvbi5yb290LFxuICAgICAgICAgICAgICAgICAgICAgICAgc3NUaHJlZU1vZGlmaWNhdGlvbi5yb290LFxuICAgICAgICAgICAgICAgICAgICAgICAgYXNNb2RpZmljYXRpb25EaXYsXG4gICAgICAgICAgICAgICAgICAgIF0sICd1aS1mb3JtJyksXG4gICAgICAgICAgICAgICAgXSwgJ3VpLWZvcm0nKSxcbiAgICAgICAgICAgIF0sICd1aS1mb3JtJyksXG4gICAgICAgICAgICBpbnB1dHNTZWN0aW9uLFxuICAgICAgICAgICAgZXhhbXBsZVNlY3Rpb24sXG4gICAgICAgIF0sIHsgc3R5bGU6IHsgZmxleFdyYXA6ICd3cmFwJyB9IH0pLFxuICAgIF0pO1xuICAgIGNvbnN0IHNzTW9kaWZpY2F0aW9uU2VjdGlvbiA9IHVpLnBhbmVsKFtcbiAgICAgICAgdWkuaDEoJ1NlbnNlIFN0cmFuZCcpLFxuICAgICAgICB1aS5kaXZIKFtcbiAgICAgICAgICAgIHVpLmRpdihbdWkuZGl2VGV4dCgnIycpXSwgeyBzdHlsZTogeyB3aWR0aDogJzIwcHgnIH0gfSksXG4gICAgICAgICAgICB1aS5ibG9jazc1KFt1aS5kaXZUZXh0KCdNb2RpZmljYXRpb24nKV0pLFxuICAgICAgICAgICAgdWkuZGl2KFt1aS5kaXZUZXh0KCdQVE8nKV0sIHsgc3R5bGU6IHsgcGFkZGluZ1JpZ2h0OiAnOHB4JyB9IH0pLFxuICAgICAgICBdKSxcbiAgICAgICAgc3NNb2RpZmljYXRpb25JdGVtcyxcbiAgICBdKTtcbiAgICBjb25zdCBhc01vZGlmaWNhdGlvblNlY3Rpb24gPSB1aS5wYW5lbChbXG4gICAgICAgIHVpLmgxKCdBbnRpc2Vuc2UgU3RyYW5kJyksXG4gICAgICAgIHVpLmRpdkgoW1xuICAgICAgICAgICAgdWkuZGl2KFt1aS5kaXZUZXh0KCcjJyldLCB7IHN0eWxlOiB7IHdpZHRoOiAnMjBweCcgfSB9KSxcbiAgICAgICAgICAgIHVpLmJsb2NrNzUoW3VpLmRpdlRleHQoJ01vZGlmaWNhdGlvbicpXSksXG4gICAgICAgICAgICB1aS5kaXYoW3VpLmRpdlRleHQoJ1BUTycpXSwgeyBzdHlsZTogeyBwYWRkaW5nUmlnaHQ6ICc4cHgnIH0gfSksXG4gICAgICAgIF0pLFxuICAgICAgICBhc01vZGlmaWNhdGlvbkl0ZW1zLFxuICAgIF0pO1xuICAgIGNvbnN0IGluZm8gPSB1aS5pbmZvKFtcbiAgICAgICAgdWkuZGl2VGV4dCgnXFxuIEhvdyB0byBkZWZpbmUgbmV3IHBhdHRlcm46JywgeyBzdHlsZTogeyAnZm9udC13ZWlnaHQnOiAnYm9sZGVyJyB9IH0pLFxuICAgICAgICB1aS5kaXZUZXh0KCcxLiBDaG9vc2UgdGFibGUgYW5kIGNvbHVtbnMgd2l0aCBzZW5zZSBhbmQgYW50aXNlbnNlIHN0cmFuZHMnKSxcbiAgICAgICAgdWkuZGl2VGV4dCgnMi4gQ2hvb3NlIGxlbmd0aHMgb2YgYm90aCBzdHJhbmRzIGJ5IGVkaXRpbmcgY2hlY2tib3hlcyBiZWxvdycpLFxuICAgICAgICB1aS5kaXZUZXh0KCczLiBDaG9vc2UgYmFzaXMgYW5kIFBUTyBzdGF0dXMgZm9yIGVhY2ggbnVjbGVvdGlkZScpLFxuICAgICAgICB1aS5kaXZUZXh0KCc0LiBTZXQgYWRkaXRpb25hbCBtb2RpZmljYXRpb25zIGZvciBzZXF1ZW5jZSBlZGdlcycpLFxuICAgICAgICB1aS5kaXZUZXh0KCc1LiBQcmVzcyBcXCdDb252ZXJ0IFNlcXVlbmNlc1xcJyBidXR0b24nKSxcbiAgICAgICAgdWkuZGl2VGV4dCgnVGhpcyB3aWxsIGFkZCB0aGUgcmVzdWx0IGNvbHVtbihzKSB0byB0aGUgcmlnaHQgb2YgdGhlIHRhYmxlJyksXG4gICAgXSwgJ0NyZWF0ZSBhbmQgYXBwbHkgQXhvbGFicyB0cmFuc2xhdGlvbiBwYXR0ZXJucy4nKTtcbiAgICByZXR1cm4gdWkuc3BsaXRIKFtcbiAgICAgICAgdWkuZGl2KFtcbiAgICAgICAgICAgIGFwcEF4b2xhYnNEZXNjcmlwdGlvbixcbiAgICAgICAgICAgIG1haW5TZWN0aW9uLFxuICAgICAgICBdKSxcbiAgICAgICAgdWkuYm94KHVpLmRpdkgoW1xuICAgICAgICAgICAgc3NNb2RpZmljYXRpb25TZWN0aW9uLFxuICAgICAgICAgICAgYXNNb2RpZmljYXRpb25TZWN0aW9uLFxuICAgICAgICBdKSwgeyBzdHlsZTogeyBtYXhXaWR0aDogJzM2MHB4JyB9IH0pLFxuICAgIF0pO1xufVxuIiwiaW1wb3J0IHsgYXhvbGFic01hcCB9IGZyb20gJy4vYXhvbGFic01hcCc7XG4vLyBodHRwczovL3V4ZGVzaWduLmNjL3N0YXItcmF0aW5nLW1ha2Utc3ZnLWdyZWF0LWFnYWluLWQ0Y2U0NzMxMzQ3ZVxuZnVuY3Rpb24gZ2V0UG9pbnRzVG9EcmF3U3RhcihjZW50ZXJYLCBjZW50ZXJZKSB7XG4gICAgY29uc3QgaW5uZXJDaXJjbGVQb2ludHMgPSA1OyAvLyBhIDUgcG9pbnQgc3RhclxuICAgIGNvbnN0IGlubmVyUmFkaXVzID0gMTUgLyBpbm5lckNpcmNsZVBvaW50cztcbiAgICBjb25zdCBpbm5lck91dGVyUmFkaXVzUmF0aW8gPSAyOyAvLyBvdXR0ZXIgY2lyY2xlIGlzIHgyIHRoZSBpbm5lclxuICAgIGNvbnN0IG91dGVyUmFkaXVzID0gaW5uZXJSYWRpdXMgKiBpbm5lck91dGVyUmFkaXVzUmF0aW87XG4gICAgY29uc3QgYW5nbGUgPSBNYXRoLlBJIC8gaW5uZXJDaXJjbGVQb2ludHM7XG4gICAgY29uc3QgYW5nbGVPZmZzZXRUb0NlbnRlclN0YXIgPSA2MDtcbiAgICBjb25zdCB0b3RhbE51bWJlck9mUG9pbnRzID0gaW5uZXJDaXJjbGVQb2ludHMgKiAyOyAvLyAxMCBpbiBhIDUtcG9pbnRzIHN0YXJcbiAgICBsZXQgcG9pbnRzID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b3RhbE51bWJlck9mUG9pbnRzOyBpKyspIHtcbiAgICAgICAgY29uc3QgciA9IChpICUgMiA9PSAwKSA/IG91dGVyUmFkaXVzIDogaW5uZXJSYWRpdXM7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRYID0gY2VudGVyWCArIE1hdGguY29zKGkgKiBhbmdsZSArIGFuZ2xlT2Zmc2V0VG9DZW50ZXJTdGFyKSAqIHI7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRZID0gY2VudGVyWSArIE1hdGguc2luKGkgKiBhbmdsZSArIGFuZ2xlT2Zmc2V0VG9DZW50ZXJTdGFyKSAqIHI7XG4gICAgICAgIHBvaW50cyArPSBjdXJyZW50WCArICcsJyArIGN1cnJlbnRZICsgJyAnO1xuICAgIH1cbiAgICByZXR1cm4gcG9pbnRzO1xufVxuZnVuY3Rpb24gY291bnRPdmVyaGFuZ3NPblRoZVJpZ2h0RWRnZShtb2RpZmljYXRpb25zKSB7XG4gICAgbGV0IGkgPSAwO1xuICAgIHdoaWxlIChpIDwgbW9kaWZpY2F0aW9ucy5sZW5ndGggJiYgbW9kaWZpY2F0aW9uc1tpXS5zbGljZSgtMykgPT0gJyhvKScpXG4gICAgICAgIGkrKztcbiAgICByZXR1cm4gKGkgPT0gbW9kaWZpY2F0aW9ucy5sZW5ndGggLSAxKSA/IDAgOiBpO1xufVxuZnVuY3Rpb24gZ2V0VGV4dFdpZHRoKHRleHQsIGZvbnQpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJykuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29udGV4dC5mb250ID0gU3RyaW5nKGZvbnQpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICByZXR1cm4gMiAqIGNvbnRleHQubWVhc3VyZVRleHQodGV4dCkud2lkdGg7XG59XG5mdW5jdGlvbiBnZXRUZXh0SW5zaWRlQ2lyY2xlKGJhc2VzLCBpbmRleCwgbnVjbGVvdGlkZUNvdW50ZXIsIG51bWJlck9mTnVjbGVvdGlkZXMsIGVudW1lcmF0ZU1vZGlmaWNhdGlvbnMpIHtcbiAgICByZXR1cm4gKGJhc2VzW2luZGV4XS5zbGljZSgtMykgPT0gJyhvKScpIHx8ICFlbnVtZXJhdGVNb2RpZmljYXRpb25zLmluY2x1ZGVzKGJhc2VzW2luZGV4XSkgPyAnJyA6XG4gICAgICAgIFsnQScsICdHJywgJ0MnLCAnVScsICdUJ10uaW5jbHVkZXMoYmFzZXNbaW5kZXhdKSA/IGJhc2VzW2luZGV4XSA6IFN0cmluZyhudW1iZXJPZk51Y2xlb3RpZGVzIC0gbnVjbGVvdGlkZUNvdW50ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Rm9udENvbG9yVmlzaWJsZU9uQmFja2dyb3VuZChyZ2JTdHJpbmcpIHtcbiAgICBjb25zdCByZ2JJbnRMaXN0ID0gcmdiU3RyaW5nLm1hdGNoKC9cXGQrL2cpLm1hcCgoZSkgPT4gTnVtYmVyKGUpKTtcbiAgICByZXR1cm4gKHJnYkludExpc3RbMF0gKiAwLjI5OSArIHJnYkludExpc3RbMV0gKiAwLjU4NyArIHJnYkludExpc3RbMl0gKiAwLjExNCkgPiAxODYgPyAnIzMzMzMzJyA6ICcjZmZmZmZmJztcbn1cbmZ1bmN0aW9uIGdldEJhc2VDb2xvcihiYXNlKSB7XG4gICAgcmV0dXJuIGF4b2xhYnNNYXBbYmFzZV1bJ2NvbG9yJ107XG59XG5leHBvcnQgZnVuY3Rpb24gZHJhd0F4b2xhYnNQYXR0ZXJuKHBhdHRlcm5OYW1lLCBhc0V4aXN0cywgc3NCYXNlcywgYXNCYXNlcywgc3NQdG9TdGF0dXNlcywgYXNQdG9TdGF0dXNlcywgc3NUaHJlZU1vZGlmaWNhdGlvbiwgc3NGaXZlTW9kaWZpY2F0aW9uLCBhc1RocmVlTW9kaWZpY2F0aW9uLCBhc0ZpdmVNb2RpZmljYXRpb24sIGNvbW1lbnQsIGVudW1lcmF0ZU1vZGlmaWNhdGlvbnMpIHtcbiAgICBmdW5jdGlvbiBnZXRFcXVpZGlzdGFudFhGb3JMZWdlbmQoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoKGluZGV4ICsgc3RhcnRGcm9tKSAqIHdpZHRoIC8gKHVuaXF1ZUJhc2VzLmxlbmd0aCArIHN0YXJ0RnJvbSkgKyBsZWdlbmRSYWRpdXMpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRYT2ZCYXNlQ2lyY2xlcyhpbmRleCwgcmlnaHRPdmVyaGFuZ3MpIHtcbiAgICAgICAgcmV0dXJuIHdpZHRoT2ZSaWdodE1vZGlmaWNhdGlvbiArXG4gICAgICAgICAgICAocmVzdWx0aW5nTnVtYmVyT2ZOdWNsZW90aWRlc0luU3RyYW5kcyAtIGluZGV4ICsgcmlnaHRPdmVyaGFuZ3MgKyAxKSAqIGJhc2VEaWFtZXRlcjtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0U2hpZnRUb0FsaWduTnVtYmVySW5zaWRlQ2lyY2xlKGJhc2VzLCBnZW5lcmFsSW5kZXgsIG51Y2xlb3RpZGVJbmRleCkge1xuICAgICAgICByZXR1cm4gKG51Y2xlb3RpZGVJbmRleCA8IDEwIHx8IFsnQScsICdHJywgJ0MnLCAnVScsICdUJ10uXG4gICAgICAgICAgICBpbmNsdWRlcyhiYXNlc1tnZW5lcmFsSW5kZXhdKSkgPyBzaGlmdFRvQWxpZ25PbmVEaWdpdE51bWJlckluc2lkZUNpcmNsZSA6IHNoaWZ0VG9BbGlnblR3b0RpZ2l0TnVtYmVySW5zaWRlQ2lyY2xlO1xuICAgIH1cbiAgICBjb25zdCBzdmcgPSB7XG4gICAgICAgIHhtbG5zOiAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLFxuICAgICAgICByZW5kZXI6IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgICAgICBjb25zdCBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHRoaXMueG1sbnMsICdzdmcnKTtcbiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCdpZCcsICdteVN2ZycpO1xuICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgU3RyaW5nKHdpZHRoKSk7XG4gICAgICAgICAgICBlLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgU3RyaW5nKGhlaWdodCkpO1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgIH0sXG4gICAgICAgIGNpcmNsZTogZnVuY3Rpb24gKHgsIHksIHJhZGl1cywgY29sb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlModGhpcy54bWxucywgJ2NpcmNsZScpO1xuICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ2N4JywgU3RyaW5nKHgpKTtcbiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCdjeScsIFN0cmluZyh5KSk7XG4gICAgICAgICAgICBlLnNldEF0dHJpYnV0ZSgncicsIFN0cmluZyhyYWRpdXMpKTtcbiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCdmaWxsJywgY29sb3IpO1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgIH0sXG4gICAgICAgIHRleHQ6IGZ1bmN0aW9uICh0ZXh0LCB4LCB5LCBmb250U2l6ZSwgY29sb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlModGhpcy54bWxucywgJ3RleHQnKTtcbiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCd4JywgU3RyaW5nKHgpKTtcbiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCd5JywgU3RyaW5nKHkpKTtcbiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCdmb250LXNpemUnLCBTdHJpbmcoZm9udFNpemUpKTtcbiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCdmb250LXdlaWdodCcsICdub3JtYWwnKTtcbiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCdmb250LWZhbWlseScsICdBcmlhbCcpO1xuICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCBjb2xvcik7XG4gICAgICAgICAgICBlLmlubmVySFRNTCA9IHRleHQ7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgfSxcbiAgICAgICAgc3RhcjogZnVuY3Rpb24gKHgsIHksIGZpbGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlModGhpcy54bWxucywgJ3BvbHlnb24nKTtcbiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCdwb2ludHMnLCBnZXRQb2ludHNUb0RyYXdTdGFyKHgsIHkpKTtcbiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCdmaWxsJywgZmlsbCk7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgfSxcbiAgICB9O1xuICAgIHNzQmFzZXMgPSBzc0Jhc2VzLnJldmVyc2UoKTtcbiAgICBzc1B0b1N0YXR1c2VzID0gc3NQdG9TdGF0dXNlcy5yZXZlcnNlKCk7XG4gICAgY29uc3QgYmFzZVJhZGl1cyA9IDE1O1xuICAgIGNvbnN0IHNoaWZ0VG9BbGlnblR3b0RpZ2l0TnVtYmVySW5zaWRlQ2lyY2xlID0gLTEwO1xuICAgIGNvbnN0IHNoaWZ0VG9BbGlnbk9uZURpZ2l0TnVtYmVySW5zaWRlQ2lyY2xlID0gLTU7XG4gICAgY29uc3QgbGVnZW5kUmFkaXVzID0gNjtcbiAgICBjb25zdCBwc0xpbmthZ2VSYWRpdXMgPSA1O1xuICAgIGNvbnN0IGJhc2VGb250U2l6ZSA9IDE3O1xuICAgIGNvbnN0IGxlZ2VuZEZvbnRTaXplID0gMTQ7XG4gICAgY29uc3QgcHNMaW5rYWdlQ29sb3IgPSAncmVkJztcbiAgICBjb25zdCBmb250Q29sb3IgPSAndmFyKC0tZ3JleS02KSc7XG4gICAgY29uc3QgdGl0bGVGb250Q29sb3IgPSAnYmxhY2snO1xuICAgIGNvbnN0IG1vZGlmaWNhdGlvbnNDb2xvciA9ICdyZWQnO1xuICAgIGNvbnN0IHNzTGVmdFRleHQgPSAnU1M6IDVcXCcnO1xuICAgIGNvbnN0IGFzTGVmdFRleHQgPSAnQVM6IDNcXCcnO1xuICAgIGNvbnN0IHNzUmlnaHRUZXh0ID0gJzNcXCcnO1xuICAgIGNvbnN0IGFzUmlnaHRUZXh0ID0gJzVcXCcnO1xuICAgIGNvbnN0IHNzUmlnaHRPdmVyaGFuZ3MgPSBjb3VudE92ZXJoYW5nc09uVGhlUmlnaHRFZGdlKHNzQmFzZXMpO1xuICAgIGNvbnN0IGFzUmlnaHRPdmVyaGFuZ3MgPSBjb3VudE92ZXJoYW5nc09uVGhlUmlnaHRFZGdlKGFzQmFzZXMpO1xuICAgIGNvbnN0IHJlc3VsdGluZ051bWJlck9mTnVjbGVvdGlkZXNJblN0cmFuZHMgPSBNYXRoLm1heChzc0Jhc2VzLmxlbmd0aCAtIHNzUmlnaHRPdmVyaGFuZ3MsIGFzQmFzZXMubGVuZ3RoIC0gYXNSaWdodE92ZXJoYW5ncyk7XG4gICAgY29uc3QgYmFzZURpYW1ldGVyID0gMiAqIGJhc2VSYWRpdXM7XG4gICAgY29uc3Qgd2lkdGhPZkJhc2VzID0gYmFzZURpYW1ldGVyICogKHJlc3VsdGluZ051bWJlck9mTnVjbGVvdGlkZXNJblN0cmFuZHMgKyBNYXRoLm1heChzc1JpZ2h0T3ZlcmhhbmdzLCBhc1JpZ2h0T3ZlcmhhbmdzKSk7XG4gICAgY29uc3Qgd2lkdGhPZkxlZnRNb2RpZmljYXRpb24gPSBNYXRoLm1heChnZXRUZXh0V2lkdGgoc3NUaHJlZU1vZGlmaWNhdGlvbiwgYmFzZUZvbnRTaXplKSwgZ2V0VGV4dFdpZHRoKGFzRml2ZU1vZGlmaWNhdGlvbiwgYmFzZUZvbnRTaXplKSk7XG4gICAgY29uc3Qgd2lkdGhPZlJpZ2h0TW9kaWZpY2F0aW9uID0gTWF0aC5tYXgoZ2V0VGV4dFdpZHRoKHNzRml2ZU1vZGlmaWNhdGlvbiwgYmFzZUZvbnRTaXplKSwgZ2V0VGV4dFdpZHRoKGFzVGhyZWVNb2RpZmljYXRpb24sIGJhc2VGb250U2l6ZSkpO1xuICAgIGNvbnN0IHdpZHRoT2ZMZWZ0VGV4dCA9IE1hdGgubWF4KGdldFRleHRXaWR0aChzc0xlZnRUZXh0LCBiYXNlRm9udFNpemUpLCBnZXRUZXh0V2lkdGgoYXNMZWZ0VGV4dCwgYmFzZUZvbnRTaXplKSk7XG4gICAgY29uc3Qgd2lkdGhPZlJpZ2h0VGV4dCA9IE1hdGgubWF4KGdldFRleHRXaWR0aChzc1JpZ2h0VGV4dCwgYmFzZUZvbnRTaXplKSwgZ2V0VGV4dFdpZHRoKGFzUmlnaHRUZXh0LCBiYXNlRm9udFNpemUpKTtcbiAgICBjb25zdCB3aWR0aCA9IHdpZHRoT2ZMZWZ0VGV4dCArIHdpZHRoT2ZMZWZ0TW9kaWZpY2F0aW9uICsgd2lkdGhPZkJhc2VzICtcbiAgICAgICAgd2lkdGhPZlJpZ2h0TW9kaWZpY2F0aW9uICsgd2lkdGhPZlJpZ2h0VGV4dCArIGJhc2VEaWFtZXRlcjtcbiAgICBjb25zdCBoZWlnaHQgPSBhc0V4aXN0cyA/IDExICogYmFzZVJhZGl1cyA6IDkgKiBiYXNlUmFkaXVzO1xuICAgIGNvbnN0IHhPZlRpdGxlID0gYmFzZVJhZGl1czsgLy8gTWF0aC5yb3VuZCh3aWR0aCAvIDQpLFxuICAgIGNvbnN0IHVuaXF1ZUJhc2VzID0gYXNFeGlzdHMgPyBbLi4ubmV3IFNldChzc0Jhc2VzLmNvbmNhdChhc0Jhc2VzKSldIDogWy4uLm5ldyBTZXQoc3NCYXNlcyldO1xuICAgIGNvbnN0IGlzUHRvRXhpc3QgPSBhc0V4aXN0cyA/IFsuLi5uZXcgU2V0KHNzUHRvU3RhdHVzZXMuY29uY2F0KGFzUHRvU3RhdHVzZXMpKV0uaW5jbHVkZXModHJ1ZSkgOlxuICAgICAgICBbLi4ubmV3IFNldChzc1B0b1N0YXR1c2VzKV0uaW5jbHVkZXModHJ1ZSk7XG4gICAgY29uc3Qgc3RhcnRGcm9tID0gaXNQdG9FeGlzdCA/IDEgOiAwO1xuICAgIGNvbnN0IHhPZkxlZnRUZXh0cyA9IDA7XG4gICAgY29uc3QgeE9mTGVmdE1vZGlmaWNhdGlvbnMgPSB4T2ZMZWZ0VGV4dHMgKyB3aWR0aE9mTGVmdFRleHQgLSA1O1xuICAgIGNvbnN0IHhPZlNzUmlnaHRNb2RpZmljYXRpb25zID0gc3NSaWdodE92ZXJoYW5ncyAqIGJhc2VEaWFtZXRlciArIGdldFhPZkJhc2VDaXJjbGVzKC0wLjUsIDApO1xuICAgIGNvbnN0IHhPZkFzUmlnaHRNb2RpZmljYXRpb25zID0gYXNSaWdodE92ZXJoYW5ncyAqIGJhc2VEaWFtZXRlciArIGdldFhPZkJhc2VDaXJjbGVzKC0wLjUsIDApO1xuICAgIGNvbnN0IHhPZlJpZ2h0VGV4dHMgPSBNYXRoLm1heCh4T2ZTc1JpZ2h0TW9kaWZpY2F0aW9ucywgeE9mQXNSaWdodE1vZGlmaWNhdGlvbnMpICtcbiAgICAgICAgd2lkdGhPZkxlZnRNb2RpZmljYXRpb24gKyBiYXNlRGlhbWV0ZXIgKiAoTWF0aC5tYXgoc3NSaWdodE92ZXJoYW5ncywgYXNSaWdodE92ZXJoYW5ncykpO1xuICAgIGNvbnN0IHlPZlRpdGxlID0gYmFzZVJhZGl1cztcbiAgICBjb25zdCB5T2ZTc1RleHRzID0gNCAqIGJhc2VSYWRpdXM7XG4gICAgY29uc3QgeU9mQXNUZXh0cyA9IDcgKiBiYXNlUmFkaXVzO1xuICAgIGNvbnN0IHlPZkNvbW1lbnQgPSBhc0V4aXN0cyA/IDExICogYmFzZVJhZGl1cyA6IDguNSAqIGJhc2VSYWRpdXM7XG4gICAgY29uc3QgeU9mU3NDaXJjbGVzID0gMy41ICogYmFzZVJhZGl1cztcbiAgICBjb25zdCB5T2ZBc0NpcmNsZXMgPSA2LjUgKiBiYXNlUmFkaXVzO1xuICAgIGNvbnN0IHlPZkNpcmNsZXNJbkxlZ2VuZHMgPSBhc0V4aXN0cyA/IDkgKiBiYXNlUmFkaXVzIDogNiAqIGJhc2VSYWRpdXM7XG4gICAgY29uc3QgeU9mVGV4dExlZ2VuZCA9IGFzRXhpc3RzID8gOS41ICogYmFzZVJhZGl1cyAtIDMgOiB5T2ZBc0NpcmNsZXMgLSAzO1xuICAgIGNvbnN0IGltYWdlID0gc3ZnLnJlbmRlcih3aWR0aCwgaGVpZ2h0KTtcbiAgICBpbWFnZS5hcHBlbmQoc3ZnLnRleHQoc3NMZWZ0VGV4dCwgeE9mTGVmdFRleHRzLCB5T2ZTc1RleHRzLCBiYXNlRm9udFNpemUsIGZvbnRDb2xvciksIGFzRXhpc3RzID8gc3ZnLnRleHQoYXNMZWZ0VGV4dCwgeE9mTGVmdFRleHRzLCB5T2ZBc1RleHRzLCBiYXNlRm9udFNpemUsIGZvbnRDb2xvcikgOiAnJywgc3ZnLnRleHQoc3NSaWdodFRleHQsIHhPZlJpZ2h0VGV4dHMsIHlPZlNzVGV4dHMsIGJhc2VGb250U2l6ZSwgZm9udENvbG9yKSwgYXNFeGlzdHMgPyBzdmcudGV4dChhc1JpZ2h0VGV4dCwgeE9mUmlnaHRUZXh0cywgeU9mQXNUZXh0cywgYmFzZUZvbnRTaXplLCBmb250Q29sb3IpIDogJycsIHN2Zy50ZXh0KHNzRml2ZU1vZGlmaWNhdGlvbiwgeE9mTGVmdE1vZGlmaWNhdGlvbnMsIHlPZlNzVGV4dHMsIGJhc2VGb250U2l6ZSwgbW9kaWZpY2F0aW9uc0NvbG9yKSwgYXNFeGlzdHMgPyBzdmcudGV4dChhc1RocmVlTW9kaWZpY2F0aW9uLCB4T2ZMZWZ0TW9kaWZpY2F0aW9ucywgeU9mQXNUZXh0cywgYmFzZUZvbnRTaXplLCBtb2RpZmljYXRpb25zQ29sb3IpIDogJycsIHN2Zy50ZXh0KHNzVGhyZWVNb2RpZmljYXRpb24sIHhPZlNzUmlnaHRNb2RpZmljYXRpb25zLCB5T2ZTc1RleHRzLCBiYXNlRm9udFNpemUsIG1vZGlmaWNhdGlvbnNDb2xvciksIGFzRXhpc3RzID8gc3ZnLnRleHQoYXNGaXZlTW9kaWZpY2F0aW9uLCB4T2ZBc1JpZ2h0TW9kaWZpY2F0aW9ucywgeU9mQXNUZXh0cywgYmFzZUZvbnRTaXplLCBtb2RpZmljYXRpb25zQ29sb3IpIDogJycsIHN2Zy50ZXh0KGNvbW1lbnQsIHhPZkxlZnRUZXh0cywgeU9mQ29tbWVudCwgbGVnZW5kRm9udFNpemUsIGZvbnRDb2xvciksIGlzUHRvRXhpc3QgPyBzdmcuc3RhcihiYXNlUmFkaXVzLCB5T2ZDaXJjbGVzSW5MZWdlbmRzLCBwc0xpbmthZ2VDb2xvcikgOiAnJywgaXNQdG9FeGlzdCA/IHN2Zy50ZXh0KCdwcyBsaW5rYWdlJywgMiAqIGJhc2VSYWRpdXMgLSA4LCB5T2ZUZXh0TGVnZW5kLCBsZWdlbmRGb250U2l6ZSwgZm9udENvbG9yKSA6ICcnKTtcbiAgICBsZXQgbnVtYmVyT2ZTc051Y2xlb3RpZGVzID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNzQmFzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHNzQmFzZXNbaV0uc2xpY2UoLTMpICE9ICcobyknKVxuICAgICAgICAgICAgbnVtYmVyT2ZTc051Y2xlb3RpZGVzKys7XG4gICAgfVxuICAgIGxldCBudWNsZW90aWRlQ291bnRlciA9IG51bWJlck9mU3NOdWNsZW90aWRlcztcbiAgICBmb3IgKGxldCBpID0gc3NCYXNlcy5sZW5ndGggLSAxOyBpID4gLTE7IGktLSkge1xuICAgICAgICBpZiAoc3NCYXNlc1tpXS5zbGljZSgtMykgIT0gJyhvKScpXG4gICAgICAgICAgICBudWNsZW90aWRlQ291bnRlci0tO1xuICAgICAgICBpbWFnZS5hcHBlbmQoc3ZnLmNpcmNsZShnZXRYT2ZCYXNlQ2lyY2xlcyhpLCBzc1JpZ2h0T3ZlcmhhbmdzKSwgeU9mU3NDaXJjbGVzLCBiYXNlUmFkaXVzLCBnZXRCYXNlQ29sb3Ioc3NCYXNlc1tpXSkpLCBzdmcudGV4dChnZXRUZXh0SW5zaWRlQ2lyY2xlKHNzQmFzZXMsIGksIG51Y2xlb3RpZGVDb3VudGVyLCBudW1iZXJPZlNzTnVjbGVvdGlkZXMsIGVudW1lcmF0ZU1vZGlmaWNhdGlvbnMpLCBnZXRYT2ZCYXNlQ2lyY2xlcyhpLCBzc1JpZ2h0T3ZlcmhhbmdzKSArXG4gICAgICAgICAgICBnZXRTaGlmdFRvQWxpZ25OdW1iZXJJbnNpZGVDaXJjbGUoc3NCYXNlcywgc3NCYXNlcy5sZW5ndGggLSBpLCBudW1iZXJPZlNzTnVjbGVvdGlkZXMgLSBudWNsZW90aWRlQ291bnRlciksIHlPZlNzVGV4dHMsIGJhc2VGb250U2l6ZSwgZ2V0Rm9udENvbG9yVmlzaWJsZU9uQmFja2dyb3VuZChheG9sYWJzTWFwW3NzQmFzZXNbaV1dWydjb2xvciddKSksIHNzUHRvU3RhdHVzZXNbaV0gP1xuICAgICAgICAgICAgc3ZnLnN0YXIoZ2V0WE9mQmFzZUNpcmNsZXMoaSwgc3NSaWdodE92ZXJoYW5ncykgKyBiYXNlUmFkaXVzLCB5T2ZTc1RleHRzICsgcHNMaW5rYWdlUmFkaXVzLCBwc0xpbmthZ2VDb2xvcikgOlxuICAgICAgICAgICAgJycpO1xuICAgIH1cbiAgICBpbWFnZS5hcHBlbmQoc3NQdG9TdGF0dXNlc1tzc0Jhc2VzLmxlbmd0aF0gP1xuICAgICAgICBzdmcuc3RhcihnZXRYT2ZCYXNlQ2lyY2xlcyhzc0Jhc2VzLmxlbmd0aCwgc3NSaWdodE92ZXJoYW5ncykgK1xuICAgICAgICAgICAgYmFzZVJhZGl1cywgeU9mU3NUZXh0cyArIHBzTGlua2FnZVJhZGl1cywgcHNMaW5rYWdlQ29sb3IpIDogJycpO1xuICAgIGxldCBudW1iZXJPZkFzTnVjbGVvdGlkZXMgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXNCYXNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoYXNCYXNlc1tpXS5zbGljZSgtMykgIT0gJyhvKScpXG4gICAgICAgICAgICBudW1iZXJPZkFzTnVjbGVvdGlkZXMrKztcbiAgICB9XG4gICAgaWYgKGFzRXhpc3RzKSB7XG4gICAgICAgIGxldCBudWNsZW90aWRlQ291bnRlciA9IG51bWJlck9mQXNOdWNsZW90aWRlcztcbiAgICAgICAgZm9yIChsZXQgaSA9IGFzQmFzZXMubGVuZ3RoIC0gMTsgaSA+IC0xOyBpLS0pIHtcbiAgICAgICAgICAgIGlmIChhc0Jhc2VzW2ldLnNsaWNlKC0zKSAhPSAnKG8pJylcbiAgICAgICAgICAgICAgICBudWNsZW90aWRlQ291bnRlci0tO1xuICAgICAgICAgICAgaW1hZ2UuYXBwZW5kKHN2Zy5jaXJjbGUoZ2V0WE9mQmFzZUNpcmNsZXMoaSwgYXNSaWdodE92ZXJoYW5ncyksIHlPZkFzQ2lyY2xlcywgYmFzZVJhZGl1cywgZ2V0QmFzZUNvbG9yKGFzQmFzZXNbaV0pKSwgc3ZnLnRleHQoZ2V0VGV4dEluc2lkZUNpcmNsZShhc0Jhc2VzLCBpLCBudW1iZXJPZkFzTnVjbGVvdGlkZXMgLSBudWNsZW90aWRlQ291bnRlciAtIDEsIG51bWJlck9mQXNOdWNsZW90aWRlcywgZW51bWVyYXRlTW9kaWZpY2F0aW9ucyksIGdldFhPZkJhc2VDaXJjbGVzKGksIGFzUmlnaHRPdmVyaGFuZ3MpICtcbiAgICAgICAgICAgICAgICBnZXRTaGlmdFRvQWxpZ25OdW1iZXJJbnNpZGVDaXJjbGUoYXNCYXNlcywgaSwgbnVjbGVvdGlkZUNvdW50ZXIgKyAxKSwgeU9mQXNUZXh0cywgYmFzZUZvbnRTaXplLCBnZXRGb250Q29sb3JWaXNpYmxlT25CYWNrZ3JvdW5kKGF4b2xhYnNNYXBbYXNCYXNlc1tpXV1bJ2NvbG9yJ10pKSwgYXNQdG9TdGF0dXNlc1tpXSA/IHN2Zy5zdGFyKGdldFhPZkJhc2VDaXJjbGVzKGksIGFzUmlnaHRPdmVyaGFuZ3MpICtcbiAgICAgICAgICAgICAgICBiYXNlUmFkaXVzLCB5T2ZBc1RleHRzICsgcHNMaW5rYWdlUmFkaXVzLCBwc0xpbmthZ2VDb2xvcikgOiAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgaW1hZ2UuYXBwZW5kKGFzUHRvU3RhdHVzZXNbYXNCYXNlcy5sZW5ndGhdID9cbiAgICAgICAgICAgIHN2Zy5zdGFyKGdldFhPZkJhc2VDaXJjbGVzKGFzQmFzZXMubGVuZ3RoLCBhc1JpZ2h0T3ZlcmhhbmdzKSArXG4gICAgICAgICAgICAgICAgYmFzZVJhZGl1cywgeU9mQXNUZXh0cyArIHBzTGlua2FnZVJhZGl1cywgcHNMaW5rYWdlQ29sb3IpIDogJycpO1xuICAgIH1cbiAgICBjb25zdCB0aXRsZSA9IHBhdHRlcm5OYW1lICsgJyBmb3IgJyArXG4gICAgICAgIFN0cmluZyhudW1iZXJPZlNzTnVjbGVvdGlkZXMpICsgKGFzRXhpc3RzID8gJy8nICsgU3RyaW5nKG51bWJlck9mQXNOdWNsZW90aWRlcykgOiAnJykgKyAnbWVyJztcbiAgICBpbWFnZS5hcHBlbmQoc3ZnLnRleHQodGl0bGUsIHhPZlRpdGxlLCB5T2ZUaXRsZSwgYmFzZUZvbnRTaXplLCB0aXRsZUZvbnRDb2xvcikpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdW5pcXVlQmFzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaW1hZ2UuYXBwZW5kKHN2Zy5jaXJjbGUoZ2V0RXF1aWRpc3RhbnRYRm9yTGVnZW5kKGkpLCB5T2ZDaXJjbGVzSW5MZWdlbmRzLCBsZWdlbmRSYWRpdXMsIGdldEJhc2VDb2xvcih1bmlxdWVCYXNlc1tpXSkpLCBzdmcudGV4dCh1bmlxdWVCYXNlc1tpXSwgZ2V0RXF1aWRpc3RhbnRYRm9yTGVnZW5kKGkpICtcbiAgICAgICAgICAgIGxlZ2VuZFJhZGl1cyArIDQsIHlPZlRleHRMZWdlbmQsIGxlZ2VuZEZvbnRTaXplLCBmb250Q29sb3IpKTtcbiAgICB9XG4gICAgcmV0dXJuIGltYWdlO1xufVxuIiwiZXhwb3J0IGNvbnN0IFNBTFRTX0NTViA9IGBESVNQTEFZLE1PTFdFSUdIVFxubm8gRGF0YSBBZGRlZCwxMDBgO1xuIiwiZXhwb3J0IGNvbnN0IFNPVVJDRVMgPSBgRElTUExBWVxuTk8gREFUQVxuYDtcbiIsIi8vbmFtZTogYXNvR2FwbWVyc051Y2xlb3RpZGVzVG9CaW9TcHJpbmdcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogRE5BIG51Y2xlb3RpZGVzfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEJpb1NwcmluZyAvIEdhcG1lcnN9XG5leHBvcnQgZnVuY3Rpb24gYXNvR2FwbWVyc051Y2xlb3RpZGVzVG9CaW9TcHJpbmcobnVjbGVvdGlkZXMpIHtcbiAgICBsZXQgY291bnQgPSAtMTtcbiAgICBjb25zdCBvYmpGb3JFZGdlcyA9IHtcbiAgICAgICAgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJywgJ1QnOiAnNSonLCAnQSc6ICc2KicsICdDJzogJzcqJywgJ0cnOiAnOConXG4gICAgfTtcbiAgICBjb25zdCBvYmpGb3JDZW50ZXIgPSB7XG4gICAgICAgICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsICdUJzogJ1QqJywgJ0EnOiAnQSonLCAnQyc6ICc5KicsICdHJzogJ0cqJ1xuICAgIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfEF8VHxDfEcpL2csIGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIHJldHVybiAoY291bnQgPiA0ICYmIGNvdW50IDwgMTUpID8gb2JqRm9yQ2VudGVyW3hdIDogb2JqRm9yRWRnZXNbeF07XG4gICAgfSkuc2xpY2UoMCwgKG51Y2xlb3RpZGVzLmVuZHNXaXRoKCcoaW52YWJhc2ljKScpIHx8IG51Y2xlb3RpZGVzLmVuZHNXaXRoKCcoR2FsTkFjLTItSk5KKScpKSA/XG4gICAgICAgIG51Y2xlb3RpZGVzLmxlbmd0aCA6IDIgKiBjb3VudCArIDEpO1xufVxuLy9uYW1lOiBhc29HYXBtZXJzTnVjbGVvdGlkZXNUb0djcnNcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogRE5BIG51Y2xlb3RpZGVzfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEdDUlMgLyBHYXBtZXJzfVxuZXhwb3J0IGZ1bmN0aW9uIGFzb0dhcG1lcnNOdWNsZW90aWRlc1RvR2NycyhudWNsZW90aWRlcykge1xuICAgIGxldCBjb3VudCA9IC0xO1xuICAgIGNvbnN0IG9iakZvckVkZ2VzID0ge1xuICAgICAgICAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLCAnVCc6ICdtb2VVbnBzJyxcbiAgICAgICAgJ0EnOiAnbW9lQW5wcycsICdDJzogJ21vZTVtQ25wcycsICdHJzogJ21vZUducHMnXG4gICAgfTtcbiAgICBjb25zdCBvYmpGb3JDZW50ZXIgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdDJzogJzVtQ3BzJywgJ0EnOiAnQXBzJywgJ1QnOiAnVHBzJywgJ0cnOiAnR3BzJyB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxBfFR8Q3xHKS9nLCBmdW5jdGlvbiAoeCkge1xuICAgICAgICBjb3VudCsrO1xuICAgICAgICBpZiAoY291bnQgPCA1KVxuICAgICAgICAgICAgcmV0dXJuIChjb3VudCA9PSA0KSA/IG9iakZvckVkZ2VzW3hdLnNsaWNlKDAsIC0zKSArICdwcycgOiBvYmpGb3JFZGdlc1t4XTtcbiAgICAgICAgaWYgKGNvdW50IDwgMTUpXG4gICAgICAgICAgICByZXR1cm4gKGNvdW50ID09IDE0KSA/IG9iakZvckNlbnRlclt4XS5zbGljZSgwLCAtMikgKyAnbnBzJyA6IG9iakZvckNlbnRlclt4XTtcbiAgICAgICAgcmV0dXJuIG9iakZvckVkZ2VzW3hdO1xuICAgIH0pLnNsaWNlKDAsIChudWNsZW90aWRlcy5lbmRzV2l0aCgnKGludmFiYXNpYyknKSB8fCBudWNsZW90aWRlcy5lbmRzV2l0aCgnKEdhbE5BYy0yLUpOSiknKSkgP1xuICAgICAgICBudWNsZW90aWRlcy5sZW5ndGggOiAtMyk7XG59XG4vL25hbWU6IGFzb0dhcG1lcnNCaW9TcHJpbmdUb051Y2xlb3RpZGVzXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEJpb1NwcmluZyAvIEdhcG1lcnN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogRE5BIG51Y2xlb3RpZGVzfVxuZXhwb3J0IGZ1bmN0aW9uIGFzb0dhcG1lcnNCaW9TcHJpbmdUb051Y2xlb3RpZGVzKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnKic6ICcnLCAnNSc6ICdUJywgJzYnOiAnQScsICc3JzogJ0MnLCAnOCc6ICdHJywgJzknOiAnQycgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8XFwqfDV8Nnw3fDh8OSkvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IGFzb0dhcG1lcnNCaW9TcHJpbmdUb0djcnNcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogQmlvU3ByaW5nIC8gR2FwbWVyc31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBHQ1JTIC8gR2FwbWVyc31cbmV4cG9ydCBmdW5jdGlvbiBhc29HYXBtZXJzQmlvU3ByaW5nVG9HY3JzKG51Y2xlb3RpZGVzKSB7XG4gICAgbGV0IGNvdW50ID0gLTE7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnNSonOiAnbW9lVW5wcycsICc2Kic6ICdtb2VBbnBzJywgJzcqJzogJ21vZTVtQ25wcycsICc4Kic6ICdtb2VHbnBzJywgJzkqJzogJzVtQ3BzJywgJ0EqJzogJ0FwcycsICdUKic6ICdUcHMnLFxuICAgICAgICAnRyonOiAnR3BzJywgJ0MqJzogJ0NwcycsICc1JzogJ21vZVUnLCAnNic6ICdtb2VBJywgJzcnOiAnbW9lNW1DJywgJzgnOiAnbW9lRycsXG4gICAgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8NVxcKnw2XFwqfDdcXCp8OFxcKnw5XFwqfEFcXCp8VFxcKnxHXFwqfENcXCp8NXw2fDd8OCkvZywgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgY291bnQrKztcbiAgICAgICAgcmV0dXJuIChjb3VudCA9PSA0KSA/IG9ialt4XS5zbGljZSgwLCAtMykgKyAncHMnIDogKGNvdW50ID09IDE0KSA/IG9ialt4XS5zbGljZSgwLCAtMikgKyAnbnBzJyA6IG9ialt4XTtcbiAgICB9KTtcbn1cbi8vbmFtZTogYXNvR2FwbWVyc0djcnNUb0Jpb1NwcmluZ1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBHQ1JTIC8gR2FwbWVyc31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBCaW9TcHJpbmcgLyBHYXBtZXJzfVxuZXhwb3J0IGZ1bmN0aW9uIGFzb0dhcG1lcnNHY3JzVG9CaW9TcHJpbmcobnVjbGVvdGlkZXMpIHtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdtb2VUJzogJzUnLCAnbW9lQSc6ICc2JywgJ21vZTVtQyc6ICc3JywgJ21vZUcnOiAnOCcsICdtb2VVJzogJzUnLCAnNW1DJzogJzknLCAnbnBzJzogJyonLCAncHMnOiAnKicsICdVJzogJ1QnLFxuICAgIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfG1vZVR8bW9lQXxtb2U1bUN8bW9lR3xtb2VVfDVtQ3xucHN8cHN8VSkvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IGFzb0dhcG1lcnNHY3JzVG9OdWNsZW90aWRlc1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBHQ1JTIC8gR2FwbWVyc31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBETkEgbnVjbGVvdGlkZXN9XG5leHBvcnQgZnVuY3Rpb24gYXNvR2FwbWVyc0djcnNUb051Y2xlb3RpZGVzKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnbW9lJzogJycsICc1bSc6ICcnLCAnbic6ICcnLCAncHMnOiAnJywgJ1UnOiAnVCcgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8bW9lfDVtfG58cHN8VSkvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IHNpUm5hQmlvU3ByaW5nVG9OdWNsZW90aWRlc1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBCaW9TcHJpbmcgLyBzaVJOQX1cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBSTkEgbnVjbGVvdGlkZXN9XG5leHBvcnQgZnVuY3Rpb24gc2lSbmFCaW9TcHJpbmdUb051Y2xlb3RpZGVzKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnMSc6ICdVJywgJzInOiAnQScsICczJzogJ0MnLCAnNCc6ICdHJywgJzUnOiAnVScsICc2JzogJ0EnLCAnNyc6ICdDJywgJzgnOiAnRycsICcqJzogJycgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8MXwyfDN8NHw1fDZ8N3w4fFxcKikvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IHNpUm5hQmlvU3ByaW5nVG9BeG9sYWJzXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEJpb1NwcmluZyAvIHNpUk5BfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEF4b2xhYnMgLyBzaVJOQX1cbmV4cG9ydCBmdW5jdGlvbiBzaVJuYUJpb1NwcmluZ1RvQXhvbGFicyhudWNsZW90aWRlcykge1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJzEnOiAnVWYnLCAnMic6ICdBZicsICczJzogJ0NmJywgJzQnOiAnR2YnLCAnNSc6ICd1JywgJzYnOiAnYScsICc3JzogJ2MnLCAnOCc6ICdnJywgJyonOiAncycgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8MXwyfDN8NHw1fDZ8N3w4fFxcKikvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IHNpUm5hQmlvU3ByaW5nVG9HY3JzXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEJpb1NwcmluZyAvIHNpUk5BfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEdDUlN9XG5leHBvcnQgZnVuY3Rpb24gc2lSbmFCaW9TcHJpbmdUb0djcnMobnVjbGVvdGlkZXMpIHtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICcxJzogJ2ZVJywgJzInOiAnZkEnLCAnMyc6ICdmQycsICc0JzogJ2ZHJywgJzUnOiAnbVUnLCAnNic6ICdtQScsICc3JzogJ21DJywgJzgnOiAnbUcnLCAnKic6ICdwcycgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8MXwyfDN8NHw1fDZ8N3w4fFxcKikvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IHNpUm5hQXhvbGFic1RvR2Nyc1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBBeG9sYWJzIC8gc2lSTkF9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogR0NSU31cbmV4cG9ydCBmdW5jdGlvbiBzaVJuYUF4b2xhYnNUb0djcnMobnVjbGVvdGlkZXMpIHtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdVZic6ICdmVScsICdBZic6ICdmQScsICdDZic6ICdmQycsICdHZic6ICdmRycsICd1JzogJ21VJywgJ2EnOiAnbUEnLCAnYyc6ICdtQycsICdnJzogJ21HJywgJ3MnOiAncHMnLFxuICAgIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfFVmfEFmfENmfEdmfHV8YXxjfGd8cykvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IHNpUm5hQXhvbGFic1RvQmlvU3ByaW5nXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEF4b2xhYnMgLyBzaVJOQX1cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBCaW9TcHJpbmcgLyBzaVJOQX1cbmV4cG9ydCBmdW5jdGlvbiBzaVJuYUF4b2xhYnNUb0Jpb1NwcmluZyhudWNsZW90aWRlcykge1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ1VmJzogJzEnLCAnQWYnOiAnMicsICdDZic6ICczJywgJ0dmJzogJzQnLCAndSc6ICc1JywgJ2EnOiAnNicsICdjJzogJzcnLCAnZyc6ICc4JywgJ3MnOiAnKicsXG4gICAgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8VWZ8QWZ8Q2Z8R2Z8dXxhfGN8Z3xzKS9nLCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gb2JqW3hdOyB9KTtcbn1cbi8vbmFtZTogc2lSbmFBeG9sYWJzVG9OdWNsZW90aWRlc1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBBeG9sYWJzIC8gc2lSTkF9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogUk5BIG51Y2xlb3RpZGVzfVxuZXhwb3J0IGZ1bmN0aW9uIHNpUm5hQXhvbGFic1RvTnVjbGVvdGlkZXMobnVjbGVvdGlkZXMpIHtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdVZic6ICdVJywgJ0FmJzogJ0EnLCAnQ2YnOiAnQycsICdHZic6ICdHJywgJ3UnOiAnVScsICdhJzogJ0EnLCAnYyc6ICdDJywgJ2cnOiAnRycsICdzJzogJycsXG4gICAgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8VWZ8QWZ8Q2Z8R2Z8dXxhfGN8Z3xzKS9nLCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gb2JqW3hdOyB9KTtcbn1cbi8vbmFtZTogc2lSbmFHY3JzVG9OdWNsZW90aWRlc1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBHQ1JTfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IFJOQSBudWNsZW90aWRlc31cbmV4cG9ydCBmdW5jdGlvbiBzaVJuYUdjcnNUb051Y2xlb3RpZGVzKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnZlUnOiAnVScsICdmQSc6ICdBJywgJ2ZDJzogJ0MnLCAnZkcnOiAnRycsICdtVSc6ICdVJywgJ21BJzogJ0EnLCAnbUMnOiAnQycsICdtRyc6ICdHJywgJ3BzJzogJycsXG4gICAgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8ZlV8ZkF8ZkN8Zkd8bVV8bUF8bUN8bUd8cHMpL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuLy9uYW1lOiBzaVJuYUdjcnNUb0Jpb1NwcmluZ1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBHQ1JTfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEJpb1NwcmluZyAvIHNpUk5BfVxuZXhwb3J0IGZ1bmN0aW9uIHNpUm5hR2Nyc1RvQmlvU3ByaW5nKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnZlUnOiAnMScsICdmQSc6ICcyJywgJ2ZDJzogJzMnLCAnZkcnOiAnNCcsICdtVSc6ICc1JywgJ21BJzogJzYnLCAnbUMnOiAnNycsICdtRyc6ICc4JywgJ3BzJzogJyonLFxuICAgIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfGZVfGZBfGZDfGZHfG1VfG1BfG1DfG1HfHBzKS9nLCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gb2JqW3hdOyB9KTtcbn1cbi8vbmFtZTogc2lSbmFHY3JzVG9BeG9sYWJzXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEdDUlN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogQXhvbGFicyAvIHNpUk5BfVxuZXhwb3J0IGZ1bmN0aW9uIHNpUm5hR2Nyc1RvQXhvbGFicyhudWNsZW90aWRlcykge1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ2ZVJzogJ1VmJywgJ2ZBJzogJ0FmJywgJ2ZDJzogJ0NmJywgJ2ZHJzogJ0dmJywgJ21VJzogJ3UnLCAnbUEnOiAnYScsICdtQyc6ICdjJywgJ21HJzogJ2cnLCAncHMnOiAncycsXG4gICAgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8ZlV8ZkF8ZkN8Zkd8bVV8bUF8bUN8bUd8cHMpL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuLy9uYW1lOiBzaVJuYU51Y2xlb3RpZGVUb0Jpb1NwcmluZ1NlbnNlU3RyYW5kXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IFJOQSBudWNsZW90aWRlc31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBCaW9TcHJpbmcgLyBzaVJOQX1cbmV4cG9ydCBmdW5jdGlvbiBzaVJuYU51Y2xlb3RpZGVUb0Jpb1NwcmluZ1NlbnNlU3RyYW5kKG51Y2xlb3RpZGVzKSB7XG4gICAgbGV0IGNvdW50ID0gLTE7XG4gICAgY29uc3Qgb2JqRm9yTGVmdEVkZ2UgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdBJzogJzYqJywgJ1UnOiAnNSonLCAnRyc6ICc4KicsICdDJzogJzcqJyB9O1xuICAgIGNvbnN0IG9iakZvclJpZ2h0RWRnZSA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ0EnOiAnKjYnLCAnVSc6ICcqNScsICdHJzogJyo4JywgJ0MnOiAnKjcnIH07XG4gICAgY29uc3Qgb2JqRm9yT2RkSW5kaWNlcyA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ0EnOiAnNicsICdVJzogJzUnLCAnRyc6ICc4JywgJ0MnOiAnNycgfTtcbiAgICBjb25zdCBvYmpGb3JFdmVuSW5kaWNlcyA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJyxcbiAgICAgICAgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJywgJ0EnOiAnMicsICdVJzogJzEnLCAnRyc6ICc0JywgJ0MnOiAnMycgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8QXxVfEd8QykvZywgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgY291bnQrKztcbiAgICAgICAgaWYgKGNvdW50IDwgMilcbiAgICAgICAgICAgIHJldHVybiBvYmpGb3JMZWZ0RWRnZVt4XTtcbiAgICAgICAgaWYgKGNvdW50ID4gbnVjbGVvdGlkZXMubGVuZ3RoIC0gMylcbiAgICAgICAgICAgIHJldHVybiBvYmpGb3JSaWdodEVkZ2VbeF07XG4gICAgICAgIHJldHVybiAoY291bnQgJSAyID09IDApID8gb2JqRm9yRXZlbkluZGljZXNbeF0gOiBvYmpGb3JPZGRJbmRpY2VzW3hdO1xuICAgIH0pO1xufVxuLy9uYW1lOiBzaVJuYU51Y2xlb3RpZGVzVG9HY3JzXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IFJOQSBudWNsZW90aWRlc31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBHQ1JTfVxuZXhwb3J0IGZ1bmN0aW9uIHNpUm5hTnVjbGVvdGlkZXNUb0djcnMobnVjbGVvdGlkZXMpIHtcbiAgICBsZXQgY291bnQgPSAtMTtcbiAgICBjb25zdCBvYmpGb3JMZWZ0RWRnZSA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ0EnOiAnbUFwcycsICdVJzogJ21VcHMnLCAnRyc6ICdtR3BzJywgJ0MnOiAnbUNwcycgfTtcbiAgICBjb25zdCBvYmpGb3JSaWdodEVkZ2UgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdBJzogJ3BzbUEnLCAnVSc6ICdwc21VJywgJ0cnOiAncHNtRycsICdDJzogJ3BzbUMnIH07XG4gICAgY29uc3Qgb2JqRm9yRXZlbkluZGljZXMgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsXG4gICAgICAgICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsICdBJzogJ2ZBJywgJ1UnOiAnZlUnLCAnRyc6ICdmRycsICdDJzogJ2ZDJyB9O1xuICAgIGNvbnN0IG9iakZvck9kZEluZGljZXMgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsXG4gICAgICAgICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsICdBJzogJ21BJywgJ1UnOiAnbVUnLCAnRyc6ICdtRycsICdDJzogJ21DJyB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxBfFV8R3xDKS9nLCBmdW5jdGlvbiAoeCkge1xuICAgICAgICBjb3VudCsrO1xuICAgICAgICBpZiAoY291bnQgPCAyKVxuICAgICAgICAgICAgcmV0dXJuIG9iakZvckxlZnRFZGdlW3hdO1xuICAgICAgICBpZiAoY291bnQgPiBudWNsZW90aWRlcy5sZW5ndGggLSAzKVxuICAgICAgICAgICAgcmV0dXJuIG9iakZvclJpZ2h0RWRnZVt4XTtcbiAgICAgICAgcmV0dXJuIChjb3VudCAlIDIgPT0gMCkgPyBvYmpGb3JFdmVuSW5kaWNlc1t4XSA6IG9iakZvck9kZEluZGljZXNbeF07XG4gICAgfSk7XG59XG4vL25hbWU6IHNpUm5hTnVjbGVvdGlkZVRvQXhvbGFic1NlbnNlU3RyYW5kXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IFJOQSBudWNsZW90aWRlc31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBBeG9sYWJzfVxuZXhwb3J0IGZ1bmN0aW9uIHNpUm5hTnVjbGVvdGlkZVRvQXhvbGFic1NlbnNlU3RyYW5kKG51Y2xlb3RpZGVzKSB7XG4gICAgbGV0IGNvdW50ID0gLTE7XG4gICAgY29uc3Qgb2JqRm9yTGVmdEVkZ2UgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdBJzogJ2FzJywgJ1UnOiAndXMnLCAnRyc6ICdncycsICdDJzogJ2NzJyB9O1xuICAgIGNvbnN0IG9iakZvclNvbWVJbmRpY2VzID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLFxuICAgICAgICAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLCAnQSc6ICdBZicsICdVJzogJ1VmJywgJ0cnOiAnR2YnLCAnQyc6ICdDZicgfTtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdBJzogJ2EnLCAnVSc6ICd1JywgJ0cnOiAnZycsICdDJzogJ2MnIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfEF8VXxHfEMpL2csIGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIGlmIChjb3VudCA8IDIpXG4gICAgICAgICAgICByZXR1cm4gb2JqRm9yTGVmdEVkZ2VbeF07XG4gICAgICAgIGlmIChjb3VudCA9PSA2IHx8IChjb3VudCA+IDcgJiYgY291bnQgPCAxMSkpXG4gICAgICAgICAgICByZXR1cm4gb2JqRm9yU29tZUluZGljZXNbeF07XG4gICAgICAgIGlmIChjb3VudCA9PSBudWNsZW90aWRlcy5sZW5ndGggLSAxKVxuICAgICAgICAgICAgcmV0dXJuICdhJztcbiAgICAgICAgcmV0dXJuIG9ialt4XTtcbiAgICB9KTtcbn1cbi8vbmFtZTogc2lSbmFOdWNsZW90aWRlVG9BeG9sYWJzQW50aXNlbnNlU3RyYW5kXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IFJOQSBudWNsZW90aWRlc31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBBeG9sYWJzfVxuZXhwb3J0IGZ1bmN0aW9uIHNpUm5hTnVjbGVvdGlkZVRvQXhvbGFic0FudGlzZW5zZVN0cmFuZChudWNsZW90aWRlcykge1xuICAgIGxldCBjb3VudCA9IC0xO1xuICAgIGNvbnN0IG9iakZvclNtYWxsTGlua2FnZXMgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsXG4gICAgICAgICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsICdBJzogJ2FzJywgJ1UnOiAndXMnLCAnRyc6ICdncycsICdDJzogJ2NzJyB9O1xuICAgIGNvbnN0IG9iakZvckJpZ0xpbmthZ2VzID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLFxuICAgICAgICAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLCAnQSc6ICdBZnMnLCAnVSc6ICdVZnMnLCAnRyc6ICdHZnMnLCAnQyc6ICdDZnMnIH07XG4gICAgY29uc3Qgb2JqRm9yU29tZUluZGljZXMgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsXG4gICAgICAgICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsICdBJzogJ0FmJywgJ1UnOiAnVWYnLCAnRyc6ICdHZicsICdDJzogJ0NmJyB9O1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJyxcbiAgICAgICAgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJywgJ0EnOiAnYScsICdVJzogJ3UnLCAnRyc6ICdnJywgJ0MnOiAnYycgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8QXxVfEd8QykvZywgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgY291bnQrKztcbiAgICAgICAgaWYgKGNvdW50ID4gMTkgJiYgY291bnQgPCAyMilcbiAgICAgICAgICAgIHJldHVybiBvYmpGb3JTbWFsbExpbmthZ2VzW3hdO1xuICAgICAgICBpZiAoY291bnQgPT0gMClcbiAgICAgICAgICAgIHJldHVybiAndXMnO1xuICAgICAgICBpZiAoY291bnQgPT0gMSlcbiAgICAgICAgICAgIHJldHVybiBvYmpGb3JCaWdMaW5rYWdlc1t4XTtcbiAgICAgICAgcmV0dXJuIChjb3VudCA9PSA1IHx8IGNvdW50ID09IDcgfHwgY291bnQgPT0gOCB8fCBjb3VudCA9PSAxMyB8fCBjb3VudCA9PSAxNSkgPyBvYmpGb3JTb21lSW5kaWNlc1t4XSA6IG9ialt4XTtcbiAgICB9KTtcbn1cbi8vbmFtZTogZ2Nyc1RvTnVjbGVvdGlkZXNcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogR0NSU31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBSTkEgbnVjbGVvdGlkZXN9XG5leHBvcnQgZnVuY3Rpb24gZ2Nyc1RvTnVjbGVvdGlkZXMobnVjbGVvdGlkZXMpIHtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdtQXBzJzogJ0EnLCAnbVVwcyc6ICdVJywgJ21HcHMnOiAnRycsICdtQ3BzJzogJ0MnLCAnZkFwcyc6ICdBJywgJ2ZVcHMnOiAnVScsICdmR3BzJzogJ0cnLCAnZkNwcyc6ICdDJyxcbiAgICAgICAgJ2ZVJzogJ1UnLCAnZkEnOiAnQScsICdmQyc6ICdDJywgJ2ZHJzogJ0cnLCAnbVUnOiAnVScsICdtQSc6ICdBJywgJ21DJzogJ0MnLCAnbUcnOiAnRycsXG4gICAgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8bUFwc3xtVXBzfG1HcHN8bUNwc3xmQXBzfGZVcHN8Zkdwc3xmQ3BzfGZVfGZBfGZDfGZHfG1VfG1BfG1DfG1HKS9nLCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gb2JqW3hdOyB9KTtcbn1cbi8vbmFtZTogZ2Nyc1RvTWVybWFkZTEyXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEdDUlN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogTWVybWFkZSAxMiAvIHNpUk5BfVxuZXhwb3J0IGZ1bmN0aW9uIGdjcnNUb01lcm1hZGUxMihudWNsZW90aWRlcykge1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ21BcHMnOiAnZScsICdtVXBzJzogJ2gnLCAnbUdwcyc6ICdnJywgJ21DcHMnOiAnZicsICdmQXBzJzogJ2knLCAnZlVwcyc6ICdsJywgJ2ZHcHMnOiAnaycsICdmQ3BzJzogJ2onLCAnZlUnOiAnTCcsXG4gICAgICAgICdmQSc6ICdJJywgJ2ZDJzogJ0onLCAnZkcnOiAnSycsICdtVSc6ICdIJywgJ21BJzogJ0UnLCAnbUMnOiAnRicsICdtRyc6ICdHJyxcbiAgICB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxtQXBzfG1VcHN8bUdwc3xtQ3BzfGZBcHN8ZlVwc3xmR3BzfGZDcHN8ZlV8ZkF8ZkN8Zkd8bVV8bUF8bUN8bUcpL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuIiwiaW1wb3J0IHsgbWFwLCBzdGFkYXJkUGhvc3BoYXRlTGlua1NtaWxlcywgU1lOVEhFU0laRVJTLCBURUNITk9MT0dJRVMsIE1PRElGSUNBVElPTlMgfSBmcm9tICcuL21hcCc7XG5pbXBvcnQgeyBpc1ZhbGlkU2VxdWVuY2UgfSBmcm9tICcuL3NlcXVlbmNlLWNvZGVzLXRvb2xzJztcbmltcG9ydCB7IGdldE51Y2xlb3RpZGVzTW9sIH0gZnJvbSAnLi9tb2wtdHJhbnNmb3JtYXRpb25zJztcbmV4cG9ydCBmdW5jdGlvbiBzZXF1ZW5jZVRvTW9sVjMwMDAoc2VxdWVuY2UsIGludmVydGVkID0gZmFsc2UsIG9jbFJlbmRlciA9IGZhbHNlLCBmb3JtYXQpIHtcbiAgICBjb25zdCBvYmogPSBnZXRPYmplY3RXaXRoQ29kZXNBbmRTbWlsZXMoc2VxdWVuY2UsIGZvcm1hdCk7XG4gICAgbGV0IGNvZGVzID0gc29ydEJ5U3RyaW5nTGVuZ3RoSW5EZXNjZW5kaW5nT3JkZXIoT2JqZWN0LmtleXMob2JqKSk7XG4gICAgbGV0IGkgPSAwO1xuICAgIGNvbnN0IHNtaWxlc0NvZGVzID0gW107XG4gICAgY29uc3QgY29kZXNMaXN0ID0gW107XG4gICAgY29uc3QgbGlua3MgPSBbJ3MnLCAncHMnLCAnKiddO1xuICAgIGNvbnN0IGluY2x1ZGVzU3RhbmRhcmRMaW5rQWxyZWFkeSA9IFsnZScsICdoJywgLyonZycsKi8gJ2YnLCAnaScsICdsJywgJ2snLCAnaiddO1xuICAgIGNvbnN0IGRyb3Bkb3ducyA9IE9iamVjdC5rZXlzKE1PRElGSUNBVElPTlMpO1xuICAgIGNvZGVzID0gY29kZXMuY29uY2F0KGRyb3Bkb3ducyk7XG4gICAgd2hpbGUgKGkgPCBzZXF1ZW5jZS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY29kZSA9IGNvZGVzLmZpbmQoKHMpID0+IHMgPT0gc2VxdWVuY2Uuc2xpY2UoaSwgaSArIHMubGVuZ3RoKSk7XG4gICAgICAgIGkgKz0gY29kZS5sZW5ndGg7XG4gICAgICAgIGludmVydGVkID8gY29kZXNMaXN0LnVuc2hpZnQoY29kZSkgOiBjb2Rlc0xpc3QucHVzaChjb2RlKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2Rlc0xpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGRyb3Bkb3ducy5pbmNsdWRlcyhjb2Rlc0xpc3RbaV0pKSB7XG4gICAgICAgICAgICBzbWlsZXNDb2Rlcy5wdXNoKChpID49IGNvZGVzTGlzdC5sZW5ndGggLyAyKSA/XG4gICAgICAgICAgICAgICAgTU9ESUZJQ0FUSU9OU1tjb2Rlc0xpc3RbaV1dLnJpZ2h0IDogTU9ESUZJQ0FUSU9OU1tjb2Rlc0xpc3RbaV1dLmxlZnQpO1xuICAgICAgICAgICAgc21pbGVzQ29kZXMucHVzaChzdGFkYXJkUGhvc3BoYXRlTGlua1NtaWxlcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAobGlua3MuaW5jbHVkZXMoY29kZXNMaXN0W2ldKSB8fFxuICAgICAgICAgICAgICAgIGluY2x1ZGVzU3RhbmRhcmRMaW5rQWxyZWFkeS5pbmNsdWRlcyhjb2Rlc0xpc3RbaV0pIHx8XG4gICAgICAgICAgICAgICAgKGkgPCBjb2Rlc0xpc3QubGVuZ3RoIC0gMSAmJiBsaW5rcy5pbmNsdWRlcyhjb2Rlc0xpc3RbaSArIDFdKSkpXG4gICAgICAgICAgICAgICAgc21pbGVzQ29kZXMucHVzaChvYmpbY29kZXNMaXN0W2ldXSk7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzbWlsZXNDb2Rlcy5wdXNoKG9ialtjb2Rlc0xpc3RbaV1dKTtcbiAgICAgICAgICAgICAgICBzbWlsZXNDb2Rlcy5wdXNoKHN0YWRhcmRQaG9zcGhhdGVMaW5rU21pbGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2V0TnVjbGVvdGlkZXNNb2woc21pbGVzQ29kZXMsIG9jbFJlbmRlcik7XG59XG5leHBvcnQgZnVuY3Rpb24gc2VxdWVuY2VUb1NtaWxlcyhzZXF1ZW5jZSwgaW52ZXJ0ZWQgPSBmYWxzZSwgZm9ybWF0KSB7XG4gICAgY29uc3Qgb2JqID0gZ2V0T2JqZWN0V2l0aENvZGVzQW5kU21pbGVzKHNlcXVlbmNlLCBmb3JtYXQpO1xuICAgIGxldCBjb2RlcyA9IHNvcnRCeVN0cmluZ0xlbmd0aEluRGVzY2VuZGluZ09yZGVyKE9iamVjdC5rZXlzKG9iaikpO1xuICAgIGxldCBpID0gMDtcbiAgICBsZXQgc21pbGVzID0gJyc7XG4gICAgY29uc3QgY29kZXNMaXN0ID0gW107XG4gICAgY29uc3QgbGlua3MgPSBbJ3MnLCAncHMnLCAnKiddO1xuICAgIGNvbnN0IGluY2x1ZGVzU3RhbmRhcmRMaW5rQWxyZWFkeSA9IFsnZScsICdoJywgLyonZycsKi8gJ2YnLCAnaScsICdsJywgJ2snLCAnaiddO1xuICAgIGNvbnN0IGRyb3Bkb3ducyA9IE9iamVjdC5rZXlzKE1PRElGSUNBVElPTlMpO1xuICAgIGNvZGVzID0gY29kZXMuY29uY2F0KGRyb3Bkb3ducyk7XG4gICAgd2hpbGUgKGkgPCBzZXF1ZW5jZS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY29kZSA9IGNvZGVzLmZpbmQoKHMpID0+IHMgPT0gc2VxdWVuY2Uuc2xpY2UoaSwgaSArIHMubGVuZ3RoKSk7XG4gICAgICAgIGkgKz0gY29kZS5sZW5ndGg7XG4gICAgICAgIGludmVydGVkID8gY29kZXNMaXN0LnVuc2hpZnQoY29kZSkgOiBjb2Rlc0xpc3QucHVzaChjb2RlKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2Rlc0xpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGRyb3Bkb3ducy5pbmNsdWRlcyhjb2Rlc0xpc3RbaV0pKSB7XG4gICAgICAgICAgICBzbWlsZXMgKz0gKGkgPj0gY29kZXNMaXN0Lmxlbmd0aCAvIDIpID9cbiAgICAgICAgICAgICAgICBNT0RJRklDQVRJT05TW2NvZGVzTGlzdFtpXV0ucmlnaHQgKyBzdGFkYXJkUGhvc3BoYXRlTGlua1NtaWxlcyA6XG4gICAgICAgICAgICAgICAgTU9ESUZJQ0FUSU9OU1tjb2Rlc0xpc3RbaV1dLmxlZnQgKyBzdGFkYXJkUGhvc3BoYXRlTGlua1NtaWxlcztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChsaW5rcy5pbmNsdWRlcyhjb2Rlc0xpc3RbaV0pIHx8XG4gICAgICAgICAgICAgICAgaW5jbHVkZXNTdGFuZGFyZExpbmtBbHJlYWR5LmluY2x1ZGVzKGNvZGVzTGlzdFtpXSkgfHxcbiAgICAgICAgICAgICAgICAoaSA8IGNvZGVzTGlzdC5sZW5ndGggLSAxICYmIGxpbmtzLmluY2x1ZGVzKGNvZGVzTGlzdFtpICsgMV0pKSlcbiAgICAgICAgICAgICAgICBzbWlsZXMgKz0gb2JqW2NvZGVzTGlzdFtpXV07XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgc21pbGVzICs9IG9ialtjb2Rlc0xpc3RbaV1dICsgc3RhZGFyZFBob3NwaGF0ZUxpbmtTbWlsZXM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc21pbGVzID0gc21pbGVzLnJlcGxhY2UoL09PL2csICdPJyk7XG4gICAgcmV0dXJuICgobGlua3MuaW5jbHVkZXMoY29kZXNMaXN0W2NvZGVzTGlzdC5sZW5ndGggLSAxXSkgJiZcbiAgICAgICAgY29kZXNMaXN0Lmxlbmd0aCA+IDEgJiZcbiAgICAgICAgIWluY2x1ZGVzU3RhbmRhcmRMaW5rQWxyZWFkeS5pbmNsdWRlcyhjb2Rlc0xpc3RbY29kZXNMaXN0Lmxlbmd0aCAtIDJdKSkgfHxcbiAgICAgICAgZHJvcGRvd25zLmluY2x1ZGVzKGNvZGVzTGlzdFtjb2Rlc0xpc3QubGVuZ3RoIC0gMV0pIHx8XG4gICAgICAgIGluY2x1ZGVzU3RhbmRhcmRMaW5rQWxyZWFkeS5pbmNsdWRlcyhjb2Rlc0xpc3RbY29kZXNMaXN0Lmxlbmd0aCAtIDFdKSkgP1xuICAgICAgICBzbWlsZXMgOlxuICAgICAgICBzbWlsZXMuc2xpY2UoMCwgc21pbGVzLmxlbmd0aCAtIHN0YWRhcmRQaG9zcGhhdGVMaW5rU21pbGVzLmxlbmd0aCArIDEpO1xufVxuZnVuY3Rpb24gZ2V0T2JqZWN0V2l0aENvZGVzQW5kU21pbGVzKHNlcXVlbmNlLCBmb3JtYXQpIHtcbiAgICBjb25zdCBvYmogPSB7fTtcbiAgICBpZiAoZm9ybWF0ID09IG51bGwpIHtcbiAgICAgICAgZm9yIChjb25zdCBzeW50aGVzaXplciBvZiBPYmplY3Qua2V5cyhtYXApKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRlY2hub2xvZ3kgb2YgT2JqZWN0LmtleXMobWFwW3N5bnRoZXNpemVyXSkpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNvZGUgb2YgT2JqZWN0LmtleXMobWFwW3N5bnRoZXNpemVyXVt0ZWNobm9sb2d5XSkpXG4gICAgICAgICAgICAgICAgICAgIG9ialtjb2RlXSA9IG1hcFtzeW50aGVzaXplcl1bdGVjaG5vbG9neV1bY29kZV0uU01JTEVTO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBmb3IgKGNvbnN0IHRlY2hub2xvZ3kgb2YgT2JqZWN0LmtleXMobWFwW2Zvcm1hdF0pKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvZGUgb2YgT2JqZWN0LmtleXMobWFwW2Zvcm1hdF1bdGVjaG5vbG9neV0pKVxuICAgICAgICAgICAgICAgIG9ialtjb2RlXSA9IG1hcFtmb3JtYXRdW3RlY2hub2xvZ3ldW2NvZGVdLlNNSUxFUztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUT0RPOiBjcmVhdGUgb2JqZWN0IGJhc2VkIGZyb20gc3ludGhlc2l6ZXIgdHlwZSB0byBhdm9pZCBrZXkoY29kZXMpIGR1cGxpY2F0ZXNcbiAgICBjb25zdCBvdXRwdXQgPSBpc1ZhbGlkU2VxdWVuY2Uoc2VxdWVuY2UsIGZvcm1hdCk7XG4gICAgaWYgKG91dHB1dC5zeW50aGVzaXplci5pbmNsdWRlcyhTWU5USEVTSVpFUlMuTUVSTUFERV8xMikpXG4gICAgICAgIG9ialsnZyddID0gbWFwW1NZTlRIRVNJWkVSUy5NRVJNQURFXzEyXVtURUNITk9MT0dJRVMuU0lfUk5BXVsnZyddLlNNSUxFUztcbiAgICBlbHNlIGlmIChvdXRwdXQuc3ludGhlc2l6ZXIuaW5jbHVkZXMoU1lOVEhFU0laRVJTLkFYT0xBQlMpKVxuICAgICAgICBvYmpbJ2cnXSA9IG1hcFtTWU5USEVTSVpFUlMuQVhPTEFCU11bVEVDSE5PTE9HSUVTLlNJX1JOQV1bJ2cnXS5TTUlMRVM7XG4gICAgcmV0dXJuIG9iajtcbn1cbmZ1bmN0aW9uIHNvcnRCeVN0cmluZ0xlbmd0aEluRGVzY2VuZGluZ09yZGVyKGFycmF5KSB7XG4gICAgcmV0dXJuIGFycmF5LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGIubGVuZ3RoIC0gYS5sZW5ndGg7IH0pO1xufVxuIiwiZXhwb3J0IGNvbnN0IFNZTlRIRVNJWkVSUyA9IHtcbiAgICBSQVdfTlVDTEVPVElERVM6ICdSYXcgTnVjbGVvdGlkZXMnLFxuICAgIEJJT1NQUklORzogJ0Jpb1NwcmluZyBDb2RlcycsXG4gICAgR0NSUzogJ0phbnNzZW4gR0NSUyBDb2RlcycsXG4gICAgQVhPTEFCUzogJ0F4b2xhYnMgQ29kZXMnLFxuICAgIE1FUk1BREVfMTI6ICdNZXJtYWRlIDEyJyxcbn07XG5leHBvcnQgY29uc3QgVEVDSE5PTE9HSUVTID0ge1xuICAgIEROQTogJ0ROQScsXG4gICAgUk5BOiAnUk5BJyxcbiAgICBBU09fR0FQTUVSUzogJ0ZvciBBU08gR2FwbWVycycsXG4gICAgU0lfUk5BOiAnRm9yIDJcXCctT01lIGFuZCAyXFwnLUYgbW9kaWZpZWQgc2lSTkEnLFxufTtcbmV4cG9ydCBjb25zdCBDT0xfTkFNRVMgPSB7XG4gICAgQ0hFTUlTVFJZOiAnQ2hlbWlzdHJ5JyxcbiAgICBOVU1CRVI6ICdOdW1iZXInLFxuICAgIFRZUEU6ICdUeXBlJyxcbiAgICBDSEVNSVNUUllfTkFNRTogJ0NoZW1pc3RyeSBOYW1lJyxcbiAgICBJTlRFUk5BTF9DT01QT1VORF9JRDogJ0ludGVybmFsIGNvbXBvdW5kIElEJyxcbiAgICBJRFA6ICdJRFAnLFxuICAgIFNFUVVFTkNFOiAnU2VxdWVuY2UnLFxuICAgIENPTVBPVU5EX05BTUU6ICdDb21wb3VuZCBOYW1lJyxcbiAgICBDT01QT1VORF9DT01NRU5UUzogJ0NvbXBvdW5kIENvbW1lbnRzJyxcbiAgICBTQUxUOiAnU2FsdCcsXG4gICAgRVFVSVZBTEVOVFM6ICdFcXVpdmFsZW50cycsXG4gICAgUFVSSVRZOiAnUHVyaXR5JyxcbiAgICBDUERfTVc6ICdDcGQgTVcnLFxuICAgIFNBTFRfTUFTUzogJ1NhbHQgbWFzcycsXG4gICAgQkFUQ0hfTVc6ICdCYXRjaCBNVycsXG4gICAgU09VUkNFOiAnU291cmNlJyxcbiAgICBJQ0Q6ICdJQ0QnLFxuICAgIE9XTkVSOiAnT3duZXInLFxufTtcbi8vIGludGVyZmFjZSBDT0RFUyB7XG4vLyB9XG5leHBvcnQgY29uc3QgTU9ESUZJQ0FUSU9OUyA9IHtcbiAgICAnKGludmFiYXNpYyknOiB7XG4gICAgICAgIG1vbGVjdWxhcldlaWdodDogMTE4LjEzLFxuICAgICAgICBsZWZ0OiAnT1tDQEBIXTFDW0NAQEhdT1tDQEhdMUNPJyxcbiAgICAgICAgcmlnaHQ6ICdPW0NAQEhdMUNbQ0BASF1PW0NASF0xQ08nLFxuICAgIH0sXG4gICAgJyhHYWxOQWMtMi1KTkopJzoge1xuICAgICAgICBtb2xlY3VsYXJXZWlnaHQ6IDEyNzMuMyxcbiAgICAgICAgbGVmdDogJ0MoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQyknICtcbiAgICAgICAgICAgICcoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQyknICtcbiAgICAgICAgICAgICcoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQylOQyg9TylDQ0NDKD1PKU5DQyhPKUNPJyxcbiAgICAgICAgcmlnaHQ6ICdPQ0MoTylDTkMoPU8pQ0NDQyg9TylOQyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKScgK1xuICAgICAgICAgICAgJyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKScgK1xuICAgICAgICAgICAgJyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKScsXG4gICAgfSxcbn07XG5leHBvcnQgY29uc3Qgc3RhZGFyZFBob3NwaGF0ZUxpbmtTbWlsZXMgPSAnT1AoPU8pKE8pTyc7XG5leHBvcnQgY29uc3QgbWFwID0ge1xuICAgICdSYXcgTnVjbGVvdGlkZXMnOiB7XG4gICAgICAgICdETkEnOiB7XG4gICAgICAgICAgICAnQSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdBZGVuaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzEzLjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdUJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ1R5cm9zaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzA0LjIsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZFQnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyg9TylOQzIoPU8pKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0cnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnR3VhbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyOS4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnQyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdDeXRvc2luZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDI4OS4xOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgICdSTkEnOiB7XG4gICAgICAgICAgICAnQSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdBZGVuaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzEzLjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdVJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ1VyYWNpbCcsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNi4xNyxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyVScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oTylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0cnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnR3VhbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyOS4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnQyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdDeXRvc2luZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDI4OS4xOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICAnQmlvU3ByaW5nIENvZGVzJzoge1xuICAgICAgICAnRm9yIEFTTyBHYXBtZXJzJzoge1xuICAgICAgICAgICAgJzUnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ01PRS01TWUtclUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNzguMjcsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyg9TylOQzIoPU8pKVtDQEhdKE9DQ09DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnNic6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnTU9FLXJBJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzg3LjI5LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQ0NPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzcnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ01PRS01TWUtckMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNzcuMjksXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyhOKT1OQzIoPU8pKVtDQEhdKE9DQ09DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnOCc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnTU9FLXJHJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogNDAzLjI4LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQ0NPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzknOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnNS1NZXRoeWwtZEMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDMuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyhOKT1OQzIoPU8pKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyonOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAncHMgbGlua2FnZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDE2LjA3LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPUCg9TykoUylPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnQSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdBZGVuaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzEzLjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdDJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ0N5dG9zaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMjg5LjE4LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdHJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ0d1YW5pbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMjkuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ1QnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnVHlyb3NpbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDQuMixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkVCcsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUMoQylDKD1PKU5DMig9TykpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgICdGb3IgMlxcJy1PTWUgYW5kIDJcXCctRiBtb2RpZmllZCBzaVJOQSc6IHtcbiAgICAgICAgICAgICcxJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLVUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDguMTYsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcyJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUEnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMzEuMixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzMnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNy4xOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzQnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tRycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0Ny4xOSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzUnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yVScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyMC4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzYnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0My4yNCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICc3Jzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtckMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMTkuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnOCc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJHJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzU5LjI0LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyonOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAncHMgbGlua2FnZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDE2LjA3LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPUCg9TykoUylPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICAnQXhvbGFicyBDb2Rlcyc6IHtcbiAgICAgICAgJ0ZvciAyXFwnLU9NZSBhbmQgMlxcJy1GIG1vZGlmaWVkIHNpUk5BJzoge1xuICAgICAgICAgICAgJ1VmJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLVUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDguMTYsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdBZic6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnLWZsdW9yby1BJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzMxLjIsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckEnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdDZic6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnLWZsdW9yby1DJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzA3LjE4LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnR2YnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tRycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0Ny4xOSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ3UnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yVScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyMC4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2EnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0My4yNCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdjJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtckMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMTkuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJHJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzU5LixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdzJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ3BzIGxpbmthZ2UnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAxNi4wNyxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT1AoPU8pKFMpTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgJ0phbnNzZW4gR0NSUyBDb2Rlcyc6IHtcbiAgICAgICAgJ0ZvciBBU08gR2FwbWVycyc6IHtcbiAgICAgICAgICAgICdtb2VUJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdNT0UtNU1lLXJVJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzc4LjI3LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9QyhDKUMoPU8pTkMyKD1PKSlbQ0BIXShPQ0NPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ21vZUEnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ01PRS1yQScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM4Ny4yOSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0NDT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdtb2U1bUMnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ01PRS01TWUtckMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNzcuMjksXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyhOKT1OQzIoPU8pKVtDQEhdKE9DQ09DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnKDVtKW1vZUMnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ01PRS01TWUtckMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNzcuMjksXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyhOKT1OQzIoPU8pKVtDQEhdKE9DQ09DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnbW9lRyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnTU9FLXJHJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogNDAzLjI4LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQ0NPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzVtQyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICc1LU1ldGh5bC1kQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwMy4yOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUMoQylDKE4pPU5DMig9TykpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnKDVtKUMnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnNS1NZXRoeWwtZEMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDMuMjgsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyhOKT1OQzIoPU8pKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ3BzJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ3BzIGxpbmthZ2UnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAxNi4wNyxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT1AoPU8pKFMpTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0EnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnQWRlbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMxMy4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZEEnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnQWRlbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMxMy4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnQyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdDeXRvc2luZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDI4OS4xOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZEMnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnQ3l0b3NpbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAyODkuMTgsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0cnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnR3VhbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyOS4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZEcnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnR3VhbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyOS4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnVCc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdUeXJvc2luZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNC4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RUJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9QyhDKUMoPU8pTkMyKD1PKSlDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdkVCc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdUeXJvc2luZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNC4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RUJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9QyhDKUMoPU8pTkMyKD1PKSlDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdyQSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdBZGVuaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzI5LjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnckMnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnQ3l0b3NpbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDUuMTgsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE8pW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdyRyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdHdWFuaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzQ1LjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnclUnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnVXJhY2lsJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzA2LjE3LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgICdGb3IgMlxcJy1PTWUgYW5kIDJcXCctRiBtb2RpZmllZCBzaVJOQSc6IHtcbiAgICAgICAgICAgICdmVSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnLWZsdW9yby1VJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzA4LjE2LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZkEnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tQScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMzMS4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShGKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZkMnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNy4xOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2ZHJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUcnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNDcuMTksXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdtVSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJVJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzIwLjIsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnbUEnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0My4yNCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdtQyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJDJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzE5LjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ21HJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtckcnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNTkuMjQsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICAnTWVybWFkZSAxMic6IHtcbiAgICAgICAgJ0ZvciAyXFwnLU9NZSBhbmQgMlxcJy1GIG1vZGlmaWVkIHNpUk5BJzoge1xuICAgICAgICAgICAgJ2UnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQS1wcycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM1OS4zMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdoJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtclUtcHMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMzYuMjcsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoUylPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJHLXBzJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzc1LjMxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKFMpTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2YnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQy1wcycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMzNS4yOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdpJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUEtcHMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNDcuMjcsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckEnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdsJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLVUtcHMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMjQuMjMsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdrJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUctcHMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNjMuMjYsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdqJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUMtcHMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMjMuMjUsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdMJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLVUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDguMTYsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdJJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUEnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMzEuMixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0onOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNy4xOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0snOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tRycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0Ny4xOSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0gnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yVScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyMC4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0UnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0My4yNCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdGJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtckMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMTkuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnRyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJHJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzU5LjI0LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuIiwiaW1wb3J0ICogYXMgT0NMIGZyb20gJ29wZW5jaGVtbGliL2Z1bGwuanMnO1xuY29uc3QgUEhPU0hBVEUgPSBgXG5EYXRhZ3JvayBtb25vbWVyIGxpYnJhcnkgTnVjbGVvdGlkZXNcblxuICAwICAwICAwICAwICAwICAwICAgICAgICAgICAgICAwIFYzMDAwXG5NICBWMzAgQkVHSU4gQ1RBQlxuTSAgVjMwIENPVU5UUyA1IDQgMCAwIDBcbk0gIFYzMCBCRUdJTiBBVE9NXG5NICBWMzAgMSBPIC0xLjUgMCAwIDBcbk0gIFYzMCAyIFAgMCAwIDAgMFxuTSAgVjMwIDMgTyAwIDEgMCAwXG5NICBWMzAgNCBPIDAgLTEgMCAwXG5NICBWMzAgNSBPIDEuNSAwIDAgMFxuTSAgVjMwIEVORCBBVE9NXG5NICBWMzAgQkVHSU4gQk9ORFxuTSAgVjMwIDEgMSAxIDJcbk0gIFYzMCAyIDIgMiAzXG5NICBWMzAgMyAxIDIgNFxuTSAgVjMwIDQgMSAyIDVcbk0gIFYzMCBFTkQgQk9ORFxuTSAgVjMwIEVORCBDVEFCXG5NICBWMzAgQkVHSU4gQ09MTEVDVElPTlxuTSAgVjMwIEVORCBDT0xMRUNUSU9OXG5NICBFTkRgO1xuY29uc3QgVEhJT1BIT1NIQVRFID0gYFxuRGF0YWdyb2sgbW9ub21lciBsaWJyYXJ5IE51Y2xlb3RpZGVzXG5cbiAgMCAgMCAgMCAgMCAgMCAgMCAgICAgICAgICAgICAgMCBWMzAwMFxuTSAgVjMwIEJFR0lOIENUQUJcbk0gIFYzMCBDT1VOVFMgNSA0IDAgMCAwXG5NICBWMzAgQkVHSU4gQVRPTVxuTSAgVjMwIDEgTyAtMS41IDAgMCAwXG5NICBWMzAgMiBQIDAgMCAwIDBcbk0gIFYzMCAzIE8gMCAxIDAgMFxuTSAgVjMwIDQgUyAwIC0xIDAgMFxuTSAgVjMwIDUgTyAxLjUgMCAwIDBcbk0gIFYzMCBFTkQgQVRPTVxuTSAgVjMwIEJFR0lOIEJPTkRcbk0gIFYzMCAxIDEgMSAyXG5NICBWMzAgMiAyIDIgM1xuTSAgVjMwIDMgMSAyIDRcbk0gIFYzMCA0IDEgMiA1XG5NICBWMzAgRU5EIEJPTkRcbk0gIFYzMCBFTkQgQ1RBQlxuTSAgVjMwIEJFR0lOIENPTExFQ1RJT05cbk0gIFYzMCBFTkQgQ09MTEVDVElPTlxuTSAgRU5EYDtcbmNvbnN0IElOVkFCQVNJQyA9IGBcbkRhdGFncm9rIG1vbm9tZXIgbGlicmFyeSBOdWNsZW90aWRlc1xuXG4gIDAgIDAgIDAgIDAgIDAgIDAgICAgICAgICAgICAgIDAgVjMwMDBcbk0gIFYzMCBCRUdJTiBDVEFCXG5NICBWMzAgQ09VTlRTIDggOCAwIDAgMFxuTSAgVjMwIEJFR0lOIEFUT01cbk0gIFYzMCAxIE8gMS4wOTM0IC0yLjE2MzYgMCAwXG5NICBWMzAgMiBDIDEuODM2NSAtMS40OTQ1IDAgMCBDRkc9MlxuTSAgVjMwIDMgQyAyLjgxNDcgLTEuNzAyNCAwIDBcbk0gIFYzMCA0IEMgMy4zMTQ3IC0wLjgzNjQgMCAwIFZBTD0zXG5NICBWMzAgNSBPIDIuNjQ1NSAtMC4wOTMyIDAgMFxuTSAgVjMwIDYgQyAxLjczMiAtMC41IDAgMCBDRkc9MVxuTSAgVjMwIDcgQyAwLjg2NiAwIDAgMFxuTSAgVjMwIDggTyAwLjg2NiAxIDAgMFxuTSAgVjMwIEVORCBBVE9NXG5NICBWMzAgQkVHSU4gQk9ORFxuTSAgVjMwIDEgMSAyIDEgQ0ZHPTFcbk0gIFYzMCAyIDEgMiAzXG5NICBWMzAgMyAxIDMgNFxuTSAgVjMwIDQgMSA0IDVcbk0gIFYzMCA1IDEgNiA1XG5NICBWMzAgNiAxIDIgNlxuTSAgVjMwIDcgMSA2IDcgQ0ZHPTNcbk0gIFYzMCA4IDEgNyA4XG5NICBWMzAgRU5EIEJPTkRcbk0gIFYzMCBCRUdJTiBDT0xMRUNUSU9OXG5NICBWMzAgTURMVjMwL1NURUFCUyBBVE9NUz0oMiAyIDYpXG5NICBWMzAgRU5EIENPTExFQ1RJT05cbk0gIFYzMCBFTkQgQ1RBQlxuTSAgRU5EYDtcbmV4cG9ydCBmdW5jdGlvbiBnZXROdWNsZW90aWRlc01vbChzbWlsZXNDb2Rlcywgb2NsUmVuZGVyID0gZmFsc2UpIHtcbiAgICBjb25zdCBtb2xCbG9ja3MgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNtaWxlc0NvZGVzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBzbWlsZXNDb2Rlc1tpXSA9PSAnT1AoPU8pKE8pTycgPyBtb2xCbG9ja3MucHVzaChQSE9TSEFURSkgOlxuICAgICAgICAgICAgc21pbGVzQ29kZXNbaV0gPT0gJ09QKD1PKShTKU8nID8gbW9sQmxvY2tzLnB1c2goVEhJT1BIT1NIQVRFKSA6XG4gICAgICAgICAgICAgICAgc21pbGVzQ29kZXNbaV0gPT0gJ09bQ0BASF0xQ1tDQEBIXU9bQ0BIXTFDTycgPyBtb2xCbG9ja3MucHVzaChyb3RhdGVOdWNsZW90aWRlc1YzMDAwKElOVkFCQVNJQykpIDpcbiAgICAgICAgICAgICAgICAgICAgbW9sQmxvY2tzLnB1c2gocm90YXRlTnVjbGVvdGlkZXNWMzAwMChzbWlsZXNDb2Rlc1tpXSkpO1xuICAgIH1cbiAgICByZXR1cm4gbGlua1YzMDAwKG1vbEJsb2NrcywgZmFsc2UsIG9jbFJlbmRlcik7XG59XG5leHBvcnQgZnVuY3Rpb24gbGlua1YzMDAwKG1vbEJsb2NrcywgdHdvTW9sZWN1bGVzID0gZmFsc2UsIG9jbFJlbmRlciA9IGZhbHNlKSB7XG4gICAgbGV0IG1hY3JvTW9sQmxvY2sgPSAnXFxuRGF0YWdyb2sgbWFjcm9tb2xlY3VsZSBoYW5kbGVyXFxuXFxuJztcbiAgICBtYWNyb01vbEJsb2NrICs9ICcgIDAgIDAgIDAgIDAgIDAgIDAgICAgICAgICAgICA5OTkgVjMwMDBcXG4nO1xuICAgIG1hY3JvTW9sQmxvY2sgKz0gJ00gIFYzMCBCRUdJTiBDVEFCXFxuJztcbiAgICBsZXQgYXRvbUJsb2NrID0gJyc7XG4gICAgbGV0IGJvbmRCbG9jayA9ICcnO1xuICAgIGxldCBjb2xsZWN0aW9uQmxvY2sgPSAnJztcbiAgICBjb25zdCBjb2xsZWN0aW9uID0gW107XG4gICAgbGV0IG5hdG9tID0gMDtcbiAgICBsZXQgbmJvbmQgPSAwO1xuICAgIGxldCBzZXF1ZW5jZVNoaWZ0ID0gMDtcbiAgICBsZXQgeFNoaWZ0ID0gMDtcbiAgICBpZiAodHdvTW9sZWN1bGVzICYmIG1vbEJsb2Nrcy5sZW5ndGggPiAxKVxuICAgICAgICBtb2xCbG9ja3NbMV0gPSBpbnZlcnROdWNsZW90aWRlc1YzMDAwKG1vbEJsb2Nrc1sxXSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtb2xCbG9ja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbW9sQmxvY2tzW2ldID0gbW9sQmxvY2tzW2ldLnJlcGxhY2VBbGwoJygtXFxuTSAgVjMwICcsICcoJylcbiAgICAgICAgICAgIC5yZXBsYWNlQWxsKCctXFxuTSAgVjMwICcsICcnKS5yZXBsYWNlQWxsKCcgKScsICcpJyk7XG4gICAgICAgIGNvbnN0IG51bWJlcnMgPSBleHRyYWN0QXRvbXNCb25kc051bWJlcnNWMzAwMChtb2xCbG9ja3NbaV0pO1xuICAgICAgICBjb25zdCBjb29yZGluYXRlcyA9IGV4dHJhY3RBdG9tRGF0YVYzMDAwKG1vbEJsb2Nrc1tpXSk7XG4gICAgICAgIGxldCBpbmRleEF0b21zID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ00gIFYzMCBCRUdJTiBBVE9NJyk7IC8vIFYzMDAwIGluZGV4IGZvciBhdG9tcyBjb29yZGluYXRlc1xuICAgICAgICBpbmRleEF0b21zID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ1xcbicsIGluZGV4QXRvbXMpO1xuICAgICAgICBsZXQgaW5kZXggPSBpbmRleEF0b21zO1xuICAgICAgICBsZXQgaW5kZXhFbmQgPSBpbmRleEF0b21zO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG51bWJlcnMubmF0b207IGorKykge1xuICAgICAgICAgICAgaWYgKGNvb3JkaW5hdGVzLmF0b21JbmRleFtqXSAhPSAxIHx8IGkgPT0gMCB8fCB0d29Nb2xlY3VsZXMpIHtcbiAgICAgICAgICAgICAgICAvL3Jld3JpdGUgYXRvbSBudW1iZXJcbiAgICAgICAgICAgICAgICBpbmRleCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdWMzAnLCBpbmRleCkgKyA0O1xuICAgICAgICAgICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYXRvbU51bWJlciA9IHBhcnNlSW50KG1vbEJsb2Nrc1tpXS5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSkgKyBuYXRvbTtcbiAgICAgICAgICAgICAgICBtb2xCbG9ja3NbaV0gPSBtb2xCbG9ja3NbaV0uc2xpY2UoMCwgaW5kZXgpICsgYXRvbU51bWJlciArIG1vbEJsb2Nrc1tpXS5zbGljZShpbmRleEVuZCk7XG4gICAgICAgICAgICAgICAgLy9yZXdyaXRlIGNvb3JkaW5hdGVzXG4gICAgICAgICAgICAgICAgaW5kZXggPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KSArIDE7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KSArIDE7XG4gICAgICAgICAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b3RhbFNoaWZ0ID0geFNoaWZ0IC0gY29vcmRpbmF0ZXMueFswXTtcbiAgICAgICAgICAgICAgICBsZXQgY29vcmRpbmF0ZSA9IE1hdGgucm91bmQoMTAwMDAgKiAocGFyc2VGbG9hdChtb2xCbG9ja3NbaV0uc3Vic3RyaW5nKGluZGV4LCBpbmRleEVuZCkpICsgdG90YWxTaGlmdCkpIC8gMTAwMDA7XG4gICAgICAgICAgICAgICAgbW9sQmxvY2tzW2ldID0gbW9sQmxvY2tzW2ldLnNsaWNlKDAsIGluZGV4KSArIGNvb3JkaW5hdGUgKyBtb2xCbG9ja3NbaV0uc2xpY2UoaW5kZXhFbmQpO1xuICAgICAgICAgICAgICAgIGluZGV4ID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCkgKyAxO1xuICAgICAgICAgICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgY29vcmRpbmF0ZSA9IE1hdGgucm91bmQoMTAwMDAgKiAocGFyc2VGbG9hdChtb2xCbG9ja3NbaV0uc3Vic3RyaW5nKGluZGV4LCBpbmRleEVuZCkpICsgc2VxdWVuY2VTaGlmdCkpIC8gMTAwMDA7XG4gICAgICAgICAgICAgICAgbW9sQmxvY2tzW2ldID0gbW9sQmxvY2tzW2ldLnNsaWNlKDAsIGluZGV4KSArIGNvb3JkaW5hdGUgKyBtb2xCbG9ja3NbaV0uc2xpY2UoaW5kZXhFbmQpO1xuICAgICAgICAgICAgICAgIGluZGV4ID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ1xcbicsIGluZGV4KSArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdNICBWMzAnLCBpbmRleCkgLSAxO1xuICAgICAgICAgICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ1xcbicsIGluZGV4ICsgMSk7XG4gICAgICAgICAgICAgICAgbW9sQmxvY2tzW2ldID0gbW9sQmxvY2tzW2ldLnNsaWNlKDAsIGluZGV4KSArIG1vbEJsb2Nrc1tpXS5zbGljZShpbmRleEVuZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5kZXhBdG9tc0VuZCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdNICBWMzAgRU5EIEFUT00nKTtcbiAgICAgICAgYXRvbUJsb2NrICs9IG1vbEJsb2Nrc1tpXS5zdWJzdHJpbmcoaW5kZXhBdG9tcyArIDEsIGluZGV4QXRvbXNFbmQpO1xuICAgICAgICBsZXQgaW5kZXhCb25kcyA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdNICBWMzAgQkVHSU4gQk9ORCcpOyAvLyBWMzAwMCBpbmRleCBmb3IgYm9uZHNcbiAgICAgICAgaW5kZXhCb25kcyA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdcXG4nLCBpbmRleEJvbmRzKTtcbiAgICAgICAgaW5kZXggPSBpbmRleEJvbmRzO1xuICAgICAgICBpbmRleEVuZCA9IGluZGV4Qm9uZHM7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbnVtYmVycy5uYm9uZDsgaisrKSB7XG4gICAgICAgICAgICAvL3Jld3JpdGUgYm9uZCBudW1iZXJcbiAgICAgICAgICAgIGluZGV4ID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ1YzMCcsIGluZGV4KSArIDQ7XG4gICAgICAgICAgICBpbmRleEVuZCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCcgJywgaW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgYm9uZE51bWJlciA9IHBhcnNlSW50KG1vbEJsb2Nrc1tpXS5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSkgKyBuYm9uZDtcbiAgICAgICAgICAgIG1vbEJsb2Nrc1tpXSA9IG1vbEJsb2Nrc1tpXS5zbGljZSgwLCBpbmRleCkgKyBib25kTnVtYmVyICsgbW9sQmxvY2tzW2ldLnNsaWNlKGluZGV4RW5kKTtcbiAgICAgICAgICAgIC8vcmV3cml0ZSBhdG9tIHBhaXIgaW4gYm9uZFxuICAgICAgICAgICAgaW5kZXggPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KSArIDE7XG4gICAgICAgICAgICBpbmRleCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCk7XG4gICAgICAgICAgICBsZXQgYXRvbU51bWJlciA9IHBhcnNlSW50KG1vbEJsb2Nrc1tpXS5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSkgKyBuYXRvbTtcbiAgICAgICAgICAgIG1vbEJsb2Nrc1tpXSA9IG1vbEJsb2Nrc1tpXS5zbGljZSgwLCBpbmRleCkgKyBhdG9tTnVtYmVyICsgbW9sQmxvY2tzW2ldLnNsaWNlKGluZGV4RW5kKTtcbiAgICAgICAgICAgIGluZGV4ID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCkgKyAxO1xuICAgICAgICAgICAgaW5kZXhFbmQgPSBNYXRoLm1pbihtb2xCbG9ja3NbaV0uaW5kZXhPZignXFxuJywgaW5kZXgpLCBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KSk7XG4gICAgICAgICAgICBhdG9tTnVtYmVyID0gcGFyc2VJbnQobW9sQmxvY2tzW2ldLnN1YnN0cmluZyhpbmRleCwgaW5kZXhFbmQpKSArIG5hdG9tO1xuICAgICAgICAgICAgbW9sQmxvY2tzW2ldID0gbW9sQmxvY2tzW2ldLnNsaWNlKDAsIGluZGV4KSArIGF0b21OdW1iZXIgKyBtb2xCbG9ja3NbaV0uc2xpY2UoaW5kZXhFbmQpO1xuICAgICAgICAgICAgaW5kZXggPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignXFxuJywgaW5kZXgpICsgMTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmRleEJvbmRFbmQgPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignTSAgVjMwIEVORCBCT05EJyk7XG4gICAgICAgIGJvbmRCbG9jayArPSBtb2xCbG9ja3NbaV0uc3Vic3RyaW5nKGluZGV4Qm9uZHMgKyAxLCBpbmRleEJvbmRFbmQpO1xuICAgICAgICBsZXQgaW5kZXhDb2xsZWN0aW9uID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ00gIFYzMCBNRExWMzAvU1RFQUJTIEFUT01TPSgnKTsgLy8gVjMwMDAgaW5kZXggZm9yIGNvbGxlY3Rpb25zXG4gICAgICAgIHdoaWxlIChpbmRleENvbGxlY3Rpb24gIT0gLTEpIHtcbiAgICAgICAgICAgIGluZGV4Q29sbGVjdGlvbiArPSAyODtcbiAgICAgICAgICAgIGNvbnN0IGNvbGxlY3Rpb25FbmQgPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignKScsIGluZGV4Q29sbGVjdGlvbik7XG4gICAgICAgICAgICBjb25zdCBjb2xsZWN0aW9uRW50cmllcyA9IG1vbEJsb2Nrc1tpXS5zdWJzdHJpbmcoaW5kZXhDb2xsZWN0aW9uLCBjb2xsZWN0aW9uRW5kKS5zcGxpdCgnICcpLnNsaWNlKDEpO1xuICAgICAgICAgICAgY29sbGVjdGlvbkVudHJpZXMuZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24ucHVzaChwYXJzZUludChlKSArIG5hdG9tKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaW5kZXhDb2xsZWN0aW9uID0gY29sbGVjdGlvbkVuZDtcbiAgICAgICAgICAgIGluZGV4Q29sbGVjdGlvbiA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdNICBWMzAgTURMVjMwL1NURUFCUyBBVE9NUz0oJywgaW5kZXhDb2xsZWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBuYXRvbSArPSB0d29Nb2xlY3VsZXMgPyBudW1iZXJzLm5hdG9tIDogbnVtYmVycy5uYXRvbSAtIDE7XG4gICAgICAgIG5ib25kICs9IG51bWJlcnMubmJvbmQ7XG4gICAgICAgIHhTaGlmdCArPSB0d29Nb2xlY3VsZXMgPyAwIDogY29vcmRpbmF0ZXMueFtudW1iZXJzLm5hdG9tIC0gMV0gLSBjb29yZGluYXRlcy54WzBdO1xuICAgICAgICBzZXF1ZW5jZVNoaWZ0ICs9IHR3b01vbGVjdWxlcyA/IC03IDogMDtcbiAgICB9XG4gICAgY29uc3QgZW50cmllcyA9IDQ7XG4gICAgY29uc3QgY29sbE51bWJlciA9IE1hdGguY2VpbChjb2xsZWN0aW9uLmxlbmd0aCAvIGVudHJpZXMpO1xuICAgIGlmIChvY2xSZW5kZXIpIHtcbiAgICAgICAgY29sbGVjdGlvbkJsb2NrICs9ICdNICBWMzAgTURMVjMwL1NURUFCUyBBVE9NUz0oJyArIGNvbGxlY3Rpb24ubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbGxlY3Rpb24ubGVuZ3RoOyBqKyspXG4gICAgICAgICAgICBjb2xsZWN0aW9uQmxvY2sgKz0gJyAnICsgY29sbGVjdGlvbltqXTtcbiAgICAgICAgY29sbGVjdGlvbkJsb2NrICs9ICcpXFxuJztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbGxlY3Rpb25CbG9jayArPSAnTSAgVjMwIE1ETFYzMC9TVEVBQlMgQVRPTVM9KCcgKyBjb2xsZWN0aW9uLmxlbmd0aCArICcgLVxcbic7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sbE51bWJlcjsgaSsrKSB7XG4gICAgICAgICAgICBjb2xsZWN0aW9uQmxvY2sgKz0gJ00gIFYzMCAnO1xuICAgICAgICAgICAgY29uc3QgZW50cmllc0N1cnJlbnQgPSBpICsgMSA9PSBjb2xsTnVtYmVyID8gY29sbGVjdGlvbi5sZW5ndGggLSAoY29sbE51bWJlciAtIDEpICogZW50cmllcyA6IGVudHJpZXM7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGVudHJpZXNDdXJyZW50OyBqKyspIHtcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uQmxvY2sgKz0gKGogKyAxID09IGVudHJpZXNDdXJyZW50KSA/XG4gICAgICAgICAgICAgICAgICAgIChpID09IGNvbGxOdW1iZXIgLSAxID8gY29sbGVjdGlvbltlbnRyaWVzICogaSArIGpdICsgJylcXG4nIDogY29sbGVjdGlvbltlbnRyaWVzICogaSArIGpdICsgJyAtXFxuJykgOlxuICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uW2VudHJpZXMgKiBpICsgal0gKyAnICc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy9nZW5lcmF0ZSBmaWxlXG4gICAgdHdvTW9sZWN1bGVzID8gbmF0b20gOiBuYXRvbSsrO1xuICAgIG1hY3JvTW9sQmxvY2sgKz0gJ00gIFYzMCBDT1VOVFMgJyArIG5hdG9tICsgJyAnICsgbmJvbmQgKyAnIDAgMCAwXFxuJztcbiAgICBtYWNyb01vbEJsb2NrICs9ICdNICBWMzAgQkVHSU4gQVRPTVxcbic7XG4gICAgbWFjcm9Nb2xCbG9jayArPSBhdG9tQmxvY2s7XG4gICAgbWFjcm9Nb2xCbG9jayArPSAnTSAgVjMwIEVORCBBVE9NXFxuJztcbiAgICBtYWNyb01vbEJsb2NrICs9ICdNICBWMzAgQkVHSU4gQk9ORFxcbic7XG4gICAgbWFjcm9Nb2xCbG9jayArPSBib25kQmxvY2s7XG4gICAgbWFjcm9Nb2xCbG9jayArPSAnTSAgVjMwIEVORCBCT05EXFxuJztcbiAgICBtYWNyb01vbEJsb2NrICs9ICdNICBWMzAgQkVHSU4gQ09MTEVDVElPTlxcbic7XG4gICAgbWFjcm9Nb2xCbG9jayArPSBjb2xsZWN0aW9uQmxvY2s7XG4gICAgbWFjcm9Nb2xCbG9jayArPSAnTSAgVjMwIEVORCBDT0xMRUNUSU9OXFxuJztcbiAgICBtYWNyb01vbEJsb2NrICs9ICdNICBWMzAgRU5EIENUQUJcXG4nO1xuICAgIG1hY3JvTW9sQmxvY2sgKz0gJ00gIEVORFxcbic7XG4gICAgcmV0dXJuIG1hY3JvTW9sQmxvY2s7XG59XG5mdW5jdGlvbiByb3RhdGVOdWNsZW90aWRlc1YzMDAwKG1vbGVjdWxlKSB7XG4gICAgbGV0IG1vbEJsb2NrID0gbW9sZWN1bGUuaW5jbHVkZXMoJ00gIEVORCcpID8gbW9sZWN1bGUgOiBPQ0wuTW9sZWN1bGUuZnJvbVNtaWxlcyhtb2xlY3VsZSkudG9Nb2xmaWxlVjMoKTtcbiAgICBjb25zdCBjb29yZGluYXRlcyA9IGV4dHJhY3RBdG9tRGF0YVYzMDAwKG1vbEJsb2NrKTtcbiAgICBjb25zdCBuYXRvbSA9IGNvb3JkaW5hdGVzLmF0b21JbmRleC5sZW5ndGg7XG4gICAgY29uc3QgaW5kZXhGaXZlUHJpbWUgPSBjb29yZGluYXRlcy5hdG9tSW5kZXguaW5kZXhPZigxKTtcbiAgICBjb25zdCBpbmRleFRocmVlUHJpbWUgPSBjb29yZGluYXRlcy5hdG9tSW5kZXguaW5kZXhPZihuYXRvbSk7XG4gICAgLy9maXggNSBwcmltZSBpZiBpbmFkZXF1YXRlXG4gICAgaWYgKG5hdG9tID4gOClcbiAgICAgICAgZml4NVByaW1lKGNvb3JkaW5hdGVzLCBpbmRleEZpdmVQcmltZSwgaW5kZXhUaHJlZVByaW1lKTtcbiAgICBjb25zdCB4Q2VudGVyID0gKGNvb3JkaW5hdGVzLnhbaW5kZXhUaHJlZVByaW1lXSArIGNvb3JkaW5hdGVzLnhbaW5kZXhGaXZlUHJpbWVdKSAvIDI7XG4gICAgY29uc3QgeUNlbnRlciA9IChjb29yZGluYXRlcy55W2luZGV4VGhyZWVQcmltZV0gKyBjb29yZGluYXRlcy55W2luZGV4Rml2ZVByaW1lXSkgLyAyO1xuICAgIC8vcGxhY2UgdG8gY2VudGVyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXRvbTsgaSsrKSB7XG4gICAgICAgIGNvb3JkaW5hdGVzLnhbaV0gLT0geENlbnRlcjtcbiAgICAgICAgY29vcmRpbmF0ZXMueVtpXSAtPSB5Q2VudGVyO1xuICAgIH1cbiAgICBsZXQgYW5nbGUgPSAwO1xuICAgIGlmIChjb29yZGluYXRlcy54W2luZGV4Rml2ZVByaW1lXSA9PSAwKVxuICAgICAgICBhbmdsZSA9IGNvb3JkaW5hdGVzLnlbaW5kZXhGaXZlUHJpbWVdID4gY29vcmRpbmF0ZXMueVtpbmRleFRocmVlUHJpbWVdID8gTWF0aC5QSSAvIDIgOiAzICogTWF0aC5QSSAvIDI7XG4gICAgZWxzZSBpZiAoY29vcmRpbmF0ZXMueVtpbmRleEZpdmVQcmltZV0gPT0gMClcbiAgICAgICAgYW5nbGUgPSBjb29yZGluYXRlcy54W2luZGV4Rml2ZVByaW1lXSA+IGNvb3JkaW5hdGVzLnhbaW5kZXhUaHJlZVByaW1lXSA/IE1hdGguUEkgOiAwO1xuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBkZXJpdmF0aXZlID0gY29vcmRpbmF0ZXMueVtpbmRleEZpdmVQcmltZV0gLyBjb29yZGluYXRlcy54W2luZGV4Rml2ZVByaW1lXTtcbiAgICAgICAgYW5nbGUgPSBkZXJpdmF0aXZlID4gMCA/IE1hdGguUEkgLSBNYXRoLmF0YW4oZGVyaXZhdGl2ZSkgOiBNYXRoLmF0YW4oZGVyaXZhdGl2ZSk7XG4gICAgfVxuICAgIGNvbnN0IGNvcyA9IE1hdGguY29zKGFuZ2xlKTtcbiAgICBjb25zdCBzaW4gPSBNYXRoLnNpbihhbmdsZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXRvbTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHhBZGQgPSBjb29yZGluYXRlcy54W2ldO1xuICAgICAgICBjb29yZGluYXRlcy54W2ldID0geEFkZCAqIGNvcyAtIGNvb3JkaW5hdGVzLnlbaV0gKiBzaW47XG4gICAgICAgIGNvb3JkaW5hdGVzLnlbaV0gPSB4QWRkICogc2luICsgY29vcmRpbmF0ZXMueVtpXSAqIGNvcztcbiAgICB9XG4gICAgLy9wbGFjZSB0byByaWdodFxuICAgIGNvbnN0IHhTaGlmdCA9IGNvb3JkaW5hdGVzLnhbaW5kZXhGaXZlUHJpbWVdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmF0b207IGkrKylcbiAgICAgICAgY29vcmRpbmF0ZXMueFtpXSAtPSB4U2hpZnQ7XG4gICAgLy9yZXdyaXRlIG1vbEJsb2NrXG4gICAgbGV0IGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignTSAgVjMwIEJFR0lOIEFUT00nKTsgLy8gVjMwMDAgaW5kZXggZm9yIGF0b21zIGNvb3JkaW5hdGVzXG4gICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdcXG4nLCBpbmRleCk7XG4gICAgbGV0IGluZGV4RW5kID0gaW5kZXg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXRvbTsgaSsrKSB7XG4gICAgICAgIGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignVjMwJywgaW5kZXgpICsgNDtcbiAgICAgICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXhFbmQpO1xuICAgICAgICBtb2xCbG9jayA9IG1vbEJsb2NrLnNsaWNlKDAsIGluZGV4KSArXG4gICAgICAgICAgICBjb29yZGluYXRlcy54W2ldICsgJyAnICsgY29vcmRpbmF0ZXMueVtpXSArXG4gICAgICAgICAgICBtb2xCbG9jay5zbGljZShpbmRleEVuZCk7XG4gICAgICAgIGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignXFxuJywgaW5kZXgpICsgMTtcbiAgICB9XG4gICAgcmV0dXJuIG1vbEJsb2NrO1xufVxuZnVuY3Rpb24gaW52ZXJ0TnVjbGVvdGlkZXNWMzAwMChtb2xlY3VsZSkge1xuICAgIGxldCBtb2xCbG9jayA9IG1vbGVjdWxlLmluY2x1ZGVzKCdNICBFTkQnKSA/IG1vbGVjdWxlIDogT0NMLk1vbGVjdWxlLmZyb21TbWlsZXMobW9sZWN1bGUpLnRvTW9sZmlsZVYzKCk7XG4gICAgY29uc3QgY29vcmRpbmF0ZXMgPSBleHRyYWN0QXRvbURhdGFWMzAwMChtb2xCbG9jayk7XG4gICAgY29uc3QgbmF0b20gPSBjb29yZGluYXRlcy5hdG9tSW5kZXgubGVuZ3RoO1xuICAgIGNvbnN0IHhDZW50ZXIgPSAoTWF0aC5tYXgoLi4uY29vcmRpbmF0ZXMueCkgKyBNYXRoLm1pbiguLi5jb29yZGluYXRlcy54KSkgLyAyO1xuICAgIGNvbnN0IHlDZW50ZXIgPSAoTWF0aC5tYXgoLi4uY29vcmRpbmF0ZXMueSkgKyBNYXRoLm1pbiguLi5jb29yZGluYXRlcy55KSkgLyAyO1xuICAgIC8vcGxhY2UgdG8gY2VudGVyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXRvbTsgaSsrKSB7XG4gICAgICAgIGNvb3JkaW5hdGVzLnhbaV0gLT0geENlbnRlcjtcbiAgICAgICAgY29vcmRpbmF0ZXMueVtpXSAtPSB5Q2VudGVyO1xuICAgIH1cbiAgICBjb25zdCBhbmdsZSA9IE1hdGguUEk7XG4gICAgY29uc3QgY29zID0gTWF0aC5jb3MoYW5nbGUpO1xuICAgIGNvbnN0IHNpbiA9IE1hdGguc2luKGFuZ2xlKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdG9tOyBpKyspIHtcbiAgICAgICAgY29uc3QgeEFkZCA9IGNvb3JkaW5hdGVzLnhbaV07XG4gICAgICAgIGNvb3JkaW5hdGVzLnhbaV0gPSB4QWRkICogY29zIC0gY29vcmRpbmF0ZXMueVtpXSAqIHNpbjtcbiAgICAgICAgY29vcmRpbmF0ZXMueVtpXSA9IHhBZGQgKiBzaW4gKyBjb29yZGluYXRlcy55W2ldICogY29zO1xuICAgIH1cbiAgICAvL3BsYWNlIGJhY2tcbiAgICBjb25zdCB5U2hpZnQgPSBNYXRoLm1heCguLi5jb29yZGluYXRlcy55KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdG9tOyBpKyspIHtcbiAgICAgICAgY29vcmRpbmF0ZXMueFtpXSArPSB4Q2VudGVyO1xuICAgICAgICBjb29yZGluYXRlcy55W2ldIC09IHlTaGlmdDtcbiAgICB9XG4gICAgLy9yZXdyaXRlIG1vbEJsb2NrXG4gICAgbGV0IGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignTSAgVjMwIEJFR0lOIEFUT00nKTsgLy8gVjMwMDAgaW5kZXggZm9yIGF0b21zIGNvb3JkaW5hdGVzXG4gICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdcXG4nLCBpbmRleCk7XG4gICAgbGV0IGluZGV4RW5kID0gaW5kZXg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXRvbTsgaSsrKSB7XG4gICAgICAgIGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignVjMwJywgaW5kZXgpICsgNDtcbiAgICAgICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXhFbmQpO1xuICAgICAgICBtb2xCbG9jayA9IG1vbEJsb2NrLnNsaWNlKDAsIGluZGV4KSArXG4gICAgICAgICAgICBjb29yZGluYXRlcy54W2ldICsgJyAnICsgY29vcmRpbmF0ZXMueVtpXSArXG4gICAgICAgICAgICBtb2xCbG9jay5zbGljZShpbmRleEVuZCk7XG4gICAgICAgIGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignXFxuJywgaW5kZXgpICsgMTtcbiAgICB9XG4gICAgcmV0dXJuIG1vbEJsb2NrO1xufVxuZnVuY3Rpb24gZml4NVByaW1lKGNvb3JkaW5hdGVzLCBpbmRleEZpdmVQcmltZSwgaW5kZXhUaHJlZVByaW1lKSB7XG4gICAgY29uc3QgaW5kZXhGaXZlUHJpbWVOZWlnaGJvdXIgPSBpbmRleEZpdmVQcmltZSArIDE7XG4gICAgY29uc3QgeFNoaWZ0ID0gY29vcmRpbmF0ZXMueFtpbmRleEZpdmVQcmltZU5laWdoYm91cl07XG4gICAgY29uc3QgeVNoaWZ0ID0gY29vcmRpbmF0ZXMueVtpbmRleEZpdmVQcmltZU5laWdoYm91cl07XG4gICAgY29uc3QgYmFzZTNQcmltZVggPSBjb29yZGluYXRlcy54W2luZGV4VGhyZWVQcmltZV0gLSB4U2hpZnQ7XG4gICAgY29uc3QgYmFzZTNQcmltZVkgPSBjb29yZGluYXRlcy55W2luZGV4VGhyZWVQcmltZV0gLSB5U2hpZnQ7XG4gICAgY29uc3QgYmFzZTVQcmltZVggPSBjb29yZGluYXRlcy54W2luZGV4Rml2ZVByaW1lXSAtIHhTaGlmdDtcbiAgICBjb25zdCBiYXNlNVByaW1lWSA9IGNvb3JkaW5hdGVzLnlbaW5kZXhGaXZlUHJpbWVdIC0geVNoaWZ0O1xuICAgIGNvbnN0IHJvdGF0ZWQ1UHJpbWVYID0gYmFzZTVQcmltZVggKiBNYXRoLmNvcyhNYXRoLlBJICogMiAvIDMpIC0gYmFzZTVQcmltZVkgKiBNYXRoLnNpbihNYXRoLlBJICogMiAvIDMpO1xuICAgIGNvbnN0IHJvdGF0ZWQ1UHJpbWVZID0gYmFzZTVQcmltZVggKiBNYXRoLnNpbihNYXRoLlBJICogMiAvIDMpICsgYmFzZTVQcmltZVkgKiBNYXRoLmNvcyhNYXRoLlBJICogMiAvIDMpO1xuICAgIGNvbnN0IGR4ID0gYmFzZTVQcmltZVggLSBiYXNlM1ByaW1lWDtcbiAgICBjb25zdCBkeSA9IGJhc2U1UHJpbWVZIC0gYmFzZTNQcmltZVk7XG4gICAgY29uc3QgZHhSb3RhdGVkID0gcm90YXRlZDVQcmltZVggLSBiYXNlM1ByaW1lWDtcbiAgICBjb25zdCBkeVJvdGF0ZWQgPSByb3RhdGVkNVByaW1lWSAtIGJhc2UzUHJpbWVZO1xuICAgIGlmIChNYXRoLnNxcnQoZHlSb3RhdGVkICogZHlSb3RhdGVkICsgZHhSb3RhdGVkICogZHhSb3RhdGVkKSA+PSBNYXRoLnNxcnQoZHkgKiBkeSArIGR4ICogZHgpKSB7XG4gICAgICAgIGNvb3JkaW5hdGVzLnhbaW5kZXhGaXZlUHJpbWVdID0gcm90YXRlZDVQcmltZVggKyB4U2hpZnQ7XG4gICAgICAgIGNvb3JkaW5hdGVzLnlbaW5kZXhGaXZlUHJpbWVdID0gcm90YXRlZDVQcmltZVkgKyB5U2hpZnQ7XG4gICAgfVxufVxuZnVuY3Rpb24gZXh0cmFjdEF0b21zQm9uZHNOdW1iZXJzVjMwMDAobW9sQmxvY2spIHtcbiAgICBtb2xCbG9jayA9IG1vbEJsb2NrLnJlcGxhY2VBbGwoJ1xccicsICcnKTsgLy9lcXVhbGl6ZSBvbGQgYW5kIG5ldyBzZGYgc3RhbmRhcmRzXG4gICAgbGV0IGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignQ09VTlRTJykgKyA3OyAvLyBWMzAwMCBpbmRleCBmb3IgYXRvbXMgYW5kIGJvbmRzIG51bWJlclxuICAgIGxldCBpbmRleEVuZCA9IG1vbEJsb2NrLmluZGV4T2YoJyAnLCBpbmRleCk7XG4gICAgY29uc3QgYXRvbXNOdW1iZXIgPSBwYXJzZUludChtb2xCbG9jay5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSk7XG4gICAgaW5kZXggPSBpbmRleEVuZCArIDE7XG4gICAgaW5kZXhFbmQgPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpO1xuICAgIGNvbnN0IGJvbmRzTnVtYmVyID0gcGFyc2VJbnQobW9sQmxvY2suc3Vic3RyaW5nKGluZGV4LCBpbmRleEVuZCkpO1xuICAgIHJldHVybiB7IG5hdG9tOiBhdG9tc051bWJlciwgbmJvbmQ6IGJvbmRzTnVtYmVyIH07XG59XG5mdW5jdGlvbiBleHRyYWN0QXRvbURhdGFWMzAwMChtb2xCbG9jaykge1xuICAgIGNvbnN0IG51bWJlcnMgPSBleHRyYWN0QXRvbXNCb25kc051bWJlcnNWMzAwMChtb2xCbG9jayk7XG4gICAgbGV0IGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignTSAgVjMwIEJFR0lOIEFUT00nKTsgLy8gVjMwMDAgaW5kZXggZm9yIGF0b21zIGNvb3JkaW5hdGVzXG4gICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdcXG4nLCBpbmRleCk7XG4gICAgbGV0IGluZGV4RW5kID0gaW5kZXg7XG4gICAgY29uc3QgaW5kZXhlcyA9IEFycmF5KG51bWJlcnMubmF0b20pO1xuICAgIGNvbnN0IHR5cGVzID0gQXJyYXkobnVtYmVycy5uYXRvbSk7XG4gICAgY29uc3QgeCA9IEFycmF5KG51bWJlcnMubmF0b20pO1xuICAgIGNvbnN0IHkgPSBBcnJheShudW1iZXJzLm5hdG9tKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlcnMubmF0b207IGkrKykge1xuICAgICAgICBpbmRleCA9IG1vbEJsb2NrLmluZGV4T2YoJ1YzMCcsIGluZGV4KSArIDQ7XG4gICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2suaW5kZXhPZignICcsIGluZGV4KTtcbiAgICAgICAgaW5kZXhlc1tpXSA9IHBhcnNlSW50KG1vbEJsb2NrLnN1YnN0cmluZyhpbmRleCwgaW5kZXhFbmQpKTtcbiAgICAgICAgaW5kZXggPSBpbmRleEVuZCArIDE7XG4gICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2suaW5kZXhPZignICcsIGluZGV4KTtcbiAgICAgICAgdHlwZXNbaV0gPSBtb2xCbG9jay5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKTtcbiAgICAgICAgaW5kZXggPSBpbmRleEVuZCArIDE7XG4gICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2suaW5kZXhPZignICcsIGluZGV4KTtcbiAgICAgICAgeFtpXSA9IHBhcnNlRmxvYXQobW9sQmxvY2suc3Vic3RyaW5nKGluZGV4LCBpbmRleEVuZCkpO1xuICAgICAgICBpbmRleCA9IGluZGV4RW5kICsgMTtcbiAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpO1xuICAgICAgICB5W2ldID0gcGFyc2VGbG9hdChtb2xCbG9jay5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSk7XG4gICAgICAgIGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignXFxuJywgaW5kZXgpICsgMTtcbiAgICB9XG4gICAgcmV0dXJuIHsgYXRvbUluZGV4OiBpbmRleGVzLCBhdG9tVHlwZTogdHlwZXMsIHg6IHgsIHk6IHkgfTtcbn1cbiIsImltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgeyBzZXF1ZW5jZVRvTW9sVjMwMDAgfSBmcm9tICcuLi9zdHJ1Y3R1cmVzLXdvcmtzL2Zyb20tbW9ub21lcnMnO1xuaW1wb3J0IHsgbGlua1YzMDAwIH0gZnJvbSAnLi4vc3RydWN0dXJlcy13b3Jrcy9tb2wtdHJhbnNmb3JtYXRpb25zJztcbmltcG9ydCB7IGdldEZvcm1hdCB9IGZyb20gJy4uL3N0cnVjdHVyZXMtd29ya3Mvc2VxdWVuY2UtY29kZXMtdG9vbHMnO1xuZXhwb3J0IGZ1bmN0aW9uIHNhdmVTZGYoYXMsIHNzLCBvbmVFbnRpdHksIGZpdDNkeCkge1xuICAgIGNvbnN0IGZvcm1hdEFzID0gZ2V0Rm9ybWF0KGFzKTtcbiAgICBjb25zdCBmb3JtYXRTcyA9IGdldEZvcm1hdChzcyk7XG4gICAgY29uc3QgbW9sU1MgPSBzZXF1ZW5jZVRvTW9sVjMwMDAoc3MsIGZhbHNlLCBmYWxzZSwgZm9ybWF0U3MpO1xuICAgIGNvbnN0IG1vbEFTID0gc2VxdWVuY2VUb01vbFYzMDAwKGFzLCB0cnVlLCBmYWxzZSwgZm9ybWF0QXMpO1xuICAgIGxldCByZXN1bHQ7XG4gICAgaWYgKG9uZUVudGl0eSlcbiAgICAgICAgcmVzdWx0ID0gbGlua1YzMDAwKFttb2xTUywgbW9sQVNdLCB0cnVlLCAhZml0M2R4KSArICdcXG5cXG4kJCQkXFxuJztcbiAgICBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID1cbiAgICAgICAgICAgIG1vbFNTICsgJ1xcbicgK1xuICAgICAgICAgICAgICAgIGA+ICA8U2VxdWVuY2U+XFxuU2Vuc2UgU3RyYW5kXFxuXFxuJCQkJFxcbmAgK1xuICAgICAgICAgICAgICAgIG1vbEFTICsgJ1xcbicgK1xuICAgICAgICAgICAgICAgIGA+ICA8U2VxdWVuY2U+XFxuQW50aSBTZW5zZVxcblxcbiQkJCRcXG5gO1xuICAgIH1cbiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdocmVmJywgJ2RhdGE6dGV4dC9wbGFpbjtjaGFyc2V0PXV0Zi04LCcgKyBlbmNvZGVVUklDb21wb25lbnQocmVzdWx0KSk7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgc3MucmVwbGFjZSgvXFxzL2csICcnKSArICcuc2RmJyk7XG4gICAgZWxlbWVudC5jbGljaygpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNhdmVTZW5zZUFudGlTZW5zZSgpIHtcbiAgICBjb25zdCBtb2xlY3VsZVN2Z0RpdiA9IHVpLmJsb2NrKFtdKTtcbiAgICBjb25zdCBzc0lucHV0ID0gdWkudGV4dElucHV0KCdTZW5zZSBTdHJhbmQgNVxcJyAtPjNcXCcnLCAnJyk7XG4gICAgY29uc3QgYXNJbnB1dCA9IHVpLnRleHRJbnB1dCgnQW50aSBTZW5zZSAzXFwnIC0+NVxcJycsICcnKTtcbiAgICBjb25zdCBzYXZlT3B0aW9uID0gdWkuc3dpdGNoSW5wdXQoJ1NhdmUgYXMgb25lIGVudGl0eScsIHRydWUpO1xuICAgIGNvbnN0IHNhdmUzZHggPSB1aS5zd2l0Y2hJbnB1dCgnU2F2ZSAzZHgnLCB0cnVlKTtcbiAgICBjb25zdCBzYXZlQnRuID0gdWkuYnV0dG9uKCdTYXZlIFNERicsICgpID0+IHNhdmVTZGYoYXNJbnB1dC52YWx1ZSwgc3NJbnB1dC52YWx1ZSwgc2F2ZU9wdGlvbi52YWx1ZSwgc2F2ZTNkeC52YWx1ZSkpO1xuICAgIGNvbnN0IHNhdmVTZWN0aW9uID0gdWkucGFuZWwoW1xuICAgICAgICB1aS5kaXYoW1xuICAgICAgICAgICAgdWkuZGl2KFtcbiAgICAgICAgICAgICAgICB1aS5kaXZIKFt1aS5oMSgnSW5wdXRzJyldKSxcbiAgICAgICAgICAgICAgICB1aS5kaXZWKFtcbiAgICAgICAgICAgICAgICAgICAgdWkuZGl2KFtzc0lucHV0LnJvb3RdKSxcbiAgICAgICAgICAgICAgICAgICAgdWkuZGl2KFthc0lucHV0LnJvb3RdKSxcbiAgICAgICAgICAgICAgICAgICAgc2F2ZU9wdGlvbixcbiAgICAgICAgICAgICAgICAgICAgc2F2ZTNkeCxcbiAgICAgICAgICAgICAgICAgICAgdWkuYnV0dG9uc0lucHV0KFtzYXZlQnRuXSksXG4gICAgICAgICAgICAgICAgXSwgJ3VpLWZvcm0nKSxcbiAgICAgICAgICAgIF0sICd1aS1mb3JtJyksXG4gICAgICAgIF0sICd1aS1mb3JtJyksXG4gICAgICAgIG1vbGVjdWxlU3ZnRGl2LFxuICAgIF0pO1xuICAgIHJldHVybiBzYXZlU2VjdGlvbjtcbn1cbiIsIi8vIGltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuLy8gaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbi8vIGltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5pbXBvcnQgeyBtYXAsIFNZTlRIRVNJWkVSUywgVEVDSE5PTE9HSUVTLCBNT0RJRklDQVRJT05TIH0gZnJvbSAnLi9tYXAnO1xuaW1wb3J0IHsgYXNvR2FwbWVyc051Y2xlb3RpZGVzVG9CaW9TcHJpbmcsIGFzb0dhcG1lcnNOdWNsZW90aWRlc1RvR2NycywgYXNvR2FwbWVyc0Jpb1NwcmluZ1RvTnVjbGVvdGlkZXMsIGFzb0dhcG1lcnNCaW9TcHJpbmdUb0djcnMsIGFzb0dhcG1lcnNHY3JzVG9OdWNsZW90aWRlcywgYXNvR2FwbWVyc0djcnNUb0Jpb1NwcmluZywgZ2Nyc1RvTWVybWFkZTEyLCBzaVJuYU51Y2xlb3RpZGVUb0Jpb1NwcmluZ1NlbnNlU3RyYW5kLCBzaVJuYU51Y2xlb3RpZGVUb0F4b2xhYnNTZW5zZVN0cmFuZCwgc2lSbmFOdWNsZW90aWRlc1RvR2Nycywgc2lSbmFCaW9TcHJpbmdUb051Y2xlb3RpZGVzLCBzaVJuYUJpb1NwcmluZ1RvQXhvbGFicywgc2lSbmFCaW9TcHJpbmdUb0djcnMsIHNpUm5hQXhvbGFic1RvTnVjbGVvdGlkZXMsIHNpUm5hQXhvbGFic1RvQmlvU3ByaW5nLCBzaVJuYUF4b2xhYnNUb0djcnMsIHNpUm5hR2Nyc1RvTnVjbGVvdGlkZXMsIHNpUm5hR2Nyc1RvQmlvU3ByaW5nLCBzaVJuYUdjcnNUb0F4b2xhYnMsIGdjcnNUb051Y2xlb3RpZGVzIH0gZnJvbSAnLi9jb252ZXJ0ZXJzJztcbmNvbnN0IG5vVHJhbnNsYXRpb25UYWJsZUF2YWlsYWJsZSA9ICdObyB0cmFuc2xhdGlvbiB0YWJsZSBhdmFpbGFibGUnO1xuZXhwb3J0IGNvbnN0IHVuZGVmaW5lZElucHV0U2VxdWVuY2UgPSAnVHlwZSBvZiBpbnB1dCBzZXF1ZW5jZSBpcyB1bmRlZmluZWQnO1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1hdChzZXF1ZW5jZSkge1xuICAgIGNvbnN0IHBvc3NpYmxlU3ludGhlc2l6ZXJzID0gZ2V0TGlzdE9mUG9zc2libGVTeW50aGVzaXplcnNCeUZpcnN0TWF0Y2hlZENvZGUoc2VxdWVuY2UpO1xuICAgIGlmIChwb3NzaWJsZVN5bnRoZXNpemVycy5sZW5ndGggPT0gMClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IG91dHB1dEluZGV4ID0gMDtcbiAgICBjb25zdCBmaXJzdFVuaXF1ZUNoYXJhY3RlcnMgPSBbJ3InLCAnZCddO1xuICAgIGNvbnN0IG51Y2xlb3RpZGVzID0gWydBJywgJ1UnLCAnVCcsICdDJywgJ0cnXTtcbiAgICBwb3NzaWJsZVN5bnRoZXNpemVycy5mb3JFYWNoKChzeW50aGVzaXplcikgPT4ge1xuICAgICAgICBjb25zdCBjb2RlcyA9IGdldEFsbENvZGVzT2ZTeW50aGVzaXplcihzeW50aGVzaXplcik7XG4gICAgICAgIHdoaWxlIChvdXRwdXRJbmRleCA8IHNlcXVlbmNlLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlZENvZGUgPSBjb2Rlcy5maW5kKChjKSA9PiBjID09IHNlcXVlbmNlLnNsaWNlKG91dHB1dEluZGV4LCBvdXRwdXRJbmRleCArIGMubGVuZ3RoKSk7XG4gICAgICAgICAgICBpZiAobWF0Y2hlZENvZGUgPT0gbnVsbClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmICggLy8gZm9yIG1pc3Rha2UgcGF0dGVybiAnckFBJ1xuICAgICAgICAgICAgb3V0cHV0SW5kZXggPiAxICYmXG4gICAgICAgICAgICAgICAgbnVjbGVvdGlkZXMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kZXhdKSAmJlxuICAgICAgICAgICAgICAgIGZpcnN0VW5pcXVlQ2hhcmFjdGVycy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRleCAtIDJdKSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmICggLy8gZm9yIG1pc3Rha2UgcGF0dGVybiAnQXJBJ1xuICAgICAgICAgICAgZmlyc3RVbmlxdWVDaGFyYWN0ZXJzLmluY2x1ZGVzKHNlcXVlbmNlW291dHB1dEluZGV4ICsgMV0pICYmXG4gICAgICAgICAgICAgICAgbnVjbGVvdGlkZXMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kZXhdKSkge1xuICAgICAgICAgICAgICAgIG91dHB1dEluZGV4Kys7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXRwdXRJbmRleCArPSBtYXRjaGVkQ29kZS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBpbmRleE9mRmlyc3ROb3RWYWxpZENoYXIgPSAob3V0cHV0SW5kZXggPT0gc2VxdWVuY2UubGVuZ3RoKSA/IC0xIDogb3V0cHV0SW5kZXg7XG4gICAgaWYgKGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhciAhPSAtMSlcbiAgICAgICAgcmV0dXJuIHBvc3NpYmxlU3ludGhlc2l6ZXJzWzBdO1xuICAgIGNvbnN0IHBvc3NpYmxlVGVjaG5vbG9naWVzID0gZ2V0TGlzdE9mUG9zc2libGVUZWNobm9sb2dpZXNCeUZpcnN0TWF0Y2hlZENvZGUoc2VxdWVuY2UsIHBvc3NpYmxlU3ludGhlc2l6ZXJzWzBdKTtcbiAgICBpZiAocG9zc2libGVUZWNobm9sb2dpZXMubGVuZ3RoID09IDApXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIG91dHB1dEluZGV4ID0gMDtcbiAgICBwb3NzaWJsZVRlY2hub2xvZ2llcy5mb3JFYWNoKCh0ZWNobm9sb2d5KSA9PiB7XG4gICAgICAgIGNvbnN0IGNvZGVzID0gT2JqZWN0LmtleXMobWFwW3Bvc3NpYmxlU3ludGhlc2l6ZXJzWzBdXVt0ZWNobm9sb2d5XSk7XG4gICAgICAgIHdoaWxlIChvdXRwdXRJbmRleCA8IHNlcXVlbmNlLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlZENvZGUgPSBjb2Rlcy5maW5kKChjKSA9PiBjID09IHNlcXVlbmNlLnNsaWNlKG91dHB1dEluZGV4LCBvdXRwdXRJbmRleCArIGMubGVuZ3RoKSk7XG4gICAgICAgICAgICBpZiAobWF0Y2hlZENvZGUgPT0gbnVsbClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmICggLy8gZm9yIG1pc3Rha2UgcGF0dGVybiAnckFBJ1xuICAgICAgICAgICAgb3V0cHV0SW5kZXggPiAxICYmXG4gICAgICAgICAgICAgICAgbnVjbGVvdGlkZXMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kZXhdKSAmJlxuICAgICAgICAgICAgICAgIGZpcnN0VW5pcXVlQ2hhcmFjdGVycy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRleCAtIDJdKSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmICggLy8gZm9yIG1pc3Rha2UgcGF0dGVybiAnQXJBJ1xuICAgICAgICAgICAgZmlyc3RVbmlxdWVDaGFyYWN0ZXJzLmluY2x1ZGVzKHNlcXVlbmNlW291dHB1dEluZGV4ICsgMV0pICYmXG4gICAgICAgICAgICAgICAgbnVjbGVvdGlkZXMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kZXhdKSkge1xuICAgICAgICAgICAgICAgIG91dHB1dEluZGV4Kys7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXRwdXRJbmRleCArPSBtYXRjaGVkQ29kZS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcG9zc2libGVTeW50aGVzaXplcnNbMF07XG59XG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFNlcXVlbmNlKHNlcXVlbmNlLCBmb3JtYXQpIHtcbiAgICBjb25zdCBwb3NzaWJsZVN5bnRoZXNpemVycyA9IGZvcm1hdCA9PSBudWxsID9cbiAgICAgICAgZ2V0TGlzdE9mUG9zc2libGVTeW50aGVzaXplcnNCeUZpcnN0TWF0Y2hlZENvZGUoc2VxdWVuY2UpIDpcbiAgICAgICAgW2Zvcm1hdF07XG4gICAgLy8gaWYgKHBvc3NpYmxlU3ludGhlc2l6ZXJzLmxlbmd0aCA+IDEpIHtcbiAgICAvLyAgIGNvbnN0IHN5bnRoZXNpemVyID0gdWkuY2hvaWNlSW5wdXQoJ0Nob29zZSBzeW50aGVzaXplciBmcm9tIGxpc3Q6ICcsIHBvc3NpYmxlU3ludGhlc2l6ZXJzWzBdLFxuICAgIC8vICBwb3NzaWJsZVN5bnRoZXNpemVycyk7XG4gICAgLy8gICB1aS5kaWFsb2coJ0Nob29zZSBTeW50aGVzaXplcicpXG4gICAgLy8gICAgIC5hZGQodWkucGFuZWwoW3N5bnRoZXNpemVyLnJvb3RdLCB7c3R5bGU6IHtmb250V2VpZ2h0OiAnYm9sZCd9fSkpXG4gICAgLy8gICAgIC5vbk9LKCgpID0+IHBvc3NpYmxlU3ludGhlc2l6ZXJzID0gW3N5bnRoZXNpemVyLnZhbHVlXSlcbiAgICAvLyAgICAgLm9uQ2FuY2VsKCgpID0+IHtcbiAgICAvLyAgICAgICBwb3NzaWJsZVN5bnRoZXNpemVycyA9IFtwb3NzaWJsZVN5bnRoZXNpemVyc1swXV07XG4gICAgLy8gICAgICAgZ3Jvay5zaGVsbC53YXJuaW5nKCdJbnB1dCBzZXF1ZW5jZSBpcyBleHBlY3RlZCB0byBiZSBpbiBmb3JtYXQgJyArIHBvc3NpYmxlU3ludGhlc2l6ZXJzWzBdKTtcbiAgICAvLyAgICAgfSlcbiAgICAvLyAgICAgLnNob3coKTtcbiAgICAvLyB9IGVsc2UgaWYgKHBvc3NpYmxlU3ludGhlc2l6ZXJzLmxlbmd0aCA9PSAwKVxuICAgIGlmIChwb3NzaWJsZVN5bnRoZXNpemVycy5sZW5ndGggPT0gMClcbiAgICAgICAgcmV0dXJuIHsgaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyOiAwLCBzeW50aGVzaXplcjogbnVsbCwgdGVjaG5vbG9neTogbnVsbCB9O1xuICAgIGxldCBvdXRwdXRJbmRleCA9IDA7XG4gICAgY29uc3QgZmlyc3RVbmlxdWVDaGFyYWN0ZXJzID0gWydyJywgJ2QnXTtcbiAgICBjb25zdCBudWNsZW90aWRlcyA9IFsnQScsICdVJywgJ1QnLCAnQycsICdHJ107XG4gICAgcG9zc2libGVTeW50aGVzaXplcnMuZm9yRWFjaCgoc3ludGhlc2l6ZXIpID0+IHtcbiAgICAgICAgY29uc3QgY29kZXMgPSBnZXRBbGxDb2Rlc09mU3ludGhlc2l6ZXIoc3ludGhlc2l6ZXIpO1xuICAgICAgICB3aGlsZSAob3V0cHV0SW5kZXggPCBzZXF1ZW5jZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZWRDb2RlID0gY29kZXMuZmluZCgoYykgPT4gYyA9PSBzZXF1ZW5jZS5zbGljZShvdXRwdXRJbmRleCwgb3V0cHV0SW5kZXggKyBjLmxlbmd0aCkpO1xuICAgICAgICAgICAgaWYgKG1hdGNoZWRDb2RlID09IG51bGwpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBpZiAoIC8vIGZvciBtaXN0YWtlIHBhdHRlcm4gJ3JBQSdcbiAgICAgICAgICAgIG91dHB1dEluZGV4ID4gMSAmJlxuICAgICAgICAgICAgICAgIG51Y2xlb3RpZGVzLmluY2x1ZGVzKHNlcXVlbmNlW291dHB1dEluZGV4XSkgJiZcbiAgICAgICAgICAgICAgICBmaXJzdFVuaXF1ZUNoYXJhY3RlcnMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kZXggLSAyXSkpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBpZiAoIC8vIGZvciBtaXN0YWtlIHBhdHRlcm4gJ0FyQSdcbiAgICAgICAgICAgIGZpcnN0VW5pcXVlQ2hhcmFjdGVycy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRleCArIDFdKSAmJlxuICAgICAgICAgICAgICAgIG51Y2xlb3RpZGVzLmluY2x1ZGVzKHNlcXVlbmNlW291dHB1dEluZGV4XSkpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRJbmRleCsrO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0cHV0SW5kZXggKz0gbWF0Y2hlZENvZGUubGVuZ3RoO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyID0gKG91dHB1dEluZGV4ID09IHNlcXVlbmNlLmxlbmd0aCkgPyAtMSA6IG91dHB1dEluZGV4O1xuICAgIGlmIChpbmRleE9mRmlyc3ROb3RWYWxpZENoYXIgIT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhcjogaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyLFxuICAgICAgICAgICAgc3ludGhlc2l6ZXI6IHBvc3NpYmxlU3ludGhlc2l6ZXJzLFxuICAgICAgICAgICAgdGVjaG5vbG9neTogbnVsbCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgcG9zc2libGVUZWNobm9sb2dpZXMgPSBnZXRMaXN0T2ZQb3NzaWJsZVRlY2hub2xvZ2llc0J5Rmlyc3RNYXRjaGVkQ29kZShzZXF1ZW5jZSwgcG9zc2libGVTeW50aGVzaXplcnNbMF0pO1xuICAgIC8vIGlmIChwb3NzaWJsZVRlY2hub2xvZ2llcy5sZW5ndGggPiAxKSB7XG4gICAgLy8gICBjb25zdCB0ZWNobm9sb2d5ID0gdWkuY2hvaWNlSW5wdXQoJ0Nob29zZSB0ZWNobm9sb2d5IGZyb20gbGlzdDogJywgcG9zc2libGVUZWNobm9sb2dpZXNbMF0sXG4gICAgLy8gcG9zc2libGVUZWNobm9sb2dpZXMpO1xuICAgIC8vICAgdWkuZGlhbG9nKCdDaG9vc2UgVGVjaG5vbG9neScpXG4gICAgLy8gICAgIC5hZGQodWkucGFuZWwoW3RlY2hub2xvZ3kucm9vdF0sIHtzdHlsZToge2ZvbnRXZWlnaHQ6ICdib2xkJ319KSlcbiAgICAvLyAgICAgLm9uT0soKCkgPT4gcG9zc2libGVUZWNobm9sb2dpZXMgPSBbdGVjaG5vbG9neS52YWx1ZV0pXG4gICAgLy8gICAgIC5vbkNhbmNlbCgoKSA9PiB7XG4gICAgLy8gICAgICAgcG9zc2libGVUZWNobm9sb2dpZXMgPSBbcG9zc2libGVUZWNobm9sb2dpZXNbMF1dO1xuICAgIC8vICAgICAgIGdyb2suc2hlbGwud2FybmluZygnSW5wdXQgc2VxdWVuY2UgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gZm9ybWF0ICcgKyBwb3NzaWJsZVRlY2hub2xvZ2llc1swXSk7XG4gICAgLy8gICAgIH0pXG4gICAgLy8gICAgIC5zaG93KCk7XG4gICAgLy8gfSBlbHNlIGlmIChwb3NzaWJsZVRlY2hub2xvZ2llcy5sZW5ndGggPT0gMClcbiAgICBpZiAocG9zc2libGVUZWNobm9sb2dpZXMubGVuZ3RoID09IDApXG4gICAgICAgIHJldHVybiB7IGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhcjogMCwgc3ludGhlc2l6ZXI6IG51bGwsIHRlY2hub2xvZ3k6IG51bGwgfTtcbiAgICBvdXRwdXRJbmRleCA9IDA7XG4gICAgcG9zc2libGVUZWNobm9sb2dpZXMuZm9yRWFjaCgodGVjaG5vbG9neSkgPT4ge1xuICAgICAgICBjb25zdCBjb2RlcyA9IE9iamVjdC5rZXlzKG1hcFtwb3NzaWJsZVN5bnRoZXNpemVyc1swXV1bdGVjaG5vbG9neV0pO1xuICAgICAgICB3aGlsZSAob3V0cHV0SW5kZXggPCBzZXF1ZW5jZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZWRDb2RlID0gY29kZXMuZmluZCgoYykgPT4gYyA9PSBzZXF1ZW5jZS5zbGljZShvdXRwdXRJbmRleCwgb3V0cHV0SW5kZXggKyBjLmxlbmd0aCkpO1xuICAgICAgICAgICAgaWYgKG1hdGNoZWRDb2RlID09IG51bGwpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBpZiAoIC8vIGZvciBtaXN0YWtlIHBhdHRlcm4gJ3JBQSdcbiAgICAgICAgICAgIG91dHB1dEluZGV4ID4gMSAmJlxuICAgICAgICAgICAgICAgIG51Y2xlb3RpZGVzLmluY2x1ZGVzKHNlcXVlbmNlW291dHB1dEluZGV4XSkgJiZcbiAgICAgICAgICAgICAgICBmaXJzdFVuaXF1ZUNoYXJhY3RlcnMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kZXggLSAyXSkpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBpZiAoIC8vIGZvciBtaXN0YWtlIHBhdHRlcm4gJ0FyQSdcbiAgICAgICAgICAgIGZpcnN0VW5pcXVlQ2hhcmFjdGVycy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRleCArIDFdKSAmJlxuICAgICAgICAgICAgICAgIG51Y2xlb3RpZGVzLmluY2x1ZGVzKHNlcXVlbmNlW291dHB1dEluZGV4XSkpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRJbmRleCsrO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0cHV0SW5kZXggKz0gbWF0Y2hlZENvZGUubGVuZ3RoO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyOiBpbmRleE9mRmlyc3ROb3RWYWxpZENoYXIsXG4gICAgICAgIHN5bnRoZXNpemVyOiBwb3NzaWJsZVN5bnRoZXNpemVycyxcbiAgICAgICAgdGVjaG5vbG9neTogW3Bvc3NpYmxlVGVjaG5vbG9naWVzW291dHB1dEluZGV4XV0sXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGdldEFsbENvZGVzT2ZTeW50aGVzaXplcihzeW50aGVzaXplcikge1xuICAgIGxldCBjb2RlcyA9IFtdO1xuICAgIGZvciAoY29uc3QgdGVjaG5vbG9neSBvZiBPYmplY3Qua2V5cyhtYXBbc3ludGhlc2l6ZXJdKSlcbiAgICAgICAgY29kZXMgPSBjb2Rlcy5jb25jYXQoT2JqZWN0LmtleXMobWFwW3N5bnRoZXNpemVyXVt0ZWNobm9sb2d5XSkpO1xuICAgIHJldHVybiBjb2Rlcy5jb25jYXQoT2JqZWN0LmtleXMoTU9ESUZJQ0FUSU9OUykpO1xufVxuZnVuY3Rpb24gZ2V0TGlzdE9mUG9zc2libGVTeW50aGVzaXplcnNCeUZpcnN0TWF0Y2hlZENvZGUoc2VxdWVuY2UpIHtcbiAgICBjb25zdCBzeW50aGVzaXplcnMgPSBbXTtcbiAgICBPYmplY3Qua2V5cyhtYXApLmZvckVhY2goKHN5bnRoZXNpemVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvZGVzID0gZ2V0QWxsQ29kZXNPZlN5bnRoZXNpemVyKHN5bnRoZXNpemVyKTtcbiAgICAgICAgLy9UT0RPOiBnZXQgZmlyc3Qgbm9uLWRyb3Bkb3duIGNvZGUgd2hlbiB0aGVyZSBhcmUgdHdvIG1vZGlmaWNhdGlvbnNcbiAgICAgICAgbGV0IHN0YXJ0ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXF1ZW5jZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHNlcXVlbmNlW2ldID09ICcpJyAmJiBpICE9IHNlcXVlbmNlLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb2Rlcy5zb21lKChzKSA9PiBzID09IHNlcXVlbmNlLnNsaWNlKHN0YXJ0LCBzdGFydCArIHMubGVuZ3RoKSkpXG4gICAgICAgICAgICBzeW50aGVzaXplcnMucHVzaChzeW50aGVzaXplcik7XG4gICAgfSk7XG4gICAgcmV0dXJuIHN5bnRoZXNpemVycztcbn1cbmZ1bmN0aW9uIGdldExpc3RPZlBvc3NpYmxlVGVjaG5vbG9naWVzQnlGaXJzdE1hdGNoZWRDb2RlKHNlcXVlbmNlLCBzeW50aGVzaXplcikge1xuICAgIGNvbnN0IHRlY2hub2xvZ2llcyA9IFtdO1xuICAgIE9iamVjdC5rZXlzKG1hcFtzeW50aGVzaXplcl0pLmZvckVhY2goKHRlY2hub2xvZ3kpID0+IHtcbiAgICAgICAgY29uc3QgY29kZXMgPSBPYmplY3Qua2V5cyhtYXBbc3ludGhlc2l6ZXJdW3RlY2hub2xvZ3ldKS5jb25jYXQoT2JqZWN0LmtleXMoTU9ESUZJQ0FUSU9OUykpO1xuICAgICAgICBpZiAoY29kZXMuc29tZSgocykgPT4gcyA9PSBzZXF1ZW5jZS5zbGljZSgwLCBzLmxlbmd0aCkpKVxuICAgICAgICAgICAgdGVjaG5vbG9naWVzLnB1c2godGVjaG5vbG9neSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRlY2hub2xvZ2llcztcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0U2VxdWVuY2Uoc2VxdWVuY2UsIG91dHB1dCkge1xuICAgIGlmIChvdXRwdXQuaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyICE9IC0xKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAvLyB0eXBlOiAnJyxcbiAgICAgICAgICAgIGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhcjogSlNPTi5zdHJpbmdpZnkob3V0cHV0KSxcbiAgICAgICAgICAgIEVycm9yOiB1bmRlZmluZWRJbnB1dFNlcXVlbmNlLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyLmluY2x1ZGVzKFNZTlRIRVNJWkVSUy5SQVdfTlVDTEVPVElERVMpKSB7IC8vJiYgb3V0cHV0LnRlY2hub2xvZ3khLmluY2x1ZGVzKFRFQ0hOT0xPR0lFUy5ETkEpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBTWU5USEVTSVpFUlMuUkFXX05VQ0xFT1RJREVTLFxuICAgICAgICAgICAgTnVjbGVvdGlkZXM6IHNlcXVlbmNlLFxuICAgICAgICAgICAgQmlvU3ByaW5nOiBhc29HYXBtZXJzTnVjbGVvdGlkZXNUb0Jpb1NwcmluZyhzZXF1ZW5jZSksXG4gICAgICAgICAgICBHQ1JTOiBhc29HYXBtZXJzTnVjbGVvdGlkZXNUb0djcnMoc2VxdWVuY2UpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyLmluY2x1ZGVzKFNZTlRIRVNJWkVSUy5CSU9TUFJJTkcpICYmIG91dHB1dC50ZWNobm9sb2d5LmluY2x1ZGVzKFRFQ0hOT0xPR0lFUy5BU09fR0FQTUVSUykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFNZTlRIRVNJWkVSUy5CSU9TUFJJTkcgKyAnICcgKyBURUNITk9MT0dJRVMuQVNPX0dBUE1FUlMsXG4gICAgICAgICAgICBOdWNsZW90aWRlczogYXNvR2FwbWVyc0Jpb1NwcmluZ1RvTnVjbGVvdGlkZXMoc2VxdWVuY2UpLFxuICAgICAgICAgICAgQmlvU3ByaW5nOiBzZXF1ZW5jZSxcbiAgICAgICAgICAgIEdDUlM6IGFzb0dhcG1lcnNCaW9TcHJpbmdUb0djcnMoc2VxdWVuY2UpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyLmluY2x1ZGVzKFNZTlRIRVNJWkVSUy5HQ1JTKSAmJiBvdXRwdXQudGVjaG5vbG9neS5pbmNsdWRlcyhURUNITk9MT0dJRVMuQVNPX0dBUE1FUlMpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBTWU5USEVTSVpFUlMuR0NSUyArICcgJyArIFRFQ0hOT0xPR0lFUy5BU09fR0FQTUVSUyxcbiAgICAgICAgICAgIE51Y2xlb3RpZGVzOiBhc29HYXBtZXJzR2Nyc1RvTnVjbGVvdGlkZXMoc2VxdWVuY2UpLFxuICAgICAgICAgICAgQmlvU3ByaW5nOiBhc29HYXBtZXJzR2Nyc1RvQmlvU3ByaW5nKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIE1lcm1hZGUxMjogZ2Nyc1RvTWVybWFkZTEyKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEdDUlM6IHNlcXVlbmNlLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyLmluY2x1ZGVzKFNZTlRIRVNJWkVSUy5SQVdfTlVDTEVPVElERVMpICYmIG91dHB1dC50ZWNobm9sb2d5LmluY2x1ZGVzKFRFQ0hOT0xPR0lFUy5STkEpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBTWU5USEVTSVpFUlMuUkFXX05VQ0xFT1RJREVTICsgJyAnICsgVEVDSE5PTE9HSUVTLlJOQSxcbiAgICAgICAgICAgIE51Y2xlb3RpZGVzOiBzZXF1ZW5jZSxcbiAgICAgICAgICAgIEJpb1NwcmluZzogc2lSbmFOdWNsZW90aWRlVG9CaW9TcHJpbmdTZW5zZVN0cmFuZChzZXF1ZW5jZSksXG4gICAgICAgICAgICBBeG9sYWJzOiBzaVJuYU51Y2xlb3RpZGVUb0F4b2xhYnNTZW5zZVN0cmFuZChzZXF1ZW5jZSksXG4gICAgICAgICAgICBHQ1JTOiBzaVJuYU51Y2xlb3RpZGVzVG9HY3JzKHNlcXVlbmNlKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG91dHB1dC5zeW50aGVzaXplci5pbmNsdWRlcyhTWU5USEVTSVpFUlMuQklPU1BSSU5HKSAmJiBvdXRwdXQudGVjaG5vbG9neS5pbmNsdWRlcyhURUNITk9MT0dJRVMuU0lfUk5BKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogU1lOVEhFU0laRVJTLkJJT1NQUklORyArICcgJyArIFRFQ0hOT0xPR0lFUy5TSV9STkEsXG4gICAgICAgICAgICBOdWNsZW90aWRlczogc2lSbmFCaW9TcHJpbmdUb051Y2xlb3RpZGVzKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEJpb1NwcmluZzogc2VxdWVuY2UsXG4gICAgICAgICAgICBBeG9sYWJzOiBzaVJuYUJpb1NwcmluZ1RvQXhvbGFicyhzZXF1ZW5jZSksXG4gICAgICAgICAgICBHQ1JTOiBzaVJuYUJpb1NwcmluZ1RvR2NycyhzZXF1ZW5jZSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChvdXRwdXQuc3ludGhlc2l6ZXIuaW5jbHVkZXMoU1lOVEhFU0laRVJTLkFYT0xBQlMpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBTWU5USEVTSVpFUlMuQVhPTEFCUyArICcgJyArIFRFQ0hOT0xPR0lFUy5TSV9STkEsXG4gICAgICAgICAgICBOdWNsZW90aWRlczogc2lSbmFBeG9sYWJzVG9OdWNsZW90aWRlcyhzZXF1ZW5jZSksXG4gICAgICAgICAgICBCaW9TcHJpbmc6IHNpUm5hQXhvbGFic1RvQmlvU3ByaW5nKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEF4b2xhYnM6IHNlcXVlbmNlLFxuICAgICAgICAgICAgR0NSUzogc2lSbmFBeG9sYWJzVG9HY3JzKHNlcXVlbmNlKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG91dHB1dC5zeW50aGVzaXplci5pbmNsdWRlcyhTWU5USEVTSVpFUlMuR0NSUykgJiYgb3V0cHV0LnRlY2hub2xvZ3kuaW5jbHVkZXMoVEVDSE5PTE9HSUVTLlNJX1JOQSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFNZTlRIRVNJWkVSUy5HQ1JTICsgJyAnICsgVEVDSE5PTE9HSUVTLlNJX1JOQSxcbiAgICAgICAgICAgIE51Y2xlb3RpZGVzOiBzaVJuYUdjcnNUb051Y2xlb3RpZGVzKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEJpb1NwcmluZzogc2lSbmFHY3JzVG9CaW9TcHJpbmcoc2VxdWVuY2UpLFxuICAgICAgICAgICAgQXhvbGFiczogc2lSbmFHY3JzVG9BeG9sYWJzKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIE1NMTI6IGdjcnNUb01lcm1hZGUxMihzZXF1ZW5jZSksXG4gICAgICAgICAgICBHQ1JTOiBzZXF1ZW5jZSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG91dHB1dC5zeW50aGVzaXplci5pbmNsdWRlcyhTWU5USEVTSVpFUlMuR0NSUykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFNZTlRIRVNJWkVSUy5HQ1JTLFxuICAgICAgICAgICAgTnVjbGVvdGlkZXM6IGdjcnNUb051Y2xlb3RpZGVzKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEdDUlM6IHNlcXVlbmNlLFxuICAgICAgICAgICAgTWVybWFkZTEyOiBnY3JzVG9NZXJtYWRlMTIoc2VxdWVuY2UpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyLmluY2x1ZGVzKFNZTlRIRVNJWkVSUy5NRVJNQURFXzEyKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogU1lOVEhFU0laRVJTLk1FUk1BREVfMTIsXG4gICAgICAgICAgICBOdWNsZW90aWRlczogbm9UcmFuc2xhdGlvblRhYmxlQXZhaWxhYmxlLFxuICAgICAgICAgICAgR0NSUzogbm9UcmFuc2xhdGlvblRhYmxlQXZhaWxhYmxlLFxuICAgICAgICAgICAgTWVybWFkZTEyOiBzZXF1ZW5jZSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogdW5kZWZpbmVkSW5wdXRTZXF1ZW5jZSxcbiAgICAgICAgTnVjbGVvdGlkZXM6IHVuZGVmaW5lZElucHV0U2VxdWVuY2UsXG4gICAgfTtcbn1cbiIsImV4cG9ydCBjb25zdCBVU0VSU19DU1YgPSBgRElTUExBWVxuTk8gREFUQVxuYDtcbiIsIm1vZHVsZS5leHBvcnRzID0gREc7IiwibW9kdWxlLmV4cG9ydHMgPSBPQ0w7IiwibW9kdWxlLmV4cG9ydHMgPSBncm9rOyIsIm1vZHVsZS5leHBvcnRzID0gdWk7IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuLyogRG8gbm90IGNoYW5nZSB0aGVzZSBpbXBvcnQgbGluZXMuIERhdGFncm9rIHdpbGwgaW1wb3J0IEFQSSBsaWJyYXJ5IGluIGV4YWN0bHkgdGhlIHNhbWUgbWFubmVyICovXG5pbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuaW1wb3J0ICogYXMgT0NMIGZyb20gJ29wZW5jaGVtbGliL2Z1bGwuanMnO1xuaW1wb3J0ICQgZnJvbSAnY2FzaC1kb20nO1xuaW1wb3J0IHsgZGVmaW5lQXhvbGFic1BhdHRlcm4gfSBmcm9tICcuL2RlZmluZUF4b2xhYnNQYXR0ZXJuJztcbmltcG9ydCB7IHNhdmVTZW5zZUFudGlTZW5zZSB9IGZyb20gJy4vc3RydWN0dXJlcy13b3Jrcy9zYXZlLXNlbnNlLWFudGlzZW5zZSc7XG5pbXBvcnQgeyBzZXF1ZW5jZVRvU21pbGVzLCBzZXF1ZW5jZVRvTW9sVjMwMDAgfSBmcm9tICcuL3N0cnVjdHVyZXMtd29ya3MvZnJvbS1tb25vbWVycyc7XG5pbXBvcnQgeyBjb252ZXJ0U2VxdWVuY2UsIHVuZGVmaW5lZElucHV0U2VxdWVuY2UsIGlzVmFsaWRTZXF1ZW5jZSwgZ2V0Rm9ybWF0IH0gZnJvbSAnLi9zdHJ1Y3R1cmVzLXdvcmtzL3NlcXVlbmNlLWNvZGVzLXRvb2xzJztcbmltcG9ydCB7IG1hcCwgQ09MX05BTUVTLCBNT0RJRklDQVRJT05TIH0gZnJvbSAnLi9zdHJ1Y3R1cmVzLXdvcmtzL21hcCc7XG5pbXBvcnQgeyBTQUxUU19DU1YgfSBmcm9tICcuL3NhbHRzJztcbmltcG9ydCB7IFVTRVJTX0NTViB9IGZyb20gJy4vdXNlcnMnO1xuaW1wb3J0IHsgSUNEUyB9IGZyb20gJy4vSUNEcyc7XG5pbXBvcnQgeyBTT1VSQ0VTIH0gZnJvbSAnLi9zb3VyY2VzJztcbmltcG9ydCB7IElEUFMgfSBmcm9tICcuL0lEUHMnO1xuZXhwb3J0IGNvbnN0IF9wYWNrYWdlID0gbmV3IERHLlBhY2thZ2UoKTtcbmNvbnN0IGRlZmF1bHRJbnB1dCA9ICdmQW1DbUdtQW1DcHNtVSc7XG5jb25zdCBzZXF1ZW5jZVdhc0NvcGllZCA9ICdDb3BpZWQnO1xuY29uc3QgdG9vbHRpcFNlcXVlbmNlID0gJ0NvcHkgc2VxdWVuY2UnO1xuLy9uYW1lOiBTZXF1ZW5jZSBUcmFuc2xhdG9yXG4vL3RhZ3M6IGFwcFxuZXhwb3J0IGZ1bmN0aW9uIHNlcXVlbmNlVHJhbnNsYXRvcigpIHtcbiAgICBjb25zdCB3aW5kb3dzID0gZ3Jvay5zaGVsbC53aW5kb3dzO1xuICAgIHdpbmRvd3Muc2hvd1Byb3BlcnRpZXMgPSBmYWxzZTtcbiAgICB3aW5kb3dzLnNob3dUb29sYm94ID0gZmFsc2U7XG4gICAgd2luZG93cy5zaG93SGVscCA9IGZhbHNlO1xuICAgIGZ1bmN0aW9uIHVwZGF0ZVRhYmxlQW5kTW9sZWN1bGUoc2VxdWVuY2UsIGlucHV0Rm9ybWF0LCBpc1NldCkge1xuICAgICAgICBtb2xlY3VsZVN2Z0Rpdi5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgb3V0cHV0VGFibGVEaXYuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIGNvbnN0IHBpID0gREcuVGFza0JhclByb2dyZXNzSW5kaWNhdG9yLmNyZWF0ZSgnUmVuZGVyaW5nIHRhYmxlIGFuZCBtb2xlY3VsZS4uLicpO1xuICAgICAgICBsZXQgZXJyb3JzRXhpc3QgPSBmYWxzZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHNlcXVlbmNlID0gc2VxdWVuY2UucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IGlzVmFsaWRTZXF1ZW5jZShzZXF1ZW5jZSwgbnVsbCk7XG4gICAgICAgICAgICBpZiAoaXNTZXQpXG4gICAgICAgICAgICAgICAgb3V0cHV0LnN5bnRoZXNpemVyID0gW2lucHV0Rm9ybWF0XTtcbiAgICAgICAgICAgIGlucHV0Rm9ybWF0Q2hvaWNlSW5wdXQudmFsdWUgPSBvdXRwdXQuc3ludGhlc2l6ZXJbMF07XG4gICAgICAgICAgICBjb25zdCBvdXRwdXRTZXF1ZW5jZU9iaiA9IGNvbnZlcnRTZXF1ZW5jZShzZXF1ZW5jZSwgb3V0cHV0KTtcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlUm93cyA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob3V0cHV0U2VxdWVuY2VPYmopLnNsaWNlKDEpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyID0gKCdpbmRleE9mRmlyc3ROb3RWYWxpZENoYXInIGluIG91dHB1dFNlcXVlbmNlT2JqKSA/XG4gICAgICAgICAgICAgICAgICAgIEpTT04ucGFyc2Uob3V0cHV0U2VxdWVuY2VPYmouaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyKS5pbmRleE9mRmlyc3ROb3RWYWxpZENoYXIgOlxuICAgICAgICAgICAgICAgICAgICAtMTtcbiAgICAgICAgICAgICAgICBpZiAoJ2luZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhcicgaW4gb3V0cHV0U2VxdWVuY2VPYmopIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyID0gKCdpbmRleE9mRmlyc3ROb3RWYWxpZENoYXInIGluIG91dHB1dFNlcXVlbmNlT2JqKSA/XG4gICAgICAgICAgICAgICAgICAgICAgICBKU09OLnBhcnNlKG91dHB1dFNlcXVlbmNlT2JqLmluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhcikuaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIC0xO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyICE9IC0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzRXhpc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0YWJsZVJvd3MucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICdrZXknOiBrZXksXG4gICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICgnaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyJyBpbiBvdXRwdXRTZXF1ZW5jZU9iaikgP1xuICAgICAgICAgICAgICAgICAgICAgICAgdWkuZGl2SChbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWkuZGl2VGV4dChzZXF1ZW5jZS5zbGljZSgwLCBpbmRleE9mRmlyc3ROb3RWYWxpZENoYXIpLCB7IHN0eWxlOiB7IGNvbG9yOiAnZ3JleScgfSB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aS50b29sdGlwLmJpbmQodWkuZGl2VGV4dChzZXF1ZW5jZS5zbGljZShpbmRleE9mRmlyc3ROb3RWYWxpZENoYXIpLCB7IHN0eWxlOiB7IGNvbG9yOiAncmVkJyB9IH0pLCAnRXhwZWN0ZWQgZm9ybWF0OiAnICsgSlNPTi5wYXJzZShvdXRwdXRTZXF1ZW5jZU9iai5pbmRleE9mRmlyc3ROb3RWYWxpZENoYXIpLnN5bnRoZXNpemVyICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy4gU2VlIHRhYmxlcyB3aXRoIHZhbGlkIGNvZGVzIG9uIHRoZSByaWdodCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgXSkgOiAvL0B0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHVpLmxpbmsob3V0cHV0U2VxdWVuY2VPYmpba2V5XSwgKCkgPT4gbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQob3V0cHV0U2VxdWVuY2VPYmpba2V5XSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiBncm9rLnNoZWxsLmluZm8oc2VxdWVuY2VXYXNDb3BpZWQpKSwgdG9vbHRpcFNlcXVlbmNlLCAnJyksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJyb3JzRXhpc3QpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzeW50aGVzaXplciA9IEpTT04ucGFyc2Uob3V0cHV0U2VxdWVuY2VPYmouaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyKS5zeW50aGVzaXplci5zbGljZSgwLCAtNik7XG4gICAgICAgICAgICAgICAgYXNvR2FwbWVyc0dyaWQub25DZWxsUHJlcGFyZShmdW5jdGlvbiAoZ2MpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2Muc3R5bGUuYmFja0NvbG9yID0gKGdjLmdyaWRDb2x1bW4ubmFtZSA9PSBzeW50aGVzaXplcikgPyAweEZGRjAwMDAwIDogMHhGRkZGRkZGRjtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBvbWVBbmRGbHVvcm9HcmlkLm9uQ2VsbFByZXBhcmUoZnVuY3Rpb24gKGdjKSB7XG4gICAgICAgICAgICAgICAgICAgIGdjLnN0eWxlLmJhY2tDb2xvciA9IChnYy5ncmlkQ29sdW1uLm5hbWUgPT0gc3ludGhlc2l6ZXIpID8gMHhGRkYwMDAwMCA6IDB4RkZGRkZGRkY7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc3dpdGNoSW5wdXQuZW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhc29HYXBtZXJzR3JpZC5vbkNlbGxQcmVwYXJlKGZ1bmN0aW9uIChnYykgeyBnYy5zdHlsZS5iYWNrQ29sb3IgPSAweEZGRkZGRkZGOyB9KTtcbiAgICAgICAgICAgICAgICBvbWVBbmRGbHVvcm9HcmlkLm9uQ2VsbFByZXBhcmUoZnVuY3Rpb24gKGdjKSB7IGdjLnN0eWxlLmJhY2tDb2xvciA9IDB4RkZGRkZGRkY7IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0cHV0VGFibGVEaXYuYXBwZW5kKHVpLmRpdihbXG4gICAgICAgICAgICAgICAgREcuSHRtbFRhYmxlLmNyZWF0ZSh0YWJsZVJvd3MsIChpdGVtKSA9PiBbaXRlbS5rZXksIGl0ZW0udmFsdWVdLCBbJ0NvZGUnLCAnU2VxdWVuY2UnXSkucm9vdCxcbiAgICAgICAgICAgIF0pKTtcbiAgICAgICAgICAgIGlmIChvdXRwdXRTZXF1ZW5jZU9iai50eXBlICE9IHVuZGVmaW5lZElucHV0U2VxdWVuY2UgJiYgb3V0cHV0U2VxdWVuY2VPYmouRXJyb3IgIT0gdW5kZWZpbmVkSW5wdXRTZXF1ZW5jZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbnZhcyA9IHVpLmNhbnZhcygzMDAsIDE3MCk7XG4gICAgICAgICAgICAgICAgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW52ID0gdWkuY2FudmFzKCQod2luZG93KS53aWR0aCgpLCAkKHdpbmRvdykuaGVpZ2h0KCkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtb2wgPSBzZXF1ZW5jZVRvTW9sVjMwMDAoaW5wdXRTZXF1ZW5jZUZpZWxkLnZhbHVlLnJlcGxhY2UoL1xccy9nLCAnJyksIGZhbHNlLCB0cnVlLCBvdXRwdXQuc3ludGhlc2l6ZXJbMF0pO1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIE9DTC5TdHJ1Y3R1cmVWaWV3LmRyYXdNb2xlY3VsZShjYW52LCBPQ0wuTW9sZWN1bGUuZnJvbU1vbGZpbGUobW9sKSwgeyBzdXBwcmVzc0NoaXJhbFRleHQ6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgICAgIHVpLmRpYWxvZygnTW9sZWN1bGU6ICcgKyBpbnB1dFNlcXVlbmNlRmllbGQudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYWRkKGNhbnYpXG4gICAgICAgICAgICAgICAgICAgICAgICAuc2hvd01vZGFsKHRydWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICQoY2FudmFzKS5vbignbW91c2VvdmVyJywgKCkgPT4gJChjYW52YXMpLmNzcygnY3Vyc29yJywgJ3pvb20taW4nKSk7XG4gICAgICAgICAgICAgICAgJChjYW52YXMpLm9uKCdtb3VzZW91dCcsICgpID0+ICQoY2FudmFzKS5jc3MoJ2N1cnNvcicsICdkZWZhdWx0JykpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1vbCA9IHNlcXVlbmNlVG9Nb2xWMzAwMChpbnB1dFNlcXVlbmNlRmllbGQudmFsdWUucmVwbGFjZSgvXFxzL2csICcnKSwgZmFsc2UsIHRydWUsIG91dHB1dC5zeW50aGVzaXplclswXSk7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIE9DTC5TdHJ1Y3R1cmVWaWV3LmRyYXdNb2xlY3VsZShjYW52YXMsIE9DTC5Nb2xlY3VsZS5mcm9tTW9sZmlsZShtb2wpLCB7IHN1cHByZXNzQ2hpcmFsVGV4dDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICBtb2xlY3VsZVN2Z0Rpdi5hcHBlbmQoY2FudmFzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBtb2xlY3VsZVN2Z0Rpdi5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHBpLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaW5wdXRGb3JtYXRDaG9pY2VJbnB1dCA9IHVpLmNob2ljZUlucHV0KCdJbnB1dCBmb3JtYXQ6ICcsICdKYW5zc2VuIEdDUlMgQ29kZXMnLCBPYmplY3Qua2V5cyhtYXApLCAoZm9ybWF0KSA9PiB7XG4gICAgICAgIHVwZGF0ZVRhYmxlQW5kTW9sZWN1bGUoaW5wdXRTZXF1ZW5jZUZpZWxkLnZhbHVlLnJlcGxhY2UoL1xccy9nLCAnJyksIGZvcm1hdCwgdHJ1ZSk7XG4gICAgfSk7XG4gICAgY29uc3QgbW9sZWN1bGVTdmdEaXYgPSB1aS5ibG9jayhbXSk7XG4gICAgY29uc3Qgb3V0cHV0VGFibGVEaXYgPSB1aS5kaXYoW10pO1xuICAgIGNvbnN0IGlucHV0U2VxdWVuY2VGaWVsZCA9IHVpLnRleHRJbnB1dCgnJywgZGVmYXVsdElucHV0LCAoc2VxdWVuY2UpID0+IHVwZGF0ZVRhYmxlQW5kTW9sZWN1bGUoc2VxdWVuY2UsIGlucHV0Rm9ybWF0Q2hvaWNlSW5wdXQudmFsdWUsIGZhbHNlKSk7XG4gICAgY29uc3QgYXNvRGYgPSBERy5EYXRhRnJhbWUuZnJvbU9iamVjdHMoW1xuICAgICAgICB7ICdOYW1lJzogJzJcXCdNT0UtNU1lLXJVJywgJ0Jpb1NwcmluZyc6ICc1JywgJ0phbnNzZW4gR0NSUyc6ICdtb2VUJyB9LFxuICAgICAgICB7ICdOYW1lJzogJzJcXCdNT0UtckEnLCAnQmlvU3ByaW5nJzogJzYnLCAnSmFuc3NlbiBHQ1JTJzogJ21vZUEnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnMlxcJ01PRS01TWUtckMnLCAnQmlvU3ByaW5nJzogJzcnLCAnSmFuc3NlbiBHQ1JTJzogJ21vZTVtQycgfSxcbiAgICAgICAgeyAnTmFtZSc6ICcyXFwnTU9FLXJHJywgJ0Jpb1NwcmluZyc6ICc4JywgJ0phbnNzZW4gR0NSUyc6ICdtb2VHJyB9LFxuICAgICAgICB7ICdOYW1lJzogJzUtTWV0aHlsLWRDJywgJ0Jpb1NwcmluZyc6ICc5JywgJ0phbnNzZW4gR0NSUyc6ICc1bUMnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAncHMgbGlua2FnZScsICdCaW9TcHJpbmcnOiAnKicsICdKYW5zc2VuIEdDUlMnOiAncHMnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnZEEnLCAnQmlvU3ByaW5nJzogJ0EnLCAnSmFuc3NlbiBHQ1JTJzogJ0EsIGRBJyB9LFxuICAgICAgICB7ICdOYW1lJzogJ2RDJywgJ0Jpb1NwcmluZyc6ICdDJywgJ0phbnNzZW4gR0NSUyc6ICdDLCBkQycgfSxcbiAgICAgICAgeyAnTmFtZSc6ICdkRycsICdCaW9TcHJpbmcnOiAnRycsICdKYW5zc2VuIEdDUlMnOiAnRywgZEcnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnZFQnLCAnQmlvU3ByaW5nJzogJ1QnLCAnSmFuc3NlbiBHQ1JTJzogJ1QsIGRUJyB9LFxuICAgICAgICB7ICdOYW1lJzogJ3JBJywgJ0Jpb1NwcmluZyc6ICcnLCAnSmFuc3NlbiBHQ1JTJzogJ3JBJyB9LFxuICAgICAgICB7ICdOYW1lJzogJ3JDJywgJ0Jpb1NwcmluZyc6ICcnLCAnSmFuc3NlbiBHQ1JTJzogJ3JDJyB9LFxuICAgICAgICB7ICdOYW1lJzogJ3JHJywgJ0Jpb1NwcmluZyc6ICcnLCAnSmFuc3NlbiBHQ1JTJzogJ3JHJyB9LFxuICAgICAgICB7ICdOYW1lJzogJ3JVJywgJ0Jpb1NwcmluZyc6ICcnLCAnSmFuc3NlbiBHQ1JTJzogJ3JVJyB9LFxuICAgIF0pO1xuICAgIGNvbnN0IGFzb0dhcG1lcnNHcmlkID0gREcuVmlld2VyLmdyaWQoYXNvRGYsIHsgc2hvd1Jvd0hlYWRlcjogZmFsc2UsIHNob3dDZWxsVG9vbHRpcDogZmFsc2UgfSk7XG4gICAgYXNvRGYub25DdXJyZW50Q2VsbENoYW5nZWQuc3Vic2NyaWJlKChfKSA9PiB7XG4gICAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGFzb0RmLmN1cnJlbnRDZWxsLnZhbHVlKS50aGVuKCgpID0+IGdyb2suc2hlbGwuaW5mbygnQ29waWVkJykpO1xuICAgIH0pO1xuICAgIGNvbnN0IG9tZUFuZEZsdW9yb0dyaWQgPSBERy5WaWV3ZXIuZ3JpZChERy5EYXRhRnJhbWUuZnJvbU9iamVjdHMoW1xuICAgICAgICB7ICdOYW1lJzogJzJcXCctZmx1b3JvLVUnLCAnQmlvU3ByaW5nJzogJzEnLCAnQXhvbGFicyc6ICdVZicsICdKYW5zc2VuIEdDUlMnOiAnZlUnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnMlxcJy1mbHVvcm8tQScsICdCaW9TcHJpbmcnOiAnMicsICdBeG9sYWJzJzogJ0FmJywgJ0phbnNzZW4gR0NSUyc6ICdmQScgfSxcbiAgICAgICAgeyAnTmFtZSc6ICcyXFwnLWZsdW9yby1DJywgJ0Jpb1NwcmluZyc6ICczJywgJ0F4b2xhYnMnOiAnQ2YnLCAnSmFuc3NlbiBHQ1JTJzogJ2ZDJyB9LFxuICAgICAgICB7ICdOYW1lJzogJzJcXCctZmx1b3JvLUcnLCAnQmlvU3ByaW5nJzogJzQnLCAnQXhvbGFicyc6ICdHZicsICdKYW5zc2VuIEdDUlMnOiAnZkcnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnMlxcJ09NZS1yVScsICdCaW9TcHJpbmcnOiAnNScsICdBeG9sYWJzJzogJ3UnLCAnSmFuc3NlbiBHQ1JTJzogJ21VJyB9LFxuICAgICAgICB7ICdOYW1lJzogJzJcXCdPTWUtckEnLCAnQmlvU3ByaW5nJzogJzYnLCAnQXhvbGFicyc6ICdhJywgJ0phbnNzZW4gR0NSUyc6ICdtQScgfSxcbiAgICAgICAgeyAnTmFtZSc6ICcyXFwnT01lLXJDJywgJ0Jpb1NwcmluZyc6ICc3JywgJ0F4b2xhYnMnOiAnYycsICdKYW5zc2VuIEdDUlMnOiAnbUMnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnMlxcJ09NZS1yRycsICdCaW9TcHJpbmcnOiAnOCcsICdBeG9sYWJzJzogJ2cnLCAnSmFuc3NlbiBHQ1JTJzogJ21HJyB9LFxuICAgICAgICB7ICdOYW1lJzogJ3BzIGxpbmthZ2UnLCAnQmlvU3ByaW5nJzogJyonLCAnQXhvbGFicyc6ICdzJywgJ0phbnNzZW4gR0NSUyc6ICdwcycgfSxcbiAgICBdKSwgeyBzaG93Um93SGVhZGVyOiBmYWxzZSwgc2hvd0NlbGxUb29sdGlwOiBmYWxzZSB9KTtcbiAgICBjb25zdCBvdmVyaGFuZ01vZGlmaWNhdGlvbnNHcmlkID0gREcuVmlld2VyLmdyaWQoREcuRGF0YUZyYW1lLmZyb21Db2x1bW5zKFtcbiAgICAgICAgREcuQ29sdW1uLmZyb21TdHJpbmdzKCdOYW1lJywgT2JqZWN0LmtleXMoTU9ESUZJQ0FUSU9OUykpLFxuICAgIF0pLCB7IHNob3dSb3dIZWFkZXI6IGZhbHNlLCBzaG93Q2VsbFRvb2x0aXA6IGZhbHNlIH0pO1xuICAgIHVwZGF0ZVRhYmxlQW5kTW9sZWN1bGUoZGVmYXVsdElucHV0LCBpbnB1dEZvcm1hdENob2ljZUlucHV0LnZhbHVlLCB0cnVlKTtcbiAgICBjb25zdCBhcHBNYWluRGVzY3JpcHRpb24gPSB1aS5pbmZvKFtcbiAgICAgICAgdWkuZGl2VGV4dCgnSG93IHRvIGNvbnZlcnQgb25lIHNlcXVlbmNlOicsIHsgc3R5bGU6IHsgJ2ZvbnQtd2VpZ2h0JzogJ2JvbGRlcicgfSB9KSxcbiAgICAgICAgdWkuZGl2VGV4dCgnUGFzdGUgc2VxdWVuY2UgaW50byB0aGUgdGV4dCBmaWVsZCBiZWxvdycpLFxuICAgICAgICB1aS5kaXZUZXh0KCdcXG4gSG93IHRvIGNvbnZlcnQgbWFueSBzZXF1ZW5jZXM6JywgeyBzdHlsZTogeyAnZm9udC13ZWlnaHQnOiAnYm9sZGVyJyB9IH0pLFxuICAgICAgICB1aS5kaXZUZXh0KCcxLiBEcmFnICYgZHJvcCBhbiBFeGNlbCBvciBDU1YgZmlsZSB3aXRoIHNlcXVlbmNlcyBpbnRvIERhdGFncm9rJyksXG4gICAgICAgIHVpLmRpdlRleHQoJzIuIFJpZ2h0LWNsaWNrIG9uIHRoZSBjb2x1bW4gaGVhZGVyLCB0aGVuIHNlZSB0aGUgXFwnQ29udmVydFxcJyBtZW51JyksXG4gICAgICAgIHVpLmRpdlRleHQoJ1RoaXMgd2lsbCBhZGQgdGhlIHJlc3VsdCBjb2x1bW4gdG8gdGhlIHJpZ2h0IG9mIHRoZSB0YWJsZScpLFxuICAgIF0sICdDb252ZXJ0IG9saWdvbnVjbGVvdGlkZSBzZXF1ZW5jZXMgYmV0d2VlbiBOdWNsZW90aWRlcywgQmlvU3ByaW5nLCBBeG9sYWJzLCBNZXJtYWRlIDEyIGFuZCBHQ1JTIHJlcHJlc2VudGF0aW9ucy4nKTtcbiAgICBjb25zdCBjb2Rlc1RhYmxlc0RpdiA9IHVpLnNwbGl0VihbXG4gICAgICAgIHVpLmJveCh1aS5oMignQVNPIEdhcG1lcnMnKSwgeyBzdHlsZTogeyBtYXhIZWlnaHQ6ICc0MHB4JyB9IH0pLFxuICAgICAgICBhc29HYXBtZXJzR3JpZC5yb290LFxuICAgICAgICB1aS5ib3godWkuaDIoJzJcXCctT01lIGFuZCAyXFwnLUYgc2lSTkEnKSwgeyBzdHlsZTogeyBtYXhIZWlnaHQ6ICc0MHB4JyB9IH0pLFxuICAgICAgICBvbWVBbmRGbHVvcm9HcmlkLnJvb3QsXG4gICAgICAgIHVpLmJveCh1aS5oMignT3ZlcmhhbmcgbW9kaWZpY2F0aW9ucycpLCB7IHN0eWxlOiB7IG1heEhlaWdodDogJzQwcHgnIH0gfSksXG4gICAgICAgIG92ZXJoYW5nTW9kaWZpY2F0aW9uc0dyaWQucm9vdCxcbiAgICBdLCB7IHN0eWxlOiB7IG1heFdpZHRoOiAnMzUwcHgnIH0gfSk7XG4gICAgY29uc3QgdGFiQ29udHJvbCA9IHVpLnRhYkNvbnRyb2woe1xuICAgICAgICAnTUFJTic6IHVpLmJveCh1aS5zcGxpdEgoW1xuICAgICAgICAgICAgdWkuc3BsaXRWKFtcbiAgICAgICAgICAgICAgICB1aS5wYW5lbChbXG4gICAgICAgICAgICAgICAgICAgIGFwcE1haW5EZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgdWkuZGl2KFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVpLmgxKCdJbnB1dCBzZXF1ZW5jZScpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdWkuZGl2KFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFNlcXVlbmNlRmllbGQucm9vdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sICdpbnB1dC1iYXNlJyksXG4gICAgICAgICAgICAgICAgICAgIF0sICdpbnB1dFNlcXVlbmNlJyksXG4gICAgICAgICAgICAgICAgICAgIHVpLmRpdihbaW5wdXRGb3JtYXRDaG9pY2VJbnB1dF0sIHsgc3R5bGU6IHsgcGFkZGluZzogJzVweCAwJyB9IH0pLFxuICAgICAgICAgICAgICAgICAgICB1aS5ibG9jayhbXG4gICAgICAgICAgICAgICAgICAgICAgICB1aS5oMSgnT3V0cHV0JyksXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRUYWJsZURpdixcbiAgICAgICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgICAgICAgIG1vbGVjdWxlU3ZnRGl2LFxuICAgICAgICAgICAgICAgIF0sICdzZXF1ZW5jZScpLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgICBjb2Rlc1RhYmxlc0RpdixcbiAgICAgICAgXSwgeyBzdHlsZTogeyBoZWlnaHQ6ICcxMDAlJywgd2lkdGg6ICcxMDAlJyB9IH0pKSxcbiAgICAgICAgJ0FYT0xBQlMnOiBkZWZpbmVBeG9sYWJzUGF0dGVybigpLFxuICAgICAgICAnU0RGJzogc2F2ZVNlbnNlQW50aVNlbnNlKCksXG4gICAgfSk7XG4gICAgY29uc3QgdiA9IGdyb2suc2hlbGwubmV3VmlldygnU2VxdWVuY2UgVHJhbnNsYXRvcicsIFt0YWJDb250cm9sXSk7XG4gICAgdi5ib3ggPSB0cnVlO1xuICAgIGNvbnN0IHN3aXRjaElucHV0ID0gdWkuc3dpdGNoSW5wdXQoJ0NvZGVzJywgdHJ1ZSwgKHYpID0+ICh2KSA/XG4gICAgICAgICQoY29kZXNUYWJsZXNEaXYpLnNob3coKSA6XG4gICAgICAgICQoY29kZXNUYWJsZXNEaXYpLmhpZGUoKSk7XG4gICAgY29uc3QgdG9wUGFuZWwgPSBbXG4gICAgICAgIHVpLmljb25GQSgnZG93bmxvYWQnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBzZXF1ZW5jZVRvTW9sVjMwMDAoaW5wdXRTZXF1ZW5jZUZpZWxkLnZhbHVlLnJlcGxhY2UoL1xccy9nLCAnJyksIGZhbHNlLCBmYWxzZSwgaW5wdXRGb3JtYXRDaG9pY2VJbnB1dC52YWx1ZSk7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCAnZGF0YTp0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLTgsJyArIGVuY29kZVVSSUNvbXBvbmVudChyZXN1bHQpKTtcbiAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsIGlucHV0U2VxdWVuY2VGaWVsZC52YWx1ZS5yZXBsYWNlKC9cXHMvZywgJycpICsgJy5tb2wnKTtcbiAgICAgICAgICAgIGVsZW1lbnQuY2xpY2soKTtcbiAgICAgICAgfSwgJ1NhdmUgLm1vbCBmaWxlJyksXG4gICAgICAgIHVpLmljb25GQSgnY29weScsICgpID0+IHtcbiAgICAgICAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHNlcXVlbmNlVG9TbWlsZXMoaW5wdXRTZXF1ZW5jZUZpZWxkLnZhbHVlLnJlcGxhY2UoL1xccy9nLCAnJyksIGZhbHNlLCBpbnB1dEZvcm1hdENob2ljZUlucHV0LnZhbHVlKSlcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiBncm9rLnNoZWxsLmluZm8oc2VxdWVuY2VXYXNDb3BpZWQpKTtcbiAgICAgICAgfSwgJ0NvcHkgU01JTEVTJyksXG4gICAgICAgIHN3aXRjaElucHV0LnJvb3QsXG4gICAgXTtcbiAgICB0YWJDb250cm9sLm9uVGFiQ2hhbmdlZC5zdWJzY3JpYmUoKF8pID0+IHYuc2V0UmliYm9uUGFuZWxzKFsodGFiQ29udHJvbC5jdXJyZW50UGFuZS5uYW1lID09ICdNQUlOJykgPyB0b3BQYW5lbCA6IFtdXSkpO1xuICAgIHYuc2V0UmliYm9uUGFuZWxzKFt0b3BQYW5lbF0pO1xufVxuZnVuY3Rpb24gc2F2ZVRhYmxlQXNTZEZpbGUodGFibGUpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBpZiAoIXRhYmxlLmNvbHVtbnMuY29udGFpbnMoJ0NvbXBvdW5kIE5hbWUnKSkge1xuICAgICAgICAgICAgZ3Jvay5zaGVsbC53YXJuaW5nKCdGaWxlIHNhdmVkIHdpdGhvdXQgY29sdW1ucyBcXCcnICtcbiAgICAgICAgICAgICAgICBbQ09MX05BTUVTLkNPTVBPVU5EX05BTUUsIENPTF9OQU1FUy5DT01QT1VORF9DT01NRU5UUywgQ09MX05BTUVTLkNQRF9NVyxcbiAgICAgICAgICAgICAgICAgICAgQ09MX05BTUVTLlNBTFRfTUFTUywgQ09MX05BTUVTLkJBVENIX01XXS5qb2luKCdcXCcsIFxcJycpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdHJ1Y3R1cmVDb2x1bW4gPSB0YWJsZS5jb2woQ09MX05BTUVTLlNFUVVFTkNFKTtcbiAgICAgICAgY29uc3QgdHlwZUNvbHVtbiA9IHRhYmxlLmNvbChDT0xfTkFNRVMuVFlQRSk7XG4gICAgICAgIGxldCByZXN1bHQgPSAnJztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWJsZS5yb3dDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXQgPSBnZXRGb3JtYXQoc3RydWN0dXJlQ29sdW1uLmdldChpKSk7XG4gICAgICAgICAgICByZXN1bHQgKz0gKHR5cGVDb2x1bW4uZ2V0KGkpID09ICdTUycpID9cbiAgICAgICAgICAgICAgICBzZXF1ZW5jZVRvTW9sVjMwMDAoc3RydWN0dXJlQ29sdW1uLmdldChpKSwgZmFsc2UsIHRydWUsIGZvcm1hdCkgKyAnXFxuJyArIGA+ICA8U2VxdWVuY2U+XFxuU2Vuc2UgU3RyYW5kXFxuXFxuYCA6XG4gICAgICAgICAgICAgICAgc2VxdWVuY2VUb01vbFYzMDAwKHN0cnVjdHVyZUNvbHVtbi5nZXQoaSksIHRydWUsIHRydWUsIGZvcm1hdCkgKyAnXFxuJyArIGA+ICA8U2VxdWVuY2U+XFxuQW50aSBTZW5zZVxcblxcbmA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbCBvZiB0YWJsZS5jb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbC5uYW1lICE9IENPTF9OQU1FUy5TRVFVRU5DRSlcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGA+ICA8JHtjb2wubmFtZX0+XFxuJHtjb2wuZ2V0KGkpfVxcblxcbmA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQgKz0gJyQkJCRcXG5cXG4nO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdocmVmJywgJ2RhdGE6dGV4dC9wbGFpbjtjaGFyc2V0PXV0Zi04LCcgKyBlbmNvZGVVUklDb21wb25lbnQocmVzdWx0KSk7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsIHRhYmxlLm5hbWUgKyAnLnNkZicpO1xuICAgICAgICBlbGVtZW50LmNsaWNrKCk7XG4gICAgfSk7XG59XG5jb25zdCB3ZWlnaHRzT2JqID0ge307XG5mb3IgKGNvbnN0IHN5bnRoZXNpemVyIG9mIE9iamVjdC5rZXlzKG1hcCkpIHtcbiAgICBmb3IgKGNvbnN0IHRlY2hub2xvZ3kgb2YgT2JqZWN0LmtleXMobWFwW3N5bnRoZXNpemVyXSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBjb2RlIG9mIE9iamVjdC5rZXlzKG1hcFtzeW50aGVzaXplcl1bdGVjaG5vbG9neV0pKVxuICAgICAgICAgICAgd2VpZ2h0c09ialtjb2RlXSA9IG1hcFtzeW50aGVzaXplcl1bdGVjaG5vbG9neV1bY29kZV0ud2VpZ2h0O1xuICAgIH1cbn1cbmZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKE1PRElGSUNBVElPTlMpKVxuICAgIHdlaWdodHNPYmpba2V5XSA9IHZhbHVlLm1vbGVjdWxhcldlaWdodDtcbmZ1bmN0aW9uIHNvcnRCeVN0cmluZ0xlbmd0aEluRGVzY2VuZGluZ09yZGVyKGFycmF5KSB7XG4gICAgcmV0dXJuIGFycmF5LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGIubGVuZ3RoIC0gYS5sZW5ndGg7IH0pO1xufVxuZnVuY3Rpb24gc3RyaW5naWZ5SXRlbXMoaXRlbXMpIHtcbiAgICByZXR1cm4gJ1tcIicgKyBpdGVtcy5qb2luKCdcIiwgXCInKSArICdcIl0nO1xufVxuZnVuY3Rpb24gbW9sZWN1bGFyV2VpZ2h0KHNlcXVlbmNlLCB3ZWlnaHRzT2JqKSB7XG4gICAgY29uc3QgY29kZXMgPSBzb3J0QnlTdHJpbmdMZW5ndGhJbkRlc2NlbmRpbmdPcmRlcihPYmplY3Qua2V5cyh3ZWlnaHRzT2JqKSkuY29uY2F0KE9iamVjdC5rZXlzKE1PRElGSUNBVElPTlMpKTtcbiAgICBsZXQgd2VpZ2h0ID0gMDtcbiAgICBsZXQgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBzZXF1ZW5jZS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgbWF0Y2hlZENvZGUgPSBjb2Rlcy5maW5kKChzKSA9PiBzID09IHNlcXVlbmNlLnNsaWNlKGksIGkgKyBzLmxlbmd0aCkpO1xuICAgICAgICB3ZWlnaHQgKz0gd2VpZ2h0c09ialtzZXF1ZW5jZS5zbGljZShpLCBpICsgbWF0Y2hlZENvZGUubGVuZ3RoKV07XG4gICAgICAgIGkgKz0gbWF0Y2hlZENvZGUubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gd2VpZ2h0IC0gNjEuOTc7XG59XG4vL3RhZ3M6IGF1dG9zdGFydFxuZXhwb3J0IGZ1bmN0aW9uIGF1dG9zdGFydE9saWdvU2RGaWxlU3Vic2NyaXB0aW9uKCkge1xuICAgIGdyb2suZXZlbnRzLm9uVmlld0FkZGVkLnN1YnNjcmliZSgodikgPT4ge1xuICAgICAgICBpZiAodi50eXBlID09ICdUYWJsZVZpZXcnICYmIHYuZGF0YUZyYW1lLmNvbHVtbnMuY29udGFpbnMoQ09MX05BTUVTLlRZUEUpKVxuICAgICAgICAgICAgb2xpZ29TZEZpbGUodi5kYXRhRnJhbWUpO1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG9saWdvU2RGaWxlKHRhYmxlKSB7XG4gICAgY29uc3Qgc2FsdHNEZiA9IERHLkRhdGFGcmFtZS5mcm9tQ3N2KFNBTFRTX0NTVik7XG4gICAgY29uc3QgdXNlcnNEZiA9IERHLkRhdGFGcmFtZS5mcm9tQ3N2KFVTRVJTX0NTVik7XG4gICAgY29uc3Qgc291cmNlc0RmID0gREcuRGF0YUZyYW1lLmZyb21Dc3YoU09VUkNFUyk7XG4gICAgY29uc3QgaWNkc0RmID0gREcuRGF0YUZyYW1lLmZyb21Dc3YoSUNEUyk7XG4gICAgY29uc3QgaWRwc0RmID0gREcuRGF0YUZyYW1lLmZyb21Dc3YoSURQUyk7XG4gICAgZnVuY3Rpb24gYWRkQ29sdW1ucyh0LCBzYWx0c0RmKSB7XG4gICAgICAgIGlmICh0LmNvbHVtbnMuY29udGFpbnMoQ09MX05BTUVTLkNPTVBPVU5EX05BTUUpKVxuICAgICAgICAgICAgcmV0dXJuIGdyb2suc2hlbGwuZXJyb3IoJ0NvbHVtbnMgYWxyZWFkeSBleGlzdCEnKTtcbiAgICAgICAgY29uc3Qgc2VxdWVuY2UgPSB0LmNvbChDT0xfTkFNRVMuU0VRVUVOQ0UpO1xuICAgICAgICBjb25zdCBzYWx0ID0gdC5jb2woQ09MX05BTUVTLlNBTFQpO1xuICAgICAgICBjb25zdCBlcXVpdmFsZW50cyA9IHQuY29sKENPTF9OQU1FUy5FUVVJVkFMRU5UUyk7XG4gICAgICAgIHQuY29sdW1ucy5hZGROZXdTdHJpbmcoQ09MX05BTUVTLkNPTVBPVU5EX05BTUUpLmluaXQoKGkpID0+IHNlcXVlbmNlLmdldChpKSk7XG4gICAgICAgIHQuY29sdW1ucy5hZGROZXdTdHJpbmcoQ09MX05BTUVTLkNPTVBPVU5EX0NPTU1FTlRTKS5pbml0KChpKSA9PiAoaSA+IDAgJiYgaSAlIDIgPT0gMCkgP1xuICAgICAgICAgICAgc2VxdWVuY2UuZ2V0U3RyaW5nKGkpICsgJzsgZHVwbGV4IG9mIFNTOiAnICsgc2VxdWVuY2UuZ2V0U3RyaW5nKGkgLSAyKSArICcgYW5kIEFTOiAnICsgc2VxdWVuY2UuZ2V0U3RyaW5nKGkgLSAxKSA6XG4gICAgICAgICAgICBzZXF1ZW5jZS5nZXRTdHJpbmcoaSkpO1xuICAgICAgICBjb25zdCBtb2xXZWlnaHRDb2wgPSBzYWx0c0RmLmNvbCgnTU9MV0VJR0hUJyk7XG4gICAgICAgIGNvbnN0IHNhbHROYW1lc0xpc3QgPSBzYWx0c0RmLmNvbCgnRElTUExBWScpLnRvTGlzdCgpO1xuICAgICAgICB0LmNvbHVtbnMuYWRkTmV3RmxvYXQoQ09MX05BTUVTLkNQRF9NVylcbiAgICAgICAgICAgIC5pbml0KChpKSA9PiBtb2xlY3VsYXJXZWlnaHQoc2VxdWVuY2UuZ2V0KGkpLCB3ZWlnaHRzT2JqKSk7XG4gICAgICAgIHQuY29sdW1ucy5hZGROZXdGbG9hdChDT0xfTkFNRVMuU0FMVF9NQVNTKS5pbml0KChpKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzYWx0Um93SW5kZXggPSBzYWx0TmFtZXNMaXN0LmluZGV4T2Yoc2FsdC5nZXQoaSkpO1xuICAgICAgICAgICAgY29uc3QgbXcgPSBtb2xXZWlnaHRDb2wuZ2V0KHNhbHRSb3dJbmRleCk7XG4gICAgICAgICAgICByZXR1cm4gbXcgKiBlcXVpdmFsZW50cy5nZXQoaSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0LmNvbHVtbnMuYWRkTmV3Q2FsY3VsYXRlZChDT0xfTkFNRVMuQkFUQ0hfTVcsICckeycgKyBDT0xfTkFNRVMuQ1BEX01XICsgJ30gKyAkeycgKyBDT0xfTkFNRVMuU0FMVF9NQVNTICsgJ30nLCBERy5DT0xVTU5fVFlQRS5GTE9BVCwgZmFsc2UpO1xuICAgICAgICBhZGRDb2x1bW5zUHJlc3NlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiBuZXdEZiA9IHQ7XG4gICAgfVxuICAgIGxldCBuZXdEZjtcbiAgICBsZXQgYWRkQ29sdW1uc1ByZXNzZWQgPSBmYWxzZTtcbiAgICBjb25zdCBkID0gdWkuZGl2KFtcbiAgICAgICAgdWkuaWNvbnMuZWRpdCgoKSA9PiB7XG4gICAgICAgICAgICBkLmlubmVySFRNTCA9ICcnO1xuICAgICAgICAgICAgaWYgKHRhYmxlLmNvbChDT0xfTkFNRVMuSURQKS50eXBlICE9IERHLkNPTFVNTl9UWVBFLlNUUklORylcbiAgICAgICAgICAgICAgICB0YWJsZS5jaGFuZ2VDb2x1bW5UeXBlKENPTF9OQU1FUy5JRFAsIERHLkNPTFVNTl9UWVBFLlNUUklORyk7XG4gICAgICAgICAgICBkLmFwcGVuZCh1aS5saW5rKCdBZGQgQ29sdW1ucycsICgpID0+IHtcbiAgICAgICAgICAgICAgICBhZGRDb2x1bW5zKHRhYmxlLCBzYWx0c0RmKTtcbiAgICAgICAgICAgICAgICBncm9rLnNoZWxsLnRhYmxlVmlldyh0YWJsZS5uYW1lKS5ncmlkLmNvbHVtbnMuc2V0T3JkZXIoT2JqZWN0LnZhbHVlcyhDT0xfTkFNRVMpKTtcbiAgICAgICAgICAgIH0sICdBZGQgY29sdW1uczogXFwnJyArIFtDT0xfTkFNRVMuQ09NUE9VTkRfTkFNRSwgQ09MX05BTUVTLkNPTVBPVU5EX0NPTU1FTlRTLCBDT0xfTkFNRVMuQ1BEX01XLFxuICAgICAgICAgICAgICAgIENPTF9OQU1FUy5TQUxUX01BU1MsIENPTF9OQU1FUy5CQVRDSF9NV10uam9pbignXFwnLCBcXCcnKSwgJycpLCB1aS5idXR0b24oJ1NhdmUgU0QgZmlsZScsICgpID0+IHNhdmVUYWJsZUFzU2RGaWxlKGFkZENvbHVtbnNQcmVzc2VkID8gbmV3RGYgOiB0YWJsZSkpKTtcbiAgICAgICAgICAgIGNvbnN0IHZpZXcgPSBncm9rLnNoZWxsLmdldFRhYmxlVmlldyh0YWJsZS5uYW1lKTtcbiAgICAgICAgICAgIHZpZXcudGFibGUuY29sKENPTF9OQU1FUy5UWVBFKS5zZXRUYWcoREcuVEFHUy5DSE9JQ0VTLCAnW1wiQVNcIiwgXCJTU1wiLCBcIkR1cGxleFwiXScpO1xuICAgICAgICAgICAgdmlldy50YWJsZS5jb2woQ09MX05BTUVTLk9XTkVSKS5zZXRUYWcoREcuVEFHUy5DSE9JQ0VTLCBzdHJpbmdpZnlJdGVtcyh1c2Vyc0RmLmNvbHVtbnMuYnlJbmRleCgwKS50b0xpc3QoKSkpO1xuICAgICAgICAgICAgdmlldy50YWJsZS5jb2woQ09MX05BTUVTLlNBTFQpLnNldFRhZyhERy5UQUdTLkNIT0lDRVMsIHN0cmluZ2lmeUl0ZW1zKHNhbHRzRGYuY29sdW1ucy5ieUluZGV4KDApLnRvTGlzdCgpKSk7XG4gICAgICAgICAgICB2aWV3LnRhYmxlLmNvbChDT0xfTkFNRVMuU09VUkNFKS5zZXRUYWcoREcuVEFHUy5DSE9JQ0VTLCBzdHJpbmdpZnlJdGVtcyhzb3VyY2VzRGYuY29sdW1ucy5ieUluZGV4KDApLnRvTGlzdCgpKSk7XG4gICAgICAgICAgICB2aWV3LnRhYmxlLmNvbChDT0xfTkFNRVMuSUNEKS5zZXRUYWcoREcuVEFHUy5DSE9JQ0VTLCBzdHJpbmdpZnlJdGVtcyhpY2RzRGYuY29sdW1ucy5ieUluZGV4KDApLnRvTGlzdCgpKSk7XG4gICAgICAgICAgICB2aWV3LnRhYmxlLmNvbChDT0xfTkFNRVMuSURQKS5zZXRUYWcoREcuVEFHUy5DSE9JQ0VTLCBzdHJpbmdpZnlJdGVtcyhpZHBzRGYuY29sdW1ucy5ieUluZGV4KDApLnRvTGlzdCgpKSk7XG4gICAgICAgICAgICBncm9rLmV2ZW50cy5vbkNvbnRleHRNZW51LnN1YnNjcmliZSgoYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChbQ09MX05BTUVTLlRZUEUsIENPTF9OQU1FUy5PV05FUiwgQ09MX05BTUVTLlNBTFQsIENPTF9OQU1FUy5TT1VSQ0UsIENPTF9OQU1FUy5JQ0QsIENPTF9OQU1FUy5JRFBdXG4gICAgICAgICAgICAgICAgICAgIC5pbmNsdWRlcyhhcmdzLmFyZ3MuY29udGV4dC50YWJsZS5jdXJyZW50Q29sLm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3MuYXJncy5tZW51Lml0ZW0oJ0ZpbGwgQ29sdW1uIFdpdGggVmFsdWUnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ID0gYXJncy5hcmdzLmNvbnRleHQudGFibGUuY3VycmVudENlbGwudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmFyZ3MuY29udGV4dC50YWJsZS5jdXJyZW50Q2VsbC5jb2x1bW4uaW5pdCh2KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pLFxuICAgIF0pO1xuICAgIGdyb2suc2hlbGwudi5zZXRSaWJib25QYW5lbHMoW1tkXV0pO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9
|