@datagrok-libraries/bio 4.4.7 → 5.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/index.d.ts +14 -0
- package/index.d.ts.map +1 -0
- package/index.js +12 -0
- package/index.ts +50 -0
- package/package.json +1 -1
- package/src/utils/cell-renderer.d.ts.map +1 -1
- package/src/utils/cell-renderer.js +3 -3
- package/src/utils/macromolecule.d.ts +64 -0
- package/src/utils/macromolecule.d.ts.map +1 -0
- package/src/utils/macromolecule.js +178 -0
- package/src/utils/notation-converter.d.ts +1 -1
- package/src/utils/notation-converter.d.ts.map +1 -1
- package/src/utils/notation-converter.js +3 -3
- package/src/utils/splitter.js +3 -3
- package/src/utils/units-handler.js +4 -4
- package/src/viewers/web-logo.d.ts +8 -70
- package/src/viewers/web-logo.d.ts.map +1 -1
- package/src/viewers/web-logo.js +67 -245
package/src/viewers/web-logo.js
CHANGED
|
@@ -12,12 +12,8 @@ import * as ui from 'datagrok-api/ui';
|
|
|
12
12
|
import * as DG from 'datagrok-api/dg';
|
|
13
13
|
import wu from 'wu';
|
|
14
14
|
import * as rxjs from 'rxjs';
|
|
15
|
-
import { Vector } from '@datagrok-libraries/utils/src/type-declarations';
|
|
16
|
-
import { vectorLength, vectorDotProduct } from '@datagrok-libraries/utils/src/vector-operations';
|
|
17
|
-
import { Aminoacids, AminoacidsPalettes } from '../aminoacids';
|
|
18
|
-
import { Nucleotides, NucleotidesPalettes } from '../nucleotides';
|
|
19
|
-
import { UnknownSeqPalettes } from '../unknown';
|
|
20
15
|
import { UnitsHandler } from '../utils/units-handler';
|
|
16
|
+
import { getSplitter, monomerToShort, pickUpPalette, pickUpSeqCol } from '../utils/macromolecule';
|
|
21
17
|
var PositionHeight;
|
|
22
18
|
(function (PositionHeight) {
|
|
23
19
|
PositionHeight["Entropy"] = "Entropy";
|
|
@@ -70,7 +66,7 @@ export class WebLogo extends DG.JsViewer {
|
|
|
70
66
|
this.rowsNull = 0;
|
|
71
67
|
this.visibleSlider = false;
|
|
72
68
|
this.allowResize = true;
|
|
73
|
-
this.
|
|
69
|
+
this.turnOfResizeForOneSetValue = false;
|
|
74
70
|
this.backgroundColor = 0xFFFFFFFF;
|
|
75
71
|
this.positionMargin = 0;
|
|
76
72
|
this.positionNames = [];
|
|
@@ -136,7 +132,16 @@ export class WebLogo extends DG.JsViewer {
|
|
|
136
132
|
if (this.host == null) {
|
|
137
133
|
return 0;
|
|
138
134
|
}
|
|
139
|
-
|
|
135
|
+
const r = window.devicePixelRatio;
|
|
136
|
+
if (r > 1) {
|
|
137
|
+
return this.canvasWidthWithRatio / this.positionWidthWithMargin;
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
return this.canvas.width / (this.positionWidthWithMargin * r);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
get canvasWidthWithRatio() {
|
|
144
|
+
return this.canvas.width * window.devicePixelRatio;
|
|
140
145
|
}
|
|
141
146
|
/** Position of start rendering */
|
|
142
147
|
get firstVisibleIndex() {
|
|
@@ -159,18 +164,21 @@ export class WebLogo extends DG.JsViewer {
|
|
|
159
164
|
this.slider.root.style.display = 'none';
|
|
160
165
|
this.slider.root.style.height = '0.7em';
|
|
161
166
|
this.visibleSlider = false;
|
|
162
|
-
const parent = this;
|
|
163
167
|
this.slider.onValuesChanged.subscribe(() => {
|
|
164
|
-
if (
|
|
168
|
+
if ((this.host == null)) {
|
|
165
169
|
return;
|
|
166
170
|
}
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
171
|
+
/* Resize slider if we can resize do that */
|
|
172
|
+
if ((this.allowResize) && (!this.turnOfResizeForOneSetValue) &&
|
|
173
|
+
(this.visibleSlider)) {
|
|
174
|
+
const countOfPositions = Math.ceil(this.slider.max - this.slider.min);
|
|
175
|
+
const calculatedWidth = (this.canvas.width / countOfPositions) - this.positionMarginValue;
|
|
176
|
+
// saving positionWidth value global (even if slider is not visible)
|
|
177
|
+
this.positionWidth = calculatedWidth;
|
|
178
|
+
this._positionWidth = calculatedWidth;
|
|
172
179
|
}
|
|
173
|
-
|
|
180
|
+
this.turnOfResizeForOneSetValue = false;
|
|
181
|
+
this.render(true);
|
|
174
182
|
});
|
|
175
183
|
this.host = ui.div([this.msgHost, this.canvas]);
|
|
176
184
|
this.host.style.justifyContent = 'center';
|
|
@@ -230,13 +238,13 @@ export class WebLogo extends DG.JsViewer {
|
|
|
230
238
|
this.root.append(this.host);
|
|
231
239
|
this.root.append(this.slider.root);
|
|
232
240
|
this._calculate(window.devicePixelRatio);
|
|
233
|
-
this.
|
|
234
|
-
this.render(
|
|
241
|
+
this.updateSlider();
|
|
242
|
+
this.render(true);
|
|
235
243
|
}
|
|
236
244
|
/** Handler of changing size WebLogo */
|
|
237
245
|
rootOnSizeChanged() {
|
|
238
246
|
this._calculate(window.devicePixelRatio);
|
|
239
|
-
this.
|
|
247
|
+
this.updateSlider();
|
|
240
248
|
this.render(true);
|
|
241
249
|
}
|
|
242
250
|
/** Assigns {@link seqCol} and {@link cp} based on {@link sequenceColumnName} and calls {@link render}().
|
|
@@ -245,16 +253,16 @@ export class WebLogo extends DG.JsViewer {
|
|
|
245
253
|
if (this.dataFrame) {
|
|
246
254
|
this.seqCol = this.sequenceColumnName ? this.dataFrame.col(this.sequenceColumnName) : null;
|
|
247
255
|
if (this.seqCol == null) {
|
|
248
|
-
this.seqCol =
|
|
256
|
+
this.seqCol = pickUpSeqCol(this.dataFrame);
|
|
249
257
|
this.sequenceColumnName = this.seqCol ? this.seqCol.name : null;
|
|
250
258
|
}
|
|
251
259
|
if (this.seqCol) {
|
|
252
260
|
const units = this.seqCol.getTag(DG.TAGS.UNITS);
|
|
253
261
|
const separator = this.seqCol.getTag(UnitsHandler.TAGS.separator);
|
|
254
|
-
this.splitter =
|
|
262
|
+
this.splitter = getSplitter(units, separator);
|
|
255
263
|
this.unitsHandler = new UnitsHandler(this.seqCol);
|
|
256
264
|
this.updatePositions();
|
|
257
|
-
this.cp =
|
|
265
|
+
this.cp = pickUpPalette(this.seqCol);
|
|
258
266
|
}
|
|
259
267
|
else {
|
|
260
268
|
this.splitter = null;
|
|
@@ -292,8 +300,25 @@ export class WebLogo extends DG.JsViewer {
|
|
|
292
300
|
this.positionNames.includes(this.endPositionName)) ?
|
|
293
301
|
this.positionNames.indexOf(this.endPositionName) : (maxLength - 1);
|
|
294
302
|
}
|
|
303
|
+
get widthArea() {
|
|
304
|
+
return this.Length * this.positionWidth / window.devicePixelRatio;
|
|
305
|
+
}
|
|
306
|
+
get heightArea() {
|
|
307
|
+
return Math.min(this.maxHeight, Math.max(this.minHeight, this.root.clientHeight));
|
|
308
|
+
}
|
|
309
|
+
get xScale() {
|
|
310
|
+
return (this.root.clientWidth - this.Length * this.positionMarginValue) / this.widthArea;
|
|
311
|
+
}
|
|
312
|
+
get yScale() {
|
|
313
|
+
return this.root.clientHeight / this.heightArea;
|
|
314
|
+
}
|
|
295
315
|
checkIsHideSlider() {
|
|
296
|
-
|
|
316
|
+
let showSliderWithFitArea = true;
|
|
317
|
+
const minScale = Math.min(this.xScale, this.yScale);
|
|
318
|
+
if (((minScale == this.xScale) || (minScale <= 1)) && (this.fitArea)) {
|
|
319
|
+
showSliderWithFitArea = false;
|
|
320
|
+
}
|
|
321
|
+
return ((this.fixWidth || Math.ceil(this.canvas.width / this.positionWidthWithMargin) >= this.Length) || (showSliderWithFitArea));
|
|
297
322
|
}
|
|
298
323
|
setSliderVisibility(visible) {
|
|
299
324
|
if (visible) {
|
|
@@ -305,9 +330,14 @@ export class WebLogo extends DG.JsViewer {
|
|
|
305
330
|
this.visibleSlider = false;
|
|
306
331
|
}
|
|
307
332
|
}
|
|
308
|
-
/**
|
|
309
|
-
|
|
310
|
-
|
|
333
|
+
/** Updates {@link slider}, needed to set slider options and to update slider position. */
|
|
334
|
+
updateSlider() {
|
|
335
|
+
if (this.checkIsHideSlider()) {
|
|
336
|
+
this.setSliderVisibility(false);
|
|
337
|
+
}
|
|
338
|
+
else {
|
|
339
|
+
this.setSliderVisibility(true);
|
|
340
|
+
}
|
|
311
341
|
if ((this.slider != null) && (this.canvas != null)) {
|
|
312
342
|
let diffEndScrollAndSliderMin = Math.floor(this.slider.min + this.canvas.width / this.positionWidthWithMargin) - this.Length;
|
|
313
343
|
diffEndScrollAndSliderMin = diffEndScrollAndSliderMin > 0 ? diffEndScrollAndSliderMin : 0;
|
|
@@ -317,6 +347,7 @@ export class WebLogo extends DG.JsViewer {
|
|
|
317
347
|
newMin = 0;
|
|
318
348
|
newMax = this.Length - 1;
|
|
319
349
|
}
|
|
350
|
+
this.turnOfResizeForOneSetValue = true;
|
|
320
351
|
this.slider.setValues(0, this.Length, newMin, newMax);
|
|
321
352
|
}
|
|
322
353
|
}
|
|
@@ -335,13 +366,13 @@ export class WebLogo extends DG.JsViewer {
|
|
|
335
366
|
break;
|
|
336
367
|
case 'positionWidth':
|
|
337
368
|
this._positionWidth = this.positionWidth;
|
|
338
|
-
this.
|
|
369
|
+
this.updateSlider();
|
|
339
370
|
break;
|
|
340
371
|
case 'fixWidth':
|
|
341
|
-
this.
|
|
372
|
+
this.updateSlider();
|
|
342
373
|
break;
|
|
343
374
|
case 'fitArea':
|
|
344
|
-
this.
|
|
375
|
+
this.updateSlider();
|
|
345
376
|
break;
|
|
346
377
|
case 'shrinkEmptyTail':
|
|
347
378
|
this.updatePositions();
|
|
@@ -350,7 +381,7 @@ export class WebLogo extends DG.JsViewer {
|
|
|
350
381
|
this.updatePositions();
|
|
351
382
|
break;
|
|
352
383
|
case 'positionMargin':
|
|
353
|
-
this.
|
|
384
|
+
this.updateSlider();
|
|
354
385
|
break;
|
|
355
386
|
}
|
|
356
387
|
this.render(true);
|
|
@@ -519,12 +550,6 @@ export class WebLogo extends DG.JsViewer {
|
|
|
519
550
|
g.fillStyle = DG.Color.toHtml(this.backgroundColor);
|
|
520
551
|
g.fillRect(0, 0, this.canvas.width, this.canvas.height);
|
|
521
552
|
g.textBaseline = this.textBaseline;
|
|
522
|
-
if (this.checkIsHideSlider()) {
|
|
523
|
-
this.setSliderVisibility(false);
|
|
524
|
-
}
|
|
525
|
-
else {
|
|
526
|
-
this.setSliderVisibility(true);
|
|
527
|
-
}
|
|
528
553
|
const maxCountOfRowsRendered = this.countOfRenderPositions + 1;
|
|
529
554
|
const firstVisibleIndex = (this.visibleSlider) ? Math.floor(this.slider.min) : 0;
|
|
530
555
|
const lastVisibleIndex = Math.min(this.Length, firstVisibleIndex + maxCountOfRowsRendered);
|
|
@@ -550,7 +575,7 @@ export class WebLogo extends DG.JsViewer {
|
|
|
550
575
|
for (let jPos = this.firstVisibleIndex; jPos < lastVisibleIndex; jPos++) {
|
|
551
576
|
for (const [monomer, pmInfo] of Object.entries(this.positions[jPos].freq)) {
|
|
552
577
|
if (monomer !== '-') {
|
|
553
|
-
const monomerTxt =
|
|
578
|
+
const monomerTxt = monomerToShort(monomer, 5);
|
|
554
579
|
const b = pmInfo.bounds;
|
|
555
580
|
const left = b.left - this.positionWidthWithMargin * this.firstVisibleIndex;
|
|
556
581
|
g.resetTransform();
|
|
@@ -573,12 +598,10 @@ export class WebLogo extends DG.JsViewer {
|
|
|
573
598
|
if (!this.host)
|
|
574
599
|
return;
|
|
575
600
|
const r = window.devicePixelRatio;
|
|
576
|
-
let width = this.
|
|
577
|
-
let height =
|
|
601
|
+
let width = this.widthArea;
|
|
602
|
+
let height = this.heightArea;
|
|
578
603
|
if ((this.fitArea) && (!this.visibleSlider)) {
|
|
579
|
-
const
|
|
580
|
-
const xScale = (this.root.clientWidth - this.Length * this.positionMarginValue) / width;
|
|
581
|
-
const scale = Math.max(1, Math.min(xScale, yScale));
|
|
604
|
+
const scale = Math.max(1, Math.min(this.xScale, this.yScale));
|
|
582
605
|
width = width * scale;
|
|
583
606
|
height = height * scale;
|
|
584
607
|
this._positionWidth = this.positionWidth * scale;
|
|
@@ -624,10 +647,10 @@ export class WebLogo extends DG.JsViewer {
|
|
|
624
647
|
hostLeftMargin = 0;
|
|
625
648
|
break;
|
|
626
649
|
case 'center':
|
|
627
|
-
hostLeftMargin = Math.max(0, (this.root.clientWidth - width) / 2)
|
|
650
|
+
hostLeftMargin = Math.max(0, (this.root.clientWidth - width) / 2);
|
|
628
651
|
break;
|
|
629
652
|
case 'right':
|
|
630
|
-
hostLeftMargin = Math.max(0, this.root.clientWidth - width)
|
|
653
|
+
hostLeftMargin = Math.max(0, this.root.clientWidth - width);
|
|
631
654
|
break;
|
|
632
655
|
}
|
|
633
656
|
this.host.style.setProperty('margin-top', `${hostTopMargin}px`, 'important');
|
|
@@ -644,212 +667,11 @@ export class WebLogo extends DG.JsViewer {
|
|
|
644
667
|
}
|
|
645
668
|
}
|
|
646
669
|
}
|
|
647
|
-
/** Selects a suitable palette based on column data
|
|
648
|
-
* @param {DG.Column} seqCol Column to look for a palette
|
|
649
|
-
* @param {number} minLength minimum length of sequence to detect palette (empty strings are allowed)
|
|
650
|
-
* @return {SeqPalette} Palette corresponding to the alphabet of the sequences in the column
|
|
651
|
-
*/
|
|
652
|
-
static pickUpPalette(seqCol, minLength = 5) {
|
|
653
|
-
let res;
|
|
654
|
-
switch (seqCol.semType) {
|
|
655
|
-
case Aminoacids.SemTypeMultipleAlignment:
|
|
656
|
-
res = AminoacidsPalettes.GrokGroups;
|
|
657
|
-
break;
|
|
658
|
-
case Nucleotides.SemTypeMultipleAlignment:
|
|
659
|
-
res = NucleotidesPalettes.Chromatogram;
|
|
660
|
-
break;
|
|
661
|
-
}
|
|
662
|
-
const stats = WebLogo.getStats(seqCol, minLength, WebLogo.splitterAsFasta);
|
|
663
|
-
const alphabetCandidates = [
|
|
664
|
-
[new Set(Object.keys(Nucleotides.Names)), NucleotidesPalettes.Chromatogram],
|
|
665
|
-
[new Set(Object.keys(Aminoacids.Names)), AminoacidsPalettes.GrokGroups],
|
|
666
|
-
];
|
|
667
|
-
// Calculate likelihoods for alphabet_candidates
|
|
668
|
-
const alphabetCandidatesSim = alphabetCandidates
|
|
669
|
-
.map((c) => WebLogo.getAlphabetSimilarity(stats.freq, c[0]));
|
|
670
|
-
const maxCos = Math.max(...alphabetCandidatesSim);
|
|
671
|
-
if (maxCos > 0.55)
|
|
672
|
-
res = alphabetCandidates[alphabetCandidatesSim.indexOf(maxCos)][1];
|
|
673
|
-
else
|
|
674
|
-
res = UnknownSeqPalettes.Color;
|
|
675
|
-
return res;
|
|
676
|
-
}
|
|
677
670
|
getAlphabetSize() {
|
|
678
671
|
var _a, _b;
|
|
679
672
|
return (_b = (_a = this.unitsHandler) === null || _a === void 0 ? void 0 : _a.getAlphabetSize()) !== null && _b !== void 0 ? _b : 0;
|
|
680
673
|
}
|
|
681
|
-
/** Stats of sequences with specified splitter func, returns { freq, sameLength }.
|
|
682
|
-
* @param {DG.Column} seqCol
|
|
683
|
-
* @param {number} minLength
|
|
684
|
-
* @param {SplitterFunc} splitter
|
|
685
|
-
* @return { SeqColStats }, sameLength: boolean } stats of column sequences
|
|
686
|
-
*/
|
|
687
|
-
static getStats(seqCol, minLength, splitter) {
|
|
688
|
-
const freq = {};
|
|
689
|
-
let sameLength = true;
|
|
690
|
-
let firstLength = null;
|
|
691
|
-
for (const seq of seqCol.categories) {
|
|
692
|
-
const mSeq = splitter(seq);
|
|
693
|
-
if (firstLength == null)
|
|
694
|
-
firstLength = mSeq.length;
|
|
695
|
-
else if (mSeq.length !== firstLength)
|
|
696
|
-
sameLength = false;
|
|
697
|
-
if (mSeq.length > minLength) {
|
|
698
|
-
for (const m of mSeq) {
|
|
699
|
-
if (!(m in freq))
|
|
700
|
-
freq[m] = 0;
|
|
701
|
-
freq[m] += 1;
|
|
702
|
-
}
|
|
703
|
-
}
|
|
704
|
-
}
|
|
705
|
-
return { freq: freq, sameLength: sameLength };
|
|
706
|
-
}
|
|
707
|
-
/** Calculate similarity in current sequence and alphabet.
|
|
708
|
-
* @param {MonomerFreqs} freq
|
|
709
|
-
* @param {Set<string>} alphabet
|
|
710
|
-
* @param {string} gapSymbol
|
|
711
|
-
* @return {number} Cosine similarity
|
|
712
|
-
*/
|
|
713
|
-
static getAlphabetSimilarity(freq, alphabet, gapSymbol = '-') {
|
|
714
|
-
const keys = new Set([...new Set(Object.keys(freq)), ...alphabet]);
|
|
715
|
-
keys.delete(gapSymbol);
|
|
716
|
-
const freqA = [];
|
|
717
|
-
const alphabetA = [];
|
|
718
|
-
for (const m of keys) {
|
|
719
|
-
freqA.push(m in freq ? freq[m] : 0);
|
|
720
|
-
alphabetA.push(alphabet.has(m) ? 1 : 0);
|
|
721
|
-
}
|
|
722
|
-
/* There were a few ideas: chi-squared, pearson correlation (variance?), scalar product */
|
|
723
|
-
const freqV = new Vector(freqA);
|
|
724
|
-
const alphabetV = new Vector(alphabetA);
|
|
725
|
-
return vectorDotProduct(freqV, alphabetV) / (vectorLength(freqV) * vectorLength(alphabetV));
|
|
726
|
-
}
|
|
727
|
-
// Previous version of pickUpSeqCol
|
|
728
|
-
// /** First try to find column with semType 'alignedSequence'.
|
|
729
|
-
// * Next look for column with data alphabet corresponding to any of the known palettes.
|
|
730
|
-
// * @param {DG.DataFrame} dataFrame
|
|
731
|
-
// * @return {DG.Column} The column we were looking for or null
|
|
732
|
-
// */
|
|
733
|
-
// private pickUpSeqCol(dataFrame: DG.DataFrame): DG.Column | null {
|
|
734
|
-
// let res: DG.Column | null = dataFrame.columns.bySemType('alignedSequence');
|
|
735
|
-
// if (res == null) {
|
|
736
|
-
// for (const col of dataFrame.columns) {
|
|
737
|
-
// const cp = WebLogo.pickUpPalette(col as DG.Column, 5);
|
|
738
|
-
// if (cp !== null && !(cp instanceof UnknownSeqPalette)) {
|
|
739
|
-
// res = col;
|
|
740
|
-
// break;
|
|
741
|
-
// }
|
|
742
|
-
// }
|
|
743
|
-
// }
|
|
744
|
-
// return res;
|
|
745
|
-
// }
|
|
746
|
-
static pickUpSeqCol(df) {
|
|
747
|
-
var _a;
|
|
748
|
-
const semTypeColList = df.columns.bySemTypeAll(DG.SEMTYPE.MACROMOLECULE);
|
|
749
|
-
let resCol = (_a = semTypeColList.find((col) => {
|
|
750
|
-
const units = col.getTag(DG.TAGS.UNITS);
|
|
751
|
-
return units ? units.indexOf('MSA') !== -1 : false;
|
|
752
|
-
})) !== null && _a !== void 0 ? _a : null;
|
|
753
|
-
if (!resCol && semTypeColList.length > 0)
|
|
754
|
-
resCol = semTypeColList[0];
|
|
755
|
-
return resCol;
|
|
756
|
-
}
|
|
757
|
-
/** Split sequence for single character monomers, square brackets multichar monomer names or gap symbol.
|
|
758
|
-
* @param {any} seq object with sequence
|
|
759
|
-
* @return {string[]} array of monomers
|
|
760
|
-
*/
|
|
761
|
-
static splitterAsFasta(seq) {
|
|
762
|
-
return wu(seq.toString().matchAll(WebLogo.monomerRe))
|
|
763
|
-
.map((ma) => {
|
|
764
|
-
let mRes;
|
|
765
|
-
const m = ma[0];
|
|
766
|
-
if (m.length > 1) {
|
|
767
|
-
mRes = ma[1];
|
|
768
|
-
}
|
|
769
|
-
else {
|
|
770
|
-
mRes = m;
|
|
771
|
-
}
|
|
772
|
-
return mRes;
|
|
773
|
-
}).toArray();
|
|
774
|
-
}
|
|
775
|
-
/** Splits Helm string to monomers, but does not replace monomer names to other notation (e.g. for RNA).
|
|
776
|
-
* Only for linear polymers, does not split RNA for ribose and phosphate monomers.
|
|
777
|
-
* @param {string} seq Source string of HELM notation
|
|
778
|
-
* @return {string[]}
|
|
779
|
-
*/
|
|
780
|
-
static splitterAsHelm(seq) {
|
|
781
|
-
WebLogo.helmRe.lastIndex = 0;
|
|
782
|
-
const ea = WebLogo.helmRe.exec(seq.toString());
|
|
783
|
-
const inSeq = ea ? ea[2] : null;
|
|
784
|
-
const mmPostProcess = (mm) => {
|
|
785
|
-
WebLogo.helmPp1Re.lastIndex = 0;
|
|
786
|
-
const pp1M = WebLogo.helmPp1Re.exec(mm);
|
|
787
|
-
if (pp1M && pp1M.length >= 2)
|
|
788
|
-
return pp1M[1];
|
|
789
|
-
else
|
|
790
|
-
return mm;
|
|
791
|
-
};
|
|
792
|
-
const mmList = inSeq ? inSeq.split('.') : [];
|
|
793
|
-
return mmList.map(mmPostProcess);
|
|
794
|
-
}
|
|
795
|
-
/** Gets method to split sequence by separator
|
|
796
|
-
* @param {string} separator
|
|
797
|
-
* @param limit
|
|
798
|
-
* @return {SplitterFunc}
|
|
799
|
-
*/
|
|
800
|
-
static getSplitterWithSeparator(separator, limit = undefined) {
|
|
801
|
-
return (seq) => {
|
|
802
|
-
return seq.split(separator, limit);
|
|
803
|
-
};
|
|
804
|
-
}
|
|
805
|
-
/** Get splitter method to split sequences to monomers
|
|
806
|
-
* @param {string} units
|
|
807
|
-
* @param {string} separator
|
|
808
|
-
* @param limit
|
|
809
|
-
* @return {SplitterFunc}
|
|
810
|
-
*/
|
|
811
|
-
static getSplitter(units, separator, limit = undefined) {
|
|
812
|
-
if (units.toLowerCase().startsWith("fasta" /* NOTATION.FASTA */))
|
|
813
|
-
return WebLogo.splitterAsFasta;
|
|
814
|
-
else if (units.toLowerCase().startsWith("separator" /* NOTATION.SEPARATOR */))
|
|
815
|
-
return WebLogo.getSplitterWithSeparator(separator, limit);
|
|
816
|
-
else if (units.toLowerCase().startsWith("helm" /* NOTATION.HELM */))
|
|
817
|
-
return WebLogo.splitterAsHelm;
|
|
818
|
-
else
|
|
819
|
-
throw new Error(`Unexpected units ${units} .`);
|
|
820
|
-
// TODO: Splitter for HELM
|
|
821
|
-
}
|
|
822
|
-
/** Generate splitter function for sequence column
|
|
823
|
-
* @param {DG.Column} col
|
|
824
|
-
* @return {SplitterFunc} Splitter function
|
|
825
|
-
*/
|
|
826
|
-
static getSplitterForColumn(col) {
|
|
827
|
-
if (col.semType !== DG.SEMTYPE.MACROMOLECULE)
|
|
828
|
-
throw new Error(`Get splitter for semType "${DG.SEMTYPE.MACROMOLECULE}" only.`);
|
|
829
|
-
const units = col.getTag(DG.TAGS.UNITS);
|
|
830
|
-
const separator = col.getTag(UnitsHandler.TAGS.separator);
|
|
831
|
-
return WebLogo.getSplitter(units, separator);
|
|
832
|
-
}
|
|
833
|
-
/** Convert long monomer names to short ones */
|
|
834
|
-
static monomerToShort(amino, maxLengthOfMonomer) {
|
|
835
|
-
var _a, _b;
|
|
836
|
-
const shortAminoMatch = amino.match(WebLogo.longMonomerPartRe);
|
|
837
|
-
const needAddDots = amino.length > maxLengthOfMonomer || ((_a = shortAminoMatch === null || shortAminoMatch === void 0 ? void 0 : shortAminoMatch.length) !== null && _a !== void 0 ? _a : 0) > 1;
|
|
838
|
-
const shortAmino = (_b = shortAminoMatch === null || shortAminoMatch === void 0 ? void 0 : shortAminoMatch[0]) !== null && _b !== void 0 ? _b : ' ';
|
|
839
|
-
return !needAddDots ? shortAmino : shortAmino.substring(0, maxLengthOfMonomer) + '…';
|
|
840
|
-
}
|
|
841
674
|
}
|
|
842
675
|
WebLogo.residuesSet = 'nucleotides';
|
|
843
676
|
WebLogo.viewerCount = -1;
|
|
844
|
-
WebLogo.monomerRe = /\[(\w+)\]|(\w)|(-)/g;
|
|
845
|
-
/** Only some of the synonyms. These were obtained from the clustered oligopeptide dataset. */
|
|
846
|
-
WebLogo.aaSynonyms = {
|
|
847
|
-
'[MeNle]': 'L',
|
|
848
|
-
'[MeA]': 'A',
|
|
849
|
-
'[MeG]': 'G',
|
|
850
|
-
'[MeF]': 'F',
|
|
851
|
-
};
|
|
852
|
-
WebLogo.helmRe = /(PEPTIDE1|DNA1|RNA1)\{([^}]+)}/g;
|
|
853
|
-
WebLogo.helmPp1Re = /\[([^\[\]]+)]/g;
|
|
854
|
-
WebLogo.longMonomerPartRe = /(\w+)/g;
|
|
855
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWxvZ28uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3ZWItbG9nby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssSUFBSSxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEMsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0QyxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEIsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFFN0IsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGlEQUFpRCxDQUFDO0FBQ3ZFLE9BQU8sRUFBQyxZQUFZLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxpREFBaUQsQ0FBQztBQUMvRixPQUFPLEVBQUMsVUFBVSxFQUFFLGtCQUFrQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBQyxXQUFXLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRSxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFHOUMsT0FBTyxFQUFXLFlBQVksRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBUzlELElBQUssY0FHSjtBQUhELFdBQUssY0FBYztJQUNqQixxQ0FBbUIsQ0FBQTtJQUNuQiwrQkFBYSxDQUFBO0FBQ2YsQ0FBQyxFQUhJLGNBQWMsS0FBZCxjQUFjLFFBR2xCO0FBWUQ7OztHQUdHO0FBQ0gsaUJBQWlCLENBQUMsU0FBUyxDQUFDLGlCQUFpQixHQUFHLFVBQVMsS0FBaUIsRUFBRSxDQUFTO0lBQ25GLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQzFDLE9BQU8sSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENB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QUFHLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cbmltcG9ydCB3dSBmcm9tICd3dSc7XG5pbXBvcnQgKiBhcyByeGpzIGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge1ZlY3Rvcn0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdHlwZS1kZWNsYXJhdGlvbnMnO1xuaW1wb3J0IHt2ZWN0b3JMZW5ndGgsIHZlY3RvckRvdFByb2R1Y3R9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3ZlY3Rvci1vcGVyYXRpb25zJztcbmltcG9ydCB7QW1pbm9hY2lkcywgQW1pbm9hY2lkc1BhbGV0dGVzfSBmcm9tICcuLi9hbWlub2FjaWRzJztcbmltcG9ydCB7TnVjbGVvdGlkZXMsIE51Y2xlb3RpZGVzUGFsZXR0ZXN9IGZyb20gJy4uL251Y2xlb3RpZGVzJztcbmltcG9ydCB7VW5rbm93blNlcVBhbGV0dGVzfSBmcm9tICcuLi91bmtub3duJztcbmltcG9ydCB7U2VxUGFsZXR0ZX0gZnJvbSAnLi4vc2VxLXBhbGV0dGVzJztcbmltcG9ydCB7U3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7Tk9UQVRJT04sIFVuaXRzSGFuZGxlcn0gZnJvbSAnLi4vdXRpbHMvdW5pdHMtaGFuZGxlcic7XG5pbXBvcnQge1NsaWRlck9wdGlvbnN9IGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cbmRlY2xhcmUgbW9kdWxlICdkYXRhZ3Jvay1hcGkvc3JjL2dyaWQnIHtcbiAgaW50ZXJmYWNlIFJlY3Qge1xuICAgIGNvbnRhaW5zKHg6IG51bWJlciwgeTogbnVtYmVyKTogYm9vbGVhbjtcbiAgfVxufVxuXG5lbnVtIFBvc2l0aW9uSGVpZ2h0IHtcbiAgRW50cm9weSA9ICdFbnRyb3B5JyxcbiAgZnVsbCA9ICcxMDAlJyxcbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTENhbnZhc0VsZW1lbnQge1xuICAgIGdldEN1cnNvclBvc2l0aW9uKGV2ZW50OiBNb3VzZUV2ZW50LCByOiBudW1iZXIpOiBERy5Qb2ludDtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBNb25vbWVyRnJlcXMgPSB7IFttOiBzdHJpbmddOiBudW1iZXIgfTtcbmV4cG9ydCB0eXBlIFNlcUNvbFN0YXRzID0geyBmcmVxOiBNb25vbWVyRnJlcXMsIHNhbWVMZW5ndGg6IGJvb2xlYW4gfVxuZXhwb3J0IHR5cGUgU3BsaXR0ZXJGdW5jID0gKHNlcTogc3RyaW5nKSA9PiBzdHJpbmdbXTtcblxuLyoqQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudFxuICogQHBhcmFtIHtudW1iZXJ9IHIgZGV2aWNlUGl4ZWxSYXRpb25cbiAqIEByZXR1cm4ge0RHLlBvaW50fSBjYW52YXMgcmVsYXRlZCBjdXJzb3IgcG9zaXRpb25cbiAqL1xuSFRNTENhbnZhc0VsZW1lbnQucHJvdG90eXBlLmdldEN1cnNvclBvc2l0aW9uID0gZnVuY3Rpb24oZXZlbnQ6IE1vdXNlRXZlbnQsIHI6IG51bWJlcik6IERHLlBvaW50IHtcbiAgY29uc3QgcmVjdCA9IHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHJldHVybiBuZXcgREcuUG9pbnQoKGV2ZW50LmNsaWVudFggLSByZWN0LmxlZnQpICogciwgKGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcCkgKiByKTtcbn07XG5cbkRHLlJlY3QucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24oeDogbnVtYmVyLCB5OiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRoaXMubGVmdCA8PSB4ICYmIHggPD0gdGhpcy5yaWdodCAmJiB0aGlzLnRvcCA8PSB5ICYmIHkgPD0gdGhpcy5ib3R0b207XG59O1xuXG5leHBvcnQgY2xhc3MgUG9zaXRpb25Nb25vbWVySW5mbyB7XG4gIC8qKiBTZXF1ZW5jZXMgY291bnQgd2l0aCBtb25vbWVyIGluIHBvc2l0aW9uICovXG4gIGNvdW50OiBudW1iZXI7XG5cbiAgLyoqIFJlbWVtYmVyIHNjcmVlbiBjb29yZHMgcmVjdCAqL1xuICBib3VuZHM6IERHLlJlY3Q7XG5cbiAgY29uc3RydWN0b3IoY291bnQ6IG51bWJlciA9IDAsIGJvdW5kczogREcuUmVjdCA9IG5ldyBERy5SZWN0KDAsIDAsIDAsIDApKSB7XG4gICAgdGhpcy5jb3VudCA9IGNvdW50O1xuICAgIHRoaXMuYm91bmRzID0gYm91bmRzO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQb3NpdGlvbkluZm8ge1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICBmcmVxOiB7IFttOiBzdHJpbmddOiBQb3NpdGlvbk1vbm9tZXJJbmZvIH07XG4gIHJvd0NvdW50OiBudW1iZXI7XG4gIHN1bUZvckhlaWdodENhbGM6IG51bWJlcjtcblxuICAvKiogZnJlcSA9IHt9LCByb3dDb3VudCA9IDBcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBwb3NpdGlvbiAoJzExMUEnLCAnMTExLjEnLCBldGMpXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzdW1Gb3JIZWlnaHRDYWxjIFN1bSBvZiBhbGwgbW9ub21lciBjb3VudHMgZm9yIGhlaWdodCBjYWxjdWxhdGlvblxuICAgKiBAcGFyYW0ge251bWJlcn0gcm93Q291bnQgQ291bnQgb2YgZWxlbWVudHMgaW4gY29sdW1uXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IGZyZXEgZnJlcXVlbmN5IG9mIG1vbm9tZXJzIGluIHBvc2l0aW9uXG4gICAqL1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIGZyZXE6IHsgW206IHN0cmluZ106IFBvc2l0aW9uTW9ub21lckluZm8gfSA9IHt9LCByb3dDb3VudDogbnVtYmVyID0gMCwgc3VtRm9ySGVpZ2h0Q2FsYzogbnVtYmVyID0gMCkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5mcmVxID0gZnJlcTtcbiAgICB0aGlzLnJvd0NvdW50ID0gcm93Q291bnQ7XG4gICAgdGhpcy5zdW1Gb3JIZWlnaHRDYWxjID0gc3VtRm9ySGVpZ2h0Q2FsYztcbiAgfVxufVxuXG5cbmV4cG9ydCBjbGFzcyBXZWJMb2dvIGV4dGVuZHMgREcuSnNWaWV3ZXIge1xuICBwdWJsaWMgc3RhdGljIHJlc2lkdWVzU2V0ID0gJ251Y2xlb3RpZGVzJztcbiAgcHJpdmF0ZSBzdGF0aWMgdmlld2VyQ291bnQ6IG51bWJlciA9IC0xO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgdmlld2VySWQ6IG51bWJlciA9IC0xO1xuICBwcml2YXRlIHVuaXRzSGFuZGxlcjogVW5pdHNIYW5kbGVyIHwgbnVsbDtcbiAgcHJpdmF0ZSBpbml0aWFsaXplZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vIHByaXZhdGUgcmVhZG9ubHkgY29sb3JTY2hlbWU6IENvbG9yU2NoZW1lID0gQ29sb3JTY2hlbWVzW051Y2xlb3RpZGVzV2ViTG9nby5yZXNpZHVlc1NldF07XG4gIHByb3RlY3RlZCBjcDogU2VxUGFsZXR0ZSB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgaG9zdD86IEhUTUxEaXZFbGVtZW50O1xuICBwcml2YXRlIG1zZ0hvc3Q/OiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50O1xuICBwcml2YXRlIHNsaWRlcjogREcuUmFuZ2VTbGlkZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGV4dEJhc2VsaW5lOiBDYW52YXNUZXh0QmFzZWxpbmU7XG5cbiAgcHJpdmF0ZSBheGlzSGVpZ2h0OiBudW1iZXIgPSAxMjtcblxuICBwcml2YXRlIHNlcUNvbDogREcuQ29sdW1uPHN0cmluZz4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzcGxpdHRlcjogU3BsaXR0ZXJGdW5jIHwgbnVsbCA9IG51bGw7XG4gIC8vIHByaXZhdGUgbWF4TGVuZ3RoOiBudW1iZXIgPSAxMDA7XG4gIHByaXZhdGUgcG9zaXRpb25zOiBQb3NpdGlvbkluZm9bXSA9IFtdO1xuXG4gIHByaXZhdGUgcm93c01hc2tlZDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSByb3dzTnVsbDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSB2aXNpYmxlU2xpZGVyOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgYWxsb3dSZXNpemU6IGJvb2xlYW4gPSB0cnVlO1xuICBwcml2YXRlIGN1cnJlbnRSYW5nZTogbnVtYmVyID0gMDtcblxuICAvLyBWaWV3ZXIncyBwcm9wZXJ0aWVzIChsaWtlbHkgdGhleSBzaG91bGQgYmUgcHVibGljIHNvIHRoYXQgdGhleSBjYW4gYmUgc2V0IG91dHNpZGUpXG4gIHByaXZhdGUgX3Bvc2l0aW9uV2lkdGg6IG51bWJlcjtcbiAgcHVibGljIHBvc2l0aW9uV2lkdGg6IG51bWJlcjtcbiAgcHVibGljIG1pbkhlaWdodDogbnVtYmVyO1xuICBwdWJsaWMgYmFja2dyb3VuZENvbG9yOiBudW1iZXIgPSAweEZGRkZGRkZGO1xuICBwdWJsaWMgbWF4SGVpZ2h0OiBudW1iZXI7XG4gIHB1YmxpYyBza2lwRW1wdHlTZXF1ZW5jZXM6IGJvb2xlYW47XG4gIHB1YmxpYyBzZXF1ZW5jZUNvbHVtbk5hbWU6IHN0cmluZyB8IG51bGw7XG4gIHB1YmxpYyBwb3NpdGlvbk1hcmdpblN0YXRlOiBzdHJpbmc7XG4gIHB1YmxpYyBwb3NpdGlvbk1hcmdpbjogbnVtYmVyID0gMDtcbiAgcHVibGljIHN0YXJ0UG9zaXRpb25OYW1lOiBzdHJpbmcgfCBudWxsO1xuICBwdWJsaWMgZW5kUG9zaXRpb25OYW1lOiBzdHJpbmcgfCBudWxsO1xuICBwdWJsaWMgZml4V2lkdGg6IGJvb2xlYW47XG4gIHB1YmxpYyB2ZXJ0aWNhbEFsaWdubWVudDogc3RyaW5nIHwgbnVsbDtcbiAgcHVibGljIGhvcml6b250YWxBbGlnbm1lbnQ6IHN0cmluZyB8IG51bGw7XG4gIHB1YmxpYyBmaXRBcmVhOiBib29sZWFuO1xuICBwdWJsaWMgc2hyaW5rRW1wdHlUYWlsOiBib29sZWFuO1xuICBwdWJsaWMgc2tpcEVtcHR5UG9zaXRpb25zOiBib29sZWFuO1xuICBwdWJsaWMgcG9zaXRpb25IZWlnaHQ6IHN0cmluZztcblxuICBwcml2YXRlIHBvc2l0aW9uTmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgcHJpdmF0ZSBzdGFydFBvc2l0aW9uOiBudW1iZXIgPSAtMTtcblxuICBwcml2YXRlIGVuZFBvc2l0aW9uOiBudW1iZXIgPSAtMTtcblxuICAvKiogRm9yIHN0YXJ0UG9zaXRpb24gZXF1YWxzIHRvIGVuZFBvc2l0aW9uIExlbmd0aCBpcyAxICovXG4gIHByaXZhdGUgZ2V0IExlbmd0aCgpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLnNraXBFbXB0eVBvc2l0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb25zLmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRQb3NpdGlvbiA8PSB0aGlzLmVuZFBvc2l0aW9uID8gdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMuc3RhcnRQb3NpdGlvbiArIDEgOiAwO1xuICB9XG5cbiAgLyoqIENhbGN1bGF0ZSBuZXcgcG9zaXRpb24gZGF0YSBiYXNpYyBvbiB7QGxpbmsgcG9zaXRpb25NYXJnaW5TdGF0ZX0gYW5kIHtAbGluayBwb3NpdGlvbk1hcmdpbn0gKi9cbiAgcHJpdmF0ZSBnZXQgcG9zaXRpb25XaWR0aFdpdGhNYXJnaW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Bvc2l0aW9uV2lkdGggKyB0aGlzLnBvc2l0aW9uTWFyZ2luVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGdldCBwb3NpdGlvbk1hcmdpblZhbHVlKCkge1xuICAgIGlmICgodGhpcy5wb3NpdGlvbk1hcmdpblN0YXRlID09PSAnYXV0bycpICYmICh0aGlzLnVuaXRzSGFuZGxlcj8uZ2V0QWxwaGFiZXRJc011bHRpY2hhcigpID09PSB0cnVlKSkge1xuICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb25NYXJnaW47XG4gICAgfVxuICAgIGlmICh0aGlzLnBvc2l0aW9uTWFyZ2luU3RhdGUgPT09ICdlbmFibGUnKSB7XG4gICAgICByZXR1cm4gdGhpcy5wb3NpdGlvbk1hcmdpbjtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIC8qKiBDb3VudCBvZiBwb3NpdGlvbiByZW5kZXJlZCBmb3IgY2FsY3VsYXRpb25zIGNvdW50T2ZSZW5kZXJQb3NpdGlvbnMgKi9cbiAgcHJpdmF0ZSBnZXQgY291bnRPZlJlbmRlclBvc2l0aW9ucygpIHtcbiAgICBpZiAodGhpcy5ob3N0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5ob3N0LmNsaWVudFdpZHRoIC8gdGhpcy5wb3NpdGlvbldpZHRoV2l0aE1hcmdpbjtcbiAgfVxuXG4gIC8qKiBQb3NpdGlvbiBvZiBzdGFydCByZW5kZXJpbmcgKi9cbiAgcHJpdmF0ZSBnZXQgZmlyc3RWaXNpYmxlSW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKHRoaXMudmlzaWJsZVNsaWRlcikgPyBNYXRoLmZsb29yKHRoaXMuc2xpZGVyLm1pbikgOiAwO1xuICB9XG5cbiAgcHJpdmF0ZSB2aWV3U3ViczogU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy52aWV3ZXJJZCA9IFdlYkxvZ28udmlld2VyQ291bnQ7XG4gICAgV2ViTG9nby52aWV3ZXJDb3VudCArPSAxO1xuXG4gICAgdGhpcy50ZXh0QmFzZWxpbmUgPSAndG9wJztcbiAgICB0aGlzLnVuaXRzSGFuZGxlciA9IG51bGw7XG5cbiAgICB0aGlzLmJhY2tncm91bmRDb2xvciA9IHRoaXMuaW50KCdiYWNrZ3JvdW5kQ29sb3InLCAweEZGRkZGRkZGKTtcbiAgICB0aGlzLl9wb3NpdGlvbldpZHRoID0gdGhpcy5wb3NpdGlvbldpZHRoID0gdGhpcy5mbG9hdCgncG9zaXRpb25XaWR0aCcsIDE2LyosXG4gICAgICB7ZWRpdG9yOiAnc2xpZGVyJywgbWluOiA0LCBtYXg6IDY0LCBwb3N0Zml4OiAncHgnfSovKTtcbiAgICB0aGlzLm1pbkhlaWdodCA9IHRoaXMuZmxvYXQoJ21pbkhlaWdodCcsIDUwLyosXG4gICAgICB7ZWRpdG9yOiAnc2xpZGVyJywgbWluOiAyNSwgbWF4OiAyNTAsIHBvc3RmaXg6ICdweCd9Ki8pO1xuICAgIHRoaXMubWF4SGVpZ2h0ID0gdGhpcy5mbG9hdCgnbWF4SGVpZ2h0JywgMTAwLyosXG4gICAgICB7ZWRpdG9yOiAnc2xpZGVyJywgbWluOiAyNSwgbWF4OiA1MDAsIHBvc3RmaXg6ICdweCd9Ki8pO1xuXG4gICAgdGhpcy5za2lwRW1wdHlTZXF1ZW5jZXMgPSB0aGlzLmJvb2woJ3NraXBFbXB0eVNlcXVlbmNlcycsIHRydWUpO1xuICAgIHRoaXMuc2VxdWVuY2VDb2x1bW5OYW1lID0gdGhpcy5zdHJpbmcoJ3NlcXVlbmNlQ29sdW1uTmFtZScsIG51bGwpO1xuXG4gICAgdGhpcy5zdGFydFBvc2l0aW9uTmFtZSA9IHRoaXMuc3RyaW5nKCdzdGFydFBvc2l0aW9uTmFtZScsIG51bGwpO1xuICAgIHRoaXMuZW5kUG9zaXRpb25OYW1lID0gdGhpcy5zdHJpbmcoJ2VuZFBvc2l0aW9uTmFtZScsIG51bGwpO1xuXG4gICAgdGhpcy5maXhXaWR0aCA9IHRoaXMuYm9vbCgnZml4V2lkdGgnLCBmYWxzZSk7XG5cbiAgICB0aGlzLnZlcnRpY2FsQWxpZ25tZW50ID0gdGhpcy5zdHJpbmcoJ3ZlcnRpY2FsQWxpZ25tZW50JywgJ21pZGRsZScsXG4gICAgICB7Y2hvaWNlczogWyd0b3AnLCAnbWlkZGxlJywgJ2JvdHRvbSddfSk7XG4gICAgdGhpcy5ob3Jpem9udGFsQWxpZ25tZW50ID0gdGhpcy5zdHJpbmcoJ2hvcml6b250YWxBbGlnbm1lbnQnLCAnY2VudGVyJyxcbiAgICAgIHtjaG9pY2VzOiBbJ2xlZnQnLCAnY2VudGVyJywgJ3JpZ2h0J119KTtcbiAgICB0aGlzLmZpdEFyZWEgPSB0aGlzLmJvb2woJ2ZpdEFyZWEnLCB0cnVlKTtcbiAgICB0aGlzLnNocmlua0VtcHR5VGFpbCA9IHRoaXMuYm9vbCgnc2hyaW5rRW1wdHlUYWlsJywgdHJ1ZSk7XG4gICAgdGhpcy5za2lwRW1wdHlQb3NpdGlvbnMgPSB0aGlzLmJvb2woJ3NraXBFbXB0eVBvc2l0aW9ucycsIGZhbHNlKTtcbiAgICB0aGlzLnBvc2l0aW9uTWFyZ2luU3RhdGUgPSB0aGlzLnN0cmluZygncG9zaXRpb25NYXJnaW5TdGF0ZScsICdhdXRvJyxcbiAgICAgIHtjaG9pY2VzOiBbJ2F1dG8nLCAnZW5hYmxlJywgJ29mZiddfSk7XG4gICAgbGV0IGRlZmF1bHRWYWx1ZUZvclBvc2l0aW9uTWFyZ2luID0gMDtcbiAgICBpZiAodGhpcy5wb3NpdGlvbk1hcmdpblN0YXRlID09PSAnYXV0bycpIHtcbiAgICAgIGRlZmF1bHRWYWx1ZUZvclBvc2l0aW9uTWFyZ2luID0gNDtcbiAgICB9XG4gICAgdGhpcy5wb3NpdGlvbk1hcmdpbiA9IHRoaXMuaW50KCdwb3NpdGlvbk1hcmdpbicsIGRlZmF1bHRWYWx1ZUZvclBvc2l0aW9uTWFyZ2luLCB7bWluOiAwLCBtYXg6IDE2fSk7XG4gICAgdGhpcy5wb3NpdGlvbkhlaWdodCA9IHRoaXMuc3RyaW5nKCdwb3NpdGlvbkhlaWdodCcsIFBvc2l0aW9uSGVpZ2h0LmZ1bGwsIHtjaG9pY2VzOiBbUG9zaXRpb25IZWlnaHQuZnVsbCwgUG9zaXRpb25IZWlnaHQuRW50cm9weV19KTtcblxuICAgIGNvbnN0IHN0eWxlOiBTbGlkZXJPcHRpb25zID0ge3N0eWxlOiAnYmFyYmVsbCd9O1xuICAgIHRoaXMuc2xpZGVyID0gdWkucmFuZ2VTbGlkZXIoMCwgMTAwLCAwLCAyMCwgZmFsc2UsIHN0eWxlKTtcbiAgICB0aGlzLmNhbnZhcyA9IHVpLmNhbnZhcygpO1xuICAgIHRoaXMuY2FudmFzLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdXZWJMb2dvIHNlY29uZCBpbml0aWFsaXphdGlvbiEnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB0aGlzLmhlbHBVcmwgPSAnL2hlbHAvdmlzdWFsaXplL3ZpZXdlcnMvd2ViLWxvZ28ubWQnO1xuXG4gICAgdGhpcy5tc2dIb3N0ID0gdWkuZGl2KCdObyBtZXNzYWdlJyk7XG4gICAgdGhpcy5tc2dIb3N0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICB0aGlzLmNhbnZhcyA9IHVpLmNhbnZhcygpO1xuICAgIHRoaXMuY2FudmFzLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuXG4gICAgLy90aGlzLnNsaWRlci5zZXRTaG93SGFuZGxlcyhmYWxzZSk7XG4gICAgdGhpcy5zbGlkZXIucm9vdC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgdGhpcy5zbGlkZXIucm9vdC5zdHlsZS56SW5kZXggPSAnOTk5JztcbiAgICB0aGlzLnNsaWRlci5yb290LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgdGhpcy5zbGlkZXIucm9vdC5zdHlsZS5oZWlnaHQgPSAnMC43ZW0nO1xuXG4gICAgdGhpcy52aXNpYmxlU2xpZGVyID0gZmFsc2U7XG5cbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzO1xuICAgIHRoaXMuc2xpZGVyLm9uVmFsdWVzQ2hhbmdlZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgaWYgKHBhcmVudC5zbGlkZXIgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoKHBhcmVudC5hbGxvd1Jlc2l6ZSkgJiYgKHBhcmVudC5zbGlkZXIubWF4IC0gcGFyZW50LnNsaWRlci5taW4gIT0gcGFyZW50LmN1cnJlbnRSYW5nZSkgJiYgKHBhcmVudC5zbGlkZXIubWF4IC0gcGFyZW50LnNsaWRlci5taW4gPCBwYXJlbnQuTGVuZ3RoKSkge1xuICAgICAgICBjb25zdCB3aWR0aFNsaWRlciA9IHBhcmVudC5zbGlkZXIubWF4IC0gcGFyZW50LnNsaWRlci5taW4gKyAxO1xuICAgICAgICBjb25zdCB4U2NhbGU6IG51bWJlciA9IChwYXJlbnQucm9vdC5jbGllbnRXaWR0aCAtIHdpZHRoU2xpZGVyICogcGFyZW50LnBvc2l0aW9uTWFyZ2luVmFsdWUpIC8gKHdpZHRoU2xpZGVyICogcGFyZW50Ll9wb3NpdGlvbldpZHRoKTtcbiAgICAgICAgcGFyZW50Ll9wb3NpdGlvbldpZHRoID0gcGFyZW50Ll9wb3NpdGlvbldpZHRoICogeFNjYWxlO1xuICAgICAgICBwYXJlbnQuY3VycmVudFJhbmdlID0gcGFyZW50LnNsaWRlci5tYXggLSBwYXJlbnQuc2xpZGVyLm1pbiArIDE7XG4gICAgICB9XG4gICAgICBwYXJlbnQucmVuZGVyKHRydWUpO1xuICAgIH0pO1xuXG5cbiAgICB0aGlzLmhvc3QgPSB1aS5kaXYoW3RoaXMubXNnSG9zdCwgdGhpcy5jYW52YXNdKTtcblxuICAgIHRoaXMuaG9zdC5zdHlsZS5qdXN0aWZ5Q29udGVudCA9ICdjZW50ZXInO1xuICAgIHRoaXMuaG9zdC5zdHlsZS5hbGlnbkl0ZW1zID0gJ2NlbnRlcic7XG4gICAgdGhpcy5ob3N0LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICB0aGlzLmhvc3Quc3R5bGUuc2V0UHJvcGVydHkoJ292ZXJmbG93JywgJ2hpZGRlbicsICdpbXBvcnRhbnQnKTtcblxuICAgIGNvbnN0IGdldE1vbm9tZXIgPSAocDogREcuUG9pbnQpOiBbbnVtYmVyLCBzdHJpbmcgfCBudWxsLCBQb3NpdGlvbk1vbm9tZXJJbmZvIHwgbnVsbF0gPT4ge1xuICAgICAgY29uc3QgY2FsY3VsYXRlZFggPSBwLnggKyB0aGlzLmZpcnN0VmlzaWJsZUluZGV4ICogdGhpcy5wb3NpdGlvbldpZHRoV2l0aE1hcmdpbjtcbiAgICAgIGNvbnN0IGpQb3MgPSBNYXRoLmZsb29yKHAueCAvIHRoaXMucG9zaXRpb25XaWR0aFdpdGhNYXJnaW4gKyB0aGlzLmZpcnN0VmlzaWJsZUluZGV4KTtcbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5wb3NpdGlvbnNbalBvc107XG5cbiAgICAgIGlmIChwb3NpdGlvbiA9PT0gdm9pZCAwKVxuICAgICAgICByZXR1cm4gW2pQb3MsIG51bGwsIG51bGxdO1xuXG4gICAgICBjb25zdCBtb25vbWVyOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBPYmplY3Qua2V5cyhwb3NpdGlvbi5mcmVxKVxuICAgICAgICAuZmluZCgobSkgPT4gcG9zaXRpb24uZnJlcVttXS5ib3VuZHMuY29udGFpbnMoY2FsY3VsYXRlZFgsIHAueSkpO1xuICAgICAgaWYgKG1vbm9tZXIgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIFtqUG9zLCBudWxsLCBudWxsXTtcblxuICAgICAgcmV0dXJuIFtqUG9zLCBtb25vbWVyLCBwb3NpdGlvbi5mcmVxW21vbm9tZXJdXTtcbiAgICB9O1xuXG4gICAgY29uc3QgY29ycmVjdE1vbm9tZXJGaWx0ZXIgPSAoaVJvdzogbnVtYmVyLCBtb25vbWVyOiBzdHJpbmcsIGpQb3M6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3Qgc2VxID0gdGhpcy5zZXFDb2whLmdldChpUm93KTtcbiAgICAgIGNvbnN0IHNlcU0gPSBzZXEgPyB0aGlzLnNwbGl0dGVyIShzZXEpW3RoaXMuc3RhcnRQb3NpdGlvbiArIGpQb3NdIDogbnVsbDtcbiAgICAgIHJldHVybiAoKHNlcU0gPT09IG1vbm9tZXIpIHx8IChzZXFNID09PSAnJyAmJiBtb25vbWVyID09PSAnLScpKSAmJiB0aGlzLmRhdGFGcmFtZS5maWx0ZXIuZ2V0KGlSb3cpO1xuICAgIH07XG5cbiAgICByeGpzLmZyb21FdmVudDxNb3VzZUV2ZW50Pih0aGlzLmNhbnZhcywgJ21vdXNlbW92ZScpLnN1YnNjcmliZSgoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgY29uc3QgYXJncyA9IGUgYXMgTW91c2VFdmVudDtcblxuICAgICAgY29uc3QgcjogbnVtYmVyID0gd2luZG93LmRldmljZVBpeGVsUmF0aW87XG4gICAgICBjb25zdCBjdXJzb3JQOiBERy5Qb2ludCA9IHRoaXMuY2FudmFzLmdldEN1cnNvclBvc2l0aW9uKGFyZ3MsIHIpO1xuICAgICAgY29uc3QgW2pQb3MsIG1vbm9tZXJdID0gZ2V0TW9ub21lcihjdXJzb3JQKTtcbiAgICAgIGlmICh0aGlzLmRhdGFGcmFtZSAmJiB0aGlzLnNlcUNvbCAmJiB0aGlzLnNwbGl0dGVyICYmIG1vbm9tZXIpIHtcbiAgICAgICAgY29uc3Qgcm93Q291bnQgPSB3dS5jb3VudCgpLnRha2UodGhpcy5kYXRhRnJhbWUucm93Q291bnQpLmZpbHRlcihmdW5jdGlvbihpUm93KSB7XG4gICAgICAgICAgcmV0dXJuIGNvcnJlY3RNb25vbWVyRmlsdGVyKGlSb3csIG1vbm9tZXIsIGpQb3MpO1xuICAgICAgICB9KS5yZWR1Y2U8bnVtYmVyPigoY291bnQsIGlSb3cpID0+IGNvdW50ICsgMSwgMCk7XG4gICAgICAgIHVpLnRvb2x0aXAuc2hvdyh1aS5kaXYoW3VpLmRpdihgJHttb25vbWVyfWApLCB1aS5kaXYoYCR7cm93Q291bnR9IHJvd3NgKV0pLCBhcmdzLnggKyAxNiwgYXJncy55ICsgMTYpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdWkudG9vbHRpcC5oaWRlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByeGpzLmZyb21FdmVudDxNb3VzZUV2ZW50Pih0aGlzLmNhbnZhcywgJ21vdXNlZG93bicpLnN1YnNjcmliZSgoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgY29uc3QgYXJncyA9IGUgYXMgTW91c2VFdmVudDtcbiAgICAgIGNvbnN0IHI6IG51bWJlciA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO1xuICAgICAgY29uc3QgW2pQb3MsIG1vbm9tZXJdID0gZ2V0TW9ub21lcih0aGlzLmNhbnZhcy5nZXRDdXJzb3JQb3NpdGlvbihhcmdzLCByKSk7XG5cbiAgICAgIC8vIHByZXZlbnRzIGRlc2VsZWN0IGFsbCByb3dzIGlmIHdlIG1pc3MgbW9ub21lciBib3VuZHNcbiAgICAgIGlmICh0aGlzLmRhdGFGcmFtZSAmJiB0aGlzLnNlcUNvbCAmJiB0aGlzLnNwbGl0dGVyICYmIG1vbm9tZXIpIHtcbiAgICAgICAgdGhpcy5kYXRhRnJhbWUuc2VsZWN0aW9uLmluaXQoZnVuY3Rpb24oaVJvdykge1xuICAgICAgICAgIHJldHVybiBjb3JyZWN0TW9ub21lckZpbHRlcihpUm93LCBtb25vbWVyLCBqUG9zKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByeGpzLmZyb21FdmVudDxXaGVlbEV2ZW50Pih0aGlzLmNhbnZhcywgJ3doZWVsJykuc3Vic2NyaWJlKChlOiBXaGVlbEV2ZW50KSA9PiB7XG4gICAgICBpZiAoIXRoaXMudmlzaWJsZVNsaWRlcilcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3QgY291bnRPZlNjcm9sbFBvc2l0aW9ucyA9IChlLmRlbHRhWSAvIDEwMCkgKiBNYXRoLm1heChNYXRoLmZsb29yKCh0aGlzLmNvdW50T2ZSZW5kZXJQb3NpdGlvbnMpIC8gMiksIDEpO1xuICAgICAgdGhpcy5zbGlkZXIuc2Nyb2xsQnkodGhpcy5zbGlkZXIubWluICsgY291bnRPZlNjcm9sbFBvc2l0aW9ucyk7XG5cbiAgICB9KTtcblxuICAgIHRoaXMudmlld1N1YnMucHVzaCh1aS5vblNpemVDaGFuZ2VkKHRoaXMucm9vdCkuc3Vic2NyaWJlKHRoaXMucm9vdE9uU2l6ZUNoYW5nZWQuYmluZCh0aGlzKSkpO1xuXG4gICAgdGhpcy5yb290LmFwcGVuZCh0aGlzLmhvc3QpO1xuICAgIHRoaXMucm9vdC5hcHBlbmQodGhpcy5zbGlkZXIucm9vdCk7XG5cbiAgICB0aGlzLl9jYWxjdWxhdGUod2luZG93LmRldmljZVBpeGVsUmF0aW8pO1xuICAgIHRoaXMuc2V0U2xpZGVyKCk7XG4gICAgdGhpcy5yZW5kZXIoZmFsc2UpO1xuICB9XG5cbiAgLyoqIEhhbmRsZXIgb2YgY2hhbmdpbmcgc2l6ZSBXZWJMb2dvICovXG4gIHByaXZhdGUgcm9vdE9uU2l6ZUNoYW5nZWQoKTogdm9pZCB7XG4gICAgdGhpcy5fY2FsY3VsYXRlKHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKTtcbiAgICB0aGlzLnNldFNsaWRlcigpO1xuICAgIHRoaXMucmVuZGVyKHRydWUpO1xuICB9XG5cbiAgLyoqIEFzc2lnbnMge0BsaW5rIHNlcUNvbH0gYW5kIHtAbGluayBjcH0gYmFzZWQgb24ge0BsaW5rIHNlcXVlbmNlQ29sdW1uTmFtZX0gYW5kIGNhbGxzIHtAbGluayByZW5kZXJ9KCkuXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZVNlcUNvbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRhRnJhbWUpIHtcbiAgICAgIHRoaXMuc2VxQ29sID0gdGhpcy5zZXF1ZW5jZUNvbHVtbk5hbWUgPyB0aGlzLmRhdGFGcmFtZS5jb2wodGhpcy5zZXF1ZW5jZUNvbHVtbk5hbWUpIDogbnVsbDtcbiAgICAgIGlmICh0aGlzLnNlcUNvbCA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuc2VxQ29sID0gV2ViTG9nby5waWNrVXBTZXFDb2wodGhpcy5kYXRhRnJhbWUpO1xuICAgICAgICB0aGlzLnNlcXVlbmNlQ29sdW1uTmFtZSA9IHRoaXMuc2VxQ29sID8gdGhpcy5zZXFDb2wubmFtZSA6IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zZXFDb2wpIHtcbiAgICAgICAgY29uc3QgdW5pdHM6IHN0cmluZyA9IHRoaXMuc2VxQ29sIS5nZXRUYWcoREcuVEFHUy5VTklUUyk7XG4gICAgICAgIGNvbnN0IHNlcGFyYXRvcjogc3RyaW5nID0gdGhpcy5zZXFDb2whLmdldFRhZyhVbml0c0hhbmRsZXIuVEFHUy5zZXBhcmF0b3IpO1xuICAgICAgICB0aGlzLnNwbGl0dGVyID0gV2ViTG9nby5nZXRTcGxpdHRlcih1bml0cywgc2VwYXJhdG9yKTtcbiAgICAgICAgdGhpcy51bml0c0hhbmRsZXIgPSBuZXcgVW5pdHNIYW5kbGVyKHRoaXMuc2VxQ29sKTtcblxuICAgICAgICB0aGlzLnVwZGF0ZVBvc2l0aW9ucygpO1xuICAgICAgICB0aGlzLmNwID0gV2ViTG9nby5waWNrVXBQYWxldHRlKHRoaXMuc2VxQ29sKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc3BsaXR0ZXIgPSBudWxsO1xuICAgICAgICB0aGlzLnBvc2l0aW9uTmFtZXMgPSBbXTtcbiAgICAgICAgdGhpcy5zdGFydFBvc2l0aW9uID0gLTE7XG4gICAgICAgIHRoaXMuZW5kUG9zaXRpb24gPSAtMTtcbiAgICAgICAgdGhpcy5jcCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cblxuICAvKiogVXBkYXRlcyB7QGxpbmsgcG9zaXRpb25OYW1lc30gYW5kIGNhbGN1bGF0ZXMge0BsaW5rIHN0YXJ0UG9zaXRpb259IGFuZCB7QGxpbmsgZW5kUG9zaXRpb259LlxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVQb3NpdGlvbnMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNlcUNvbClcbiAgICAgIHJldHVybjtcblxuICAgIGxldCBjYXRlZ29yaWVzOiAoc3RyaW5nIHwgbnVsbCkgW107XG4gICAgaWYgKHRoaXMuc2hyaW5rRW1wdHlUYWlsKSB7XG4gICAgICBjb25zdCBpbmRpY2VzOiBJbnQzMkFycmF5ID0gdGhpcy5kYXRhRnJhbWUuZmlsdGVyLmdldFNlbGVjdGVkSW5kZXhlcygpO1xuICAgICAgY2F0ZWdvcmllcyA9IEFycmF5LmZyb20obmV3IFNldChcbiAgICAgICAgQXJyYXkuZnJvbShBcnJheShpbmRpY2VzLmxlbmd0aCkua2V5cygpKS5tYXAoKGk6IG51bWJlcikgPT4gdGhpcy5zZXFDb2whLmdldChpbmRpY2VzW2ldKSkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2F0ZWdvcmllcyA9IHRoaXMuc2VxQ29sLmNhdGVnb3JpZXM7XG4gICAgfVxuICAgIGNvbnN0IG1heExlbmd0aCA9IGNhdGVnb3JpZXMubGVuZ3RoID4gMCA/IE1hdGgubWF4KC4uLmNhdGVnb3JpZXMubWFwKFxuICAgICAgKHMpID0+IHMgIT09IG51bGwgPyB0aGlzLnNwbGl0dGVyIShzKS5sZW5ndGggOiAwKSkgOiAwO1xuXG4gICAgLy8gR2V0IHBvc2l0aW9uIG5hbWVzIGZyb20gZGF0YSBjb2x1bW4gdGFnICdwb3NpdGlvbk5hbWVzJ1xuICAgIGNvbnN0IHBvc2l0aW9uTmFtZXNUeHQgPSB0aGlzLnNlcUNvbC5nZXRUYWcoJ3Bvc2l0aW9uTmFtZXMnKTtcbiAgICAvLyBGYWxsYmFjayBpZiAncG9zaXRpb25OYW1lcycgdGFnIGlzIG5vdCBwcm92aWRlZFxuICAgIHRoaXMucG9zaXRpb25OYW1lcyA9IHBvc2l0aW9uTmFtZXNUeHQgPyBwb3NpdGlvbk5hbWVzVHh0LnNwbGl0KCcsICcpLm1hcCgobikgPT4gbi50cmltKCkpIDpcbiAgICAgIFsuLi5BcnJheShtYXhMZW5ndGgpLmtleXMoKV0ubWFwKChqUG9zKSA9PiBgJHtqUG9zICsgMX1gKTtcblxuICAgIHRoaXMuc3RhcnRQb3NpdGlvbiA9ICh0aGlzLnN0YXJ0UG9zaXRpb25OYW1lICYmIHRoaXMucG9zaXRpb25OYW1lcyAmJlxuICAgICAgdGhpcy5wb3NpdGlvbk5hbWVzLmluY2x1ZGVzKHRoaXMuc3RhcnRQb3NpdGlvbk5hbWUpKSA/XG4gICAgICB0aGlzLnBvc2l0aW9uTmFtZXMuaW5kZXhPZih0aGlzLnN0YXJ0UG9zaXRpb25OYW1lKSA6IDA7XG4gICAgdGhpcy5lbmRQb3NpdGlvbiA9ICh0aGlzLmVuZFBvc2l0aW9uTmFtZSAmJiB0aGlzLnBvc2l0aW9uTmFtZXMgJiZcbiAgICAgIHRoaXMucG9zaXRpb25OYW1lcy5pbmNsdWRlcyh0aGlzLmVuZFBvc2l0aW9uTmFtZSkpID9cbiAgICAgIHRoaXMucG9zaXRpb25OYW1lcy5pbmRleE9mKHRoaXMuZW5kUG9zaXRpb25OYW1lKSA6IChtYXhMZW5ndGggLSAxKTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tJc0hpZGVTbGlkZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZml4V2lkdGggfHwgTWF0aC5mbG9vcih0aGlzLmNhbnZhcy53aWR0aCAvIHRoaXMucG9zaXRpb25XaWR0aFdpdGhNYXJnaW4pID49IHRoaXMuTGVuZ3RoO1xuICB9XG5cbiAgc2V0U2xpZGVyVmlzaWJpbGl0eSh2aXNpYmxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHZpc2libGUpIHtcbiAgICAgIHRoaXMuc2xpZGVyLnJvb3Quc3R5bGUuZGlzcGxheSA9ICdpbmhlcml0JztcbiAgICAgIHRoaXMudmlzaWJsZVNsaWRlciA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2xpZGVyLnJvb3Quc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIHRoaXMudmlzaWJsZVNsaWRlciA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTZXRzIHtAbGluayBzbGlkZXJ9LCBuZWVkZWQgdG8gc2V0IHNsaWRlciBvcHRpb25zIGFuZCB0byB1cGRhdGUgc2xpZGVyIHBvc2l0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBzZXRTbGlkZXIoKTogdm9pZCB7XG4gICAgaWYgKCh0aGlzLnNsaWRlciAhPSBudWxsKSAmJiAodGhpcy5jYW52YXMgIT0gbnVsbCkpIHtcbiAgICAgIGxldCBkaWZmRW5kU2Nyb2xsQW5kU2xpZGVyTWluID0gTWF0aC5mbG9vcih0aGlzLnNsaWRlci5taW4gKyB0aGlzLmNhbnZhcy53aWR0aCAvIHRoaXMucG9zaXRpb25XaWR0aFdpdGhNYXJnaW4pIC0gdGhpcy5MZW5ndGg7XG4gICAgICBkaWZmRW5kU2Nyb2xsQW5kU2xpZGVyTWluID0gZGlmZkVuZFNjcm9sbEFuZFNsaWRlck1pbiA+IDAgPyBkaWZmRW5kU2Nyb2xsQW5kU2xpZGVyTWluIDogMDtcbiAgICAgIGxldCBuZXdNaW4gPSBNYXRoLmZsb29yKHRoaXMuc2xpZGVyLm1pbiAtIGRpZmZFbmRTY3JvbGxBbmRTbGlkZXJNaW4pO1xuICAgICAgbGV0IG5ld01heCA9IE1hdGguZmxvb3IodGhpcy5zbGlkZXIubWluIC0gZGlmZkVuZFNjcm9sbEFuZFNsaWRlck1pbikgKyBNYXRoLmZsb29yKHRoaXMuY2FudmFzLndpZHRoIC8gdGhpcy5wb3NpdGlvbldpZHRoV2l0aE1hcmdpbik7XG4gICAgICBpZiAodGhpcy5jaGVja0lzSGlkZVNsaWRlcigpKSB7XG4gICAgICAgIG5ld01pbiA9IDA7XG4gICAgICAgIG5ld01heCA9IHRoaXMuTGVuZ3RoIC0gMTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2xpZGVyLnNldFZhbHVlcygwLCB0aGlzLkxlbmd0aCxcbiAgICAgICAgbmV3TWluLCBuZXdNYXgpO1xuICAgIH1cbiAgfVxuXG5cbiAgLyoqIEhhbmRsZXIgb2YgcHJvcGVydHkgY2hhbmdlIGV2ZW50cy4gKi9cbiAgcHVibGljIG92ZXJyaWRlIG9uUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5OiBERy5Qcm9wZXJ0eSk6IHZvaWQge1xuICAgIHN1cGVyLm9uUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5KTtcblxuICAgIHN3aXRjaCAocHJvcGVydHkubmFtZSkge1xuICAgIGNhc2UgJ3NlcXVlbmNlQ29sdW1uTmFtZSc6XG4gICAgICB0aGlzLnVwZGF0ZVNlcUNvbCgpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc3RhcnRQb3NpdGlvbk5hbWUnOlxuICAgICAgdGhpcy51cGRhdGVTZXFDb2woKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2VuZFBvc2l0aW9uTmFtZSc6XG4gICAgICB0aGlzLnVwZGF0ZVNlcUNvbCgpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncG9zaXRpb25XaWR0aCc6XG4gICAgICB0aGlzLl9wb3NpdGlvbldpZHRoID0gdGhpcy5wb3NpdGlvbldpZHRoO1xuICAgICAgdGhpcy5zZXRTbGlkZXIoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2ZpeFdpZHRoJzpcbiAgICAgIHRoaXMuc2V0U2xpZGVyKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdmaXRBcmVhJzpcbiAgICAgIHRoaXMuc2V0U2xpZGVyKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzaHJpbmtFbXB0eVRhaWwnOlxuICAgICAgdGhpcy51cGRhdGVQb3NpdGlvbnMoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NraXBFbXB0eVBvc2l0aW9ucyc6XG4gICAgICB0aGlzLnVwZGF0ZVBvc2l0aW9ucygpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncG9zaXRpb25NYXJnaW4nOlxuICAgICAgdGhpcy5zZXRTbGlkZXIoKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHRoaXMucmVuZGVyKHRydWUpO1xuICB9XG5cbiAgLyoqIEFkZCBmaWx0ZXIgaGFuZGxlcnMgd2hlbiB0YWJsZSBpcyBhIGF0dGFjaGVkICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25UYWJsZUF0dGFjaGVkKCkge1xuICAgIHN1cGVyLm9uVGFibGVBdHRhY2hlZCgpO1xuXG4gICAgY29uc3QgZGF0YUZyYW1lVHh0OiBzdHJpbmcgPSB0aGlzLmRhdGFGcmFtZSA/ICdkYXRhJyA6ICdudWxsJztcbiAgICBjb25zb2xlLmRlYnVnKGBiaW86IFdlYkxvZ288JHt0aGlzLnZpZXdlcklkfT4ub25UYWJsZUF0dGFjaGVkKCBkYXRhRnJhbWUgPSAke2RhdGFGcmFtZVR4dH0gKSBzdGFydGApO1xuXG4gICAgdGhpcy51cGRhdGVTZXFDb2woKTtcblxuICAgIGlmICh0aGlzLmRhdGFGcmFtZSAhPT0gdm9pZCAwKSB7XG4gICAgICB0aGlzLnN1YnMucHVzaCh0aGlzLmRhdGFGcmFtZS5zZWxlY3Rpb24ub25DaGFuZ2VkLnN1YnNjcmliZSgoXykgPT4gdGhpcy5yZW5kZXIoKSkpO1xuICAgICAgdGhpcy5zdWJzLnB1c2godGhpcy5kYXRhRnJhbWUuZmlsdGVyLm9uQ2hhbmdlZC5zdWJzY3JpYmUoKF8pID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVQb3NpdGlvbnMoKTtcbiAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICB0aGlzLmluaXQoKTtcbiAgICBjb25zb2xlLmRlYnVnKGBiaW86IFdlYkxvZ288JHt0aGlzLnZpZXdlcklkfT4ub25UYWJsZUF0dGFjaGVkKCkgZW5kYCk7XG4gIH1cblxuICAvKiogUmVtb3ZlIGFsbCBoYW5kbGVycyB3aGVuIHRhYmxlIGlzIGEgZGV0YWNoICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgZGV0YWNoKCkge1xuICAgIGNvbnN0IGRhdGFGcmFtZVR4dCA9IGAke3RoaXMuZGF0YUZyYW1lID8gJ2RhdGEnIDogJ251bGwnfWA7XG4gICAgY29uc29sZS5kZWJ1ZyhgYmlvOiBXZWJMb2dvPCR7dGhpcy52aWV3ZXJJZH0+Lm9uVGFibGVBdHRhY2hlZCggZGF0YUZyYW1lID0gJHtkYXRhRnJhbWVUeHR9ICkgc3RhcnRgKTtcbiAgICBzdXBlci5kZXRhY2goKTtcblxuICAgIHRoaXMudmlld1N1YnMuZm9yRWFjaCgoc3ViKSA9PiBzdWIudW5zdWJzY3JpYmUoKSk7XG4gICAgdGhpcy5ob3N0IS5yZW1vdmUoKTtcbiAgICB0aGlzLm1zZ0hvc3QgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5ob3N0ID0gdW5kZWZpbmVkO1xuXG4gICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIGNvbnNvbGUuZGVidWcoYGJpbzogV2ViTG9nbzwke3RoaXMudmlld2VySWR9Pi5vblRhYmxlQXR0YWNoZWQoKSBlbmRgKTtcbiAgfVxuXG4gIC8qKiBIZWxwZXIgZnVuY3Rpb24gZm9yIHJlbmRlcmluZyAqL1xuICBwcm90ZWN0ZWQgX251bGxTZXF1ZW5jZShmaWxsZXJSZXNpZHVlID0gJ1gnKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuc2tpcEVtcHR5U2VxdWVuY2VzKVxuICAgICAgcmV0dXJuIG5ldyBBcnJheSh0aGlzLkxlbmd0aCkuZmlsbChmaWxsZXJSZXNpZHVlKS5qb2luKCcnKTtcblxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8qKiBIZWxwZXIgZnVuY3Rpb24gZm9yIHJlbW92ZSBlbXB0eSBwb3NpdGlvbnMgKi9cbiAgLy8gVE9ETzogdXNlIHRoaXMgZnVuY3Rpb24gaW4gZnJvbSBjb3JlXG4gIHByb3RlY3RlZCByZW1vdmVXaGVyZShhcnJheTogQXJyYXk8YW55PiwgcHJlZGljYXRlOiAoVDogYW55KSA9PiBib29sZWFuKTogQXJyYXk8YW55PiB7XG4gICAgbGV0IGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICBsZXQgdXBkYXRlSXRlcmF0b3IgPSAwO1xuICAgIGZvciAobGV0IGRlbGV0ZUl0ZXJhdG9yID0gMDsgZGVsZXRlSXRlcmF0b3IgPCBsZW5ndGg7IGRlbGV0ZUl0ZXJhdG9yKyspIHtcbiAgICAgIGlmICghcHJlZGljYXRlKGFycmF5W2RlbGV0ZUl0ZXJhdG9yXSkpIHtcbiAgICAgICAgYXJyYXlbdXBkYXRlSXRlcmF0b3JdID0gYXJyYXlbZGVsZXRlSXRlcmF0b3JdO1xuICAgICAgICB1cGRhdGVJdGVyYXRvcisrO1xuICAgICAgfVxuICAgIH1cbiAgICBhcnJheS5sZW5ndGggPSB1cGRhdGVJdGVyYXRvcjtcbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cblxuXG4gIC8qKiBGdW5jdGlvbiBmb3IgcmVtb3ZpbmcgZW1wdHkgcG9zaXRpb25zICovXG4gIHByb3RlY3RlZCBfcmVtb3ZlRW1wdHlQb3NpdGlvbnMoKSB7XG4gICAgaWYgKHRoaXMuc2tpcEVtcHR5UG9zaXRpb25zKSB7XG4gICAgICB0aGlzLnJlbW92ZVdoZXJlKHRoaXMucG9zaXRpb25zLCBpdGVtID0+IGl0ZW0/LmZyZXFbJy0nXT8uY291bnQgPT09IGl0ZW0ucm93Q291bnQpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBfY2FsY3VsYXRlKHI6IG51bWJlcikge1xuICAgIGlmICghdGhpcy5ob3N0IHx8ICF0aGlzLnNlcUNvbCB8fCAhdGhpcy5kYXRhRnJhbWUpXG4gICAgICByZXR1cm47XG4gICAgdGhpcy51bml0c0hhbmRsZXIgPSBuZXcgVW5pdHNIYW5kbGVyKHRoaXMuc2VxQ29sKTtcblxuICAgIHRoaXMuY2FsY1NpemUoKTtcblxuICAgIHRoaXMucG9zaXRpb25zID0gbmV3IEFycmF5KHRoaXMuc3RhcnRQb3NpdGlvbiA8PSB0aGlzLmVuZFBvc2l0aW9uID8gdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMuc3RhcnRQb3NpdGlvbiArIDEgOiAwKTtcbiAgICBmb3IgKGxldCBqUG9zID0gMDsgalBvcyA8IHRoaXMuTGVuZ3RoOyBqUG9zKyspIHtcbiAgICAgIGNvbnN0IHBvc05hbWU6IHN0cmluZyA9IHRoaXMucG9zaXRpb25OYW1lc1t0aGlzLnN0YXJ0UG9zaXRpb24gKyBqUG9zXTtcbiAgICAgIHRoaXMucG9zaXRpb25zW2pQb3NdID0gbmV3IFBvc2l0aW9uSW5mbyhwb3NOYW1lKTtcbiAgICB9XG5cbiAgICAvLyAyMDIyLTA1LTA1IGFza2Fsa2luIGluc3RydWN0ZWQgdG8gc2hvdyBXZWJMb2dvIGJhc2VkIG9uIGZpbHRlciAobm90IHNlbGVjdGlvbilcbiAgICBjb25zdCBpbmRpY2VzID0gdGhpcy5kYXRhRnJhbWUuZmlsdGVyLmdldFNlbGVjdGVkSW5kZXhlcygpO1xuICAgIC8vIGNvbnN0IGluZGljZXMgPSB0aGlzLmRhdGFGcmFtZS5zZWxlY3Rpb24udHJ1ZUNvdW50ID4gMCA/IHRoaXMuZGF0YUZyYW1lLnNlbGVjdGlvbi5nZXRTZWxlY3RlZEluZGV4ZXMoKSA6XG4gICAgLy8gICB0aGlzLmRhdGFGcmFtZS5maWx0ZXIuZ2V0U2VsZWN0ZWRJbmRleGVzKCk7XG5cbiAgICB0aGlzLnJvd3NNYXNrZWQgPSBpbmRpY2VzLmxlbmd0aDtcbiAgICB0aGlzLnJvd3NOdWxsID0gMDtcblxuICAgIGZvciAoY29uc3QgaSBvZiBpbmRpY2VzKSB7XG4gICAgICBsZXQgczogc3RyaW5nID0gPHN0cmluZz4odGhpcy5zZXFDb2wuZ2V0KGkpKTtcblxuICAgICAgaWYgKCFzKSB7XG4gICAgICAgIHMgPSB0aGlzLl9udWxsU2VxdWVuY2UoKTtcbiAgICAgICAgKyt0aGlzLnJvd3NOdWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzZXFNOiBzdHJpbmdbXSA9IHRoaXMuc3BsaXR0ZXIhKHMpO1xuICAgICAgZm9yIChsZXQgalBvcyA9IDA7IGpQb3MgPCB0aGlzLkxlbmd0aDsgalBvcysrKSB7XG4gICAgICAgIGNvbnN0IHBtSW5mbyA9IHRoaXMucG9zaXRpb25zW2pQb3NdLmZyZXE7XG4gICAgICAgIGNvbnN0IG06IHN0cmluZyA9IHNlcU1bdGhpcy5zdGFydFBvc2l0aW9uICsgalBvc10gfHwgJy0nO1xuICAgICAgICBpZiAoIShtIGluIHBtSW5mbykpXG4gICAgICAgICAgcG1JbmZvW21dID0gbmV3IFBvc2l0aW9uTW9ub21lckluZm8oKTtcbiAgICAgICAgcG1JbmZvW21dLmNvdW50Kys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8jcmVnaW9uIFBvbGlzaCBmcmVxIGNvdW50c1xuICAgIGZvciAobGV0IGpQb3MgPSAwOyBqUG9zIDwgdGhpcy5MZW5ndGg7IGpQb3MrKykge1xuICAgICAgLy8gZGVsZXRlIHRoaXMucG9zaXRpb25zW2pQb3NdLmZyZXFbJy0nXTtcblxuICAgICAgdGhpcy5wb3NpdGlvbnNbalBvc10ucm93Q291bnQgPSAwO1xuICAgICAgZm9yIChjb25zdCBtIGluIHRoaXMucG9zaXRpb25zW2pQb3NdLmZyZXEpXG4gICAgICAgIHRoaXMucG9zaXRpb25zW2pQb3NdLnJvd0NvdW50ICs9IHRoaXMucG9zaXRpb25zW2pQb3NdLmZyZXFbbV0uY291bnQ7XG4gICAgICBpZiAodGhpcy5wb3NpdGlvbkhlaWdodCA9PSBQb3NpdGlvbkhlaWdodC5FbnRyb3B5KSB7XG4gICAgICAgIHRoaXMucG9zaXRpb25zW2pQb3NdLnN1bUZvckhlaWdodENhbGMgPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IG0gaW4gdGhpcy5wb3NpdGlvbnNbalBvc10uZnJlcSkge1xuICAgICAgICAgIGNvbnN0IHBuID0gdGhpcy5wb3NpdGlvbnNbalBvc10uZnJlcVttXS5jb3VudCAvIHRoaXMucG9zaXRpb25zW2pQb3NdLnJvd0NvdW50O1xuICAgICAgICAgIHRoaXMucG9zaXRpb25zW2pQb3NdLnN1bUZvckhlaWdodENhbGMgKz0gLXBuICogTWF0aC5sb2cyKHBuKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyNlbmRyZWdpb25cbiAgICB0aGlzLl9yZW1vdmVFbXB0eVBvc2l0aW9ucygpO1xuXG4gICAgY29uc3QgYWJzb2x1dGVNYXhIZWlnaHQgPSB0aGlzLmNhbnZhcy5oZWlnaHQgLSB0aGlzLmF4aXNIZWlnaHQgKiByO1xuXG4gICAgLy8jcmVnaW9uIENhbGN1bGF0ZSBzY3JlZW5cbiAgICBmb3IgKGxldCBqUG9zID0gMDsgalBvcyA8IHRoaXMuTGVuZ3RoOyBqUG9zKyspIHtcbiAgICAgIGNvbnN0IGZyZXE6IHsgW2M6IHN0cmluZ106IFBvc2l0aW9uTW9ub21lckluZm8gfSA9IHRoaXMucG9zaXRpb25zW2pQb3NdLmZyZXE7XG4gICAgICBjb25zdCByb3dDb3VudCA9IHRoaXMucG9zaXRpb25zW2pQb3NdLnJvd0NvdW50O1xuICAgICAgY29uc3QgYWxwaGFiZXRTaXplID0gdGhpcy5nZXRBbHBoYWJldFNpemUoKTtcbiAgICAgIGlmICgodGhpcy5wb3NpdGlvbkhlaWdodCA9PSBQb3NpdGlvbkhlaWdodC5FbnRyb3B5KSAmJiAoYWxwaGFiZXRTaXplID09IG51bGwpKSB7XG4gICAgICAgIGdyb2suc2hlbGwuZXJyb3IoJ1dlYkxvZ286IGFscGhhYmV0IGlzIHVuZGVmaW5lZC4nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gKHRoaXMucG9zaXRpb25IZWlnaHQgPT0gUG9zaXRpb25IZWlnaHQuRW50cm9weSkgPyAoYWJzb2x1dGVNYXhIZWlnaHQgKiAoTWF0aC5sb2cyKGFscGhhYmV0U2l6ZSkgLSAodGhpcy5wb3NpdGlvbnNbalBvc10uc3VtRm9ySGVpZ2h0Q2FsYykpIC8gTWF0aC5sb2cyKGFscGhhYmV0U2l6ZSkpIDogYWJzb2x1dGVNYXhIZWlnaHQ7XG5cbiAgICAgIGxldCB5OiBudW1iZXIgPSB0aGlzLmF4aXNIZWlnaHQgKiByICsgKGFic29sdXRlTWF4SGVpZ2h0IC0gbWF4SGVpZ2h0IC0gMSk7XG5cbiAgICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhmcmVxKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGlmIChhWzBdICE9PSAnLScgJiYgYlswXSAhPT0gJy0nKVxuICAgICAgICAgIHJldHVybiBiWzFdLmNvdW50IC0gYVsxXS5jb3VudDtcbiAgICAgICAgZWxzZSBpZiAoYVswXSA9PT0gJy0nICYmIGJbMF0gPT09ICctJylcbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgZWxzZSBpZiAoYVswXSA9PT0gJy0nKVxuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgZWxzZSAvKiAoYlswXSA9PT0gJy0nKSAqL1xuICAgICAgICAgIHJldHVybiArMTtcbiAgICAgIH0pO1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgIGNvbnN0IHBtSW5mbzogUG9zaXRpb25Nb25vbWVySW5mbyA9IGVudHJ5WzFdO1xuICAgICAgICAvLyBjb25zdCBtOiBzdHJpbmcgPSBlbnRyeVswXTtcbiAgICAgICAgY29uc3QgaDogbnVtYmVyID0gbWF4SGVpZ2h0ICogcG1JbmZvLmNvdW50IC8gcm93Q291bnQ7XG5cbiAgICAgICAgcG1JbmZvLmJvdW5kcyA9IG5ldyBERy5SZWN0KGpQb3MgKiB0aGlzLnBvc2l0aW9uV2lkdGhXaXRoTWFyZ2luLCB5LCB0aGlzLl9wb3NpdGlvbldpZHRoLCBoKTtcbiAgICAgICAgeSArPSBoO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyNlbmRyZWdpb25cblxuICB9XG5cbiAgLyoqIFJlbmRlciBXZWJMb2dvIHNlbnNpdGl2ZSB0byBjaGFuZ2VzIGluIHBhcmFtcyBvZiByZW5kZXJpbmdcbiAgICpAcGFyYW0ge2Jvb2xlYW59IHJlY2FsYyAtIGluZGljYXRlcyB0aGF0IG5lZWQgdG8gcmVjYWxjdWxhdGUgZGF0YSBmb3IgcmVuZGVyaW5nXG4gICAqL1xuICByZW5kZXIocmVjYWxjID0gdHJ1ZSkge1xuICAgIGlmICh0aGlzLm1zZ0hvc3QpIHtcbiAgICAgIGlmICh0aGlzLnNlcUNvbCAmJiAhdGhpcy5jcCkge1xuICAgICAgICB0aGlzLm1zZ0hvc3QhLmlubmVyVGV4dCA9IGBVbmtub3duIHBhbGV0dGUgKGNvbHVtbiBzZW1UeXBlOiAnJHt0aGlzLnNlcUNvbC5zZW1UeXBlfScpLmA7XG4gICAgICAgIHRoaXMubXNnSG9zdCEuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5tc2dIb3N0IS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdGhpcy5zZXFDb2wgfHwgIXRoaXMuZGF0YUZyYW1lIHx8ICF0aGlzLmNwIHx8IHRoaXMuc3RhcnRQb3NpdGlvbiA9PT0gLTEgfHwgdGhpcy5lbmRQb3NpdGlvbiA9PT0gLTEgfHwgdGhpcy5ob3N0ID09IG51bGwgfHwgdGhpcy5zbGlkZXIgPT0gbnVsbClcbiAgICAgIHJldHVybjtcblxuICAgIGNvbnN0IGcgPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIGlmICghZykgcmV0dXJuO1xuXG4gICAgdGhpcy5zbGlkZXIucm9vdC5zdHlsZS53aWR0aCA9IGAke3RoaXMuaG9zdC5jbGllbnRXaWR0aH1weGA7XG5cbiAgICBjb25zdCByID0gd2luZG93LmRldmljZVBpeGVsUmF0aW87XG5cbiAgICBpZiAocmVjYWxjKVxuICAgICAgdGhpcy5fY2FsY3VsYXRlKHIpO1xuXG4gICAgZy5yZXNldFRyYW5zZm9ybSgpO1xuICAgIGcuZmlsbFN0eWxlID0gREcuQ29sb3IudG9IdG1sKHRoaXMuYmFja2dyb3VuZENvbG9yKTtcbiAgICBnLmZpbGxSZWN0KDAsIDAsIHRoaXMuY2FudmFzLndpZHRoLCB0aGlzLmNhbnZhcy5oZWlnaHQpO1xuICAgIGcudGV4dEJhc2VsaW5lID0gdGhpcy50ZXh0QmFzZWxpbmU7XG5cbiAgICBpZiAodGhpcy5jaGVja0lzSGlkZVNsaWRlcigpKSB7XG4gICAgICB0aGlzLnNldFNsaWRlclZpc2liaWxpdHkoZmFsc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFNsaWRlclZpc2liaWxpdHkodHJ1ZSk7XG4gICAgfVxuXG4gICAgY29uc3QgbWF4Q291bnRPZlJvd3NSZW5kZXJlZCA9IHRoaXMuY291bnRPZlJlbmRlclBvc2l0aW9ucyArIDE7XG4gICAgY29uc3QgZmlyc3RWaXNpYmxlSW5kZXggPSAodGhpcy52aXNpYmxlU2xpZGVyKSA/IE1hdGguZmxvb3IodGhpcy5zbGlkZXIubWluKSA6IDA7XG4gICAgY29uc3QgbGFzdFZpc2libGVJbmRleCA9IE1hdGgubWluKHRoaXMuTGVuZ3RoLCBmaXJzdFZpc2libGVJbmRleCArIG1heENvdW50T2ZSb3dzUmVuZGVyZWQpO1xuXG4gICAgLy8jcmVnaW9uIFBsb3QgcG9zaXRpb25OYW1lc1xuICAgIGNvbnN0IHBvc2l0aW9uRm9udFNpemUgPSAxMCAqIHI7XG4gICAgZy5yZXNldFRyYW5zZm9ybSgpO1xuICAgIGcuZmlsbFN0eWxlID0gJ2JsYWNrJztcbiAgICBnLnRleHRBbGlnbiA9ICdjZW50ZXInO1xuICAgIGcuZm9udCA9IGAke3Bvc2l0aW9uRm9udFNpemUudG9GaXhlZCgxKX1weCBSb2JvdG8sIFJvYm90byBMb2NhbCwgc2Fucy1zZXJpZmA7XG4gICAgY29uc3QgcG9zTmFtZU1heFdpZHRoID0gTWF0aC5tYXgoLi4udGhpcy5wb3NpdGlvbnMubWFwKChwb3MpID0+IGcubWVhc3VyZVRleHQocG9zLm5hbWUpLndpZHRoKSk7XG4gICAgY29uc3QgaFNjYWxlID0gcG9zTmFtZU1heFdpZHRoIDwgKHRoaXMuX3Bvc2l0aW9uV2lkdGggLSAyKSA/IDEgOiAodGhpcy5fcG9zaXRpb25XaWR0aCAtIDIpIC8gcG9zTmFtZU1heFdpZHRoO1xuXG4gICAgZm9yIChsZXQgalBvcyA9IHRoaXMuZmlyc3RWaXNpYmxlSW5kZXg7IGpQb3MgPCBsYXN0VmlzaWJsZUluZGV4OyBqUG9zKyspIHtcbiAgICAgIGNvbnN0IHBvczogUG9zaXRpb25JbmZvID0gdGhpcy5wb3NpdGlvbnNbalBvc107XG4gICAgICBnLnJlc2V0VHJhbnNmb3JtKCk7XG4gICAgICBnLnNldFRyYW5zZm9ybShcbiAgICAgICAgaFNjYWxlLCAwLCAwLCAxLFxuICAgICAgICBqUG9zICogdGhpcy5wb3NpdGlvbldpZHRoV2l0aE1hcmdpbiArIHRoaXMuX3Bvc2l0aW9uV2lkdGggLyAyIC0gdGhpcy5wb3NpdGlvbldpZHRoV2l0aE1hcmdpbiAqIGZpcnN0VmlzaWJsZUluZGV4LCAwKTtcbiAgICAgIGcuZmlsbFRleHQocG9zLm5hbWUsIDAsIDApO1xuICAgIH1cbiAgICAvLyNlbmRyZWdpb24gUGxvdCBwb3NpdGlvbk5hbWVzXG4gICAgY29uc3QgZm9udFN0eWxlID0gJzE2cHggUm9ib3RvLCBSb2JvdG8gTG9jYWwsIHNhbnMtc2VyaWYnO1xuICAgIC8vIEhhY2tzIHRvIHNjYWxlIHVwcGVyY2FzZSBjaGFyYWN0ZXJzIHRvIHRhcmdldCByZWN0YW5nbGVcbiAgICBjb25zdCB1cHBlcmNhc2VMZXR0ZXJBc2NlbnQgPSAwLjI1O1xuICAgIGNvbnN0IHVwcGVyY2FzZUxldHRlckhlaWdodCA9IDEyLjI7XG4gICAgZm9yIChsZXQgalBvcyA9IHRoaXMuZmlyc3RWaXNpYmxlSW5kZXg7IGpQb3MgPCBsYXN0VmlzaWJsZUluZGV4OyBqUG9zKyspIHtcbiAgICAgIGZvciAoY29uc3QgW21vbm9tZXIsIHBtSW5mb10gb2YgT2JqZWN0LmVudHJpZXModGhpcy5wb3NpdGlvbnNbalBvc10uZnJlcSkpIHtcbiAgICAgICAgaWYgKG1vbm9tZXIgIT09ICctJykge1xuICAgICAgICAgIGNvbnN0IG1vbm9tZXJUeHQgPSBXZWJMb2dvLm1vbm9tZXJUb1Nob3J0KG1vbm9tZXIsIDUpO1xuICAgICAgICAgIGNvbnN0IGIgPSBwbUluZm8uYm91bmRzO1xuICAgICAgICAgIGNvbnN0IGxlZnQgPSBiLmxlZnQgLSB0aGlzLnBvc2l0aW9uV2lkdGhXaXRoTWFyZ2luICogdGhpcy5maXJzdFZpc2libGVJbmRleDtcblxuICAgICAgICAgIGcucmVzZXRUcmFuc2Zvcm0oKTtcbiAgICAgICAgICBnLnN0cm9rZVN0eWxlID0gJ2xpZ2h0Z3JheSc7XG4gICAgICAgICAgZy5saW5lV2lkdGggPSAxO1xuICAgICAgICAgIGcucmVjdChsZWZ0LCBiLnRvcCwgYi53aWR0aCwgYi5oZWlnaHQpO1xuICAgICAgICAgIGcuZmlsbFN0eWxlID0gdGhpcy5jcC5nZXQobW9ub21lcikgPz8gdGhpcy5jcC5nZXQoJ290aGVyJyk7XG4gICAgICAgICAgZy50ZXh0QWxpZ24gPSAnbGVmdCc7XG4gICAgICAgICAgZy5mb250ID0gZm9udFN0eWxlO1xuICAgICAgICAgIC8vZy5maWxsUmVjdChiLmxlZnQsIGIudG9wLCBiLndpZHRoLCBiLmhlaWdodCk7XG4gICAgICAgICAgY29uc3QgbVRtOiBUZXh0TWV0cmljcyA9IGcubWVhc3VyZVRleHQobW9ub21lclR4dCk7XG5cbiAgICAgICAgICBnLnNldFRyYW5zZm9ybShcbiAgICAgICAgICAgIGIud2lkdGggLyBtVG0ud2lkdGgsIDAsIDAsIGIuaGVpZ2h0IC8gdXBwZXJjYXNlTGV0dGVySGVpZ2h0LFxuICAgICAgICAgICAgbGVmdCwgYi50b3ApO1xuICAgICAgICAgIGcuZmlsbFRleHQobW9ub21lclR4dCwgMCwgLXVwcGVyY2FzZUxldHRlckFzY2VudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogQ2FsY3VsYXRlIGNhbnZhcyBzaXplIGFuIHBvc2l0aW9uV2lkdGggYW5kIHVwZGF0ZXMgcHJvcGVydGllcyAqL1xuICBwcml2YXRlIGNhbGNTaXplKCkge1xuICAgIGlmICghdGhpcy5ob3N0KVxuICAgICAgcmV0dXJuO1xuXG4gICAgY29uc3QgcjogbnVtYmVyID0gd2luZG93LmRldmljZVBpeGVsUmF0aW87XG5cbiAgICBsZXQgd2lkdGg6IG51bWJlciA9IHRoaXMuTGVuZ3RoICogdGhpcy5wb3NpdGlvbldpZHRoIC8gcjtcbiAgICBsZXQgaGVpZ2h0ID0gTWF0aC5taW4odGhpcy5tYXhIZWlnaHQsIE1hdGgubWF4KHRoaXMubWluSGVpZ2h0LCB0aGlzLnJvb3QuY2xpZW50SGVpZ2h0KSk7XG5cbiAgICBpZiAoKHRoaXMuZml0QXJlYSkgJiYgKCF0aGlzLnZpc2libGVTbGlkZXIpKSB7XG4gICAgICBjb25zdCB5U2NhbGU6IG51bWJlciA9IHRoaXMucm9vdC5jbGllbnRIZWlnaHQgLyBoZWlnaHQ7XG4gICAgICBjb25zdCB4U2NhbGU6IG51bWJlciA9ICh0aGlzLnJvb3QuY2xpZW50V2lkdGggLSB0aGlzLkxlbmd0aCAqIHRoaXMucG9zaXRpb25NYXJnaW5WYWx1ZSkgLyB3aWR0aDtcbiAgICAgIGNvbnN0IHNjYWxlID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oeFNjYWxlLCB5U2NhbGUpKTtcbiAgICAgIHdpZHRoID0gd2lkdGggKiBzY2FsZTtcbiAgICAgIGhlaWdodCA9IGhlaWdodCAqIHNjYWxlO1xuICAgICAgdGhpcy5fcG9zaXRpb25XaWR0aCA9IHRoaXMucG9zaXRpb25XaWR0aCAqIHNjYWxlO1xuICAgIH1cblxuICAgIHdpZHRoID0gdGhpcy5MZW5ndGggKiB0aGlzLnBvc2l0aW9uV2lkdGhXaXRoTWFyZ2luIC8gcjtcblxuICAgIHRoaXMuY2FudmFzLndpZHRoID0gdGhpcy5yb290LmNsaWVudFdpZHRoICogcjtcbiAgICB0aGlzLmNhbnZhcy5zdHlsZS53aWR0aCA9IGAke3RoaXMucm9vdC5jbGllbnRXaWR0aH1weGA7XG5cbiAgICAvLyBjb25zdCBjYW52YXNIZWlnaHQ6IG51bWJlciA9IHdpZHRoID4gdGhpcy5yb290LmNsaWVudFdpZHRoID8gaGVpZ2h0IC0gOCA6IGhlaWdodDtcbiAgICB0aGlzLmhvc3Quc3R5bGUuc2V0UHJvcGVydHkoJ2hlaWdodCcsIGAke2hlaWdodH1weGApO1xuICAgIGNvbnN0IGNhbnZhc0hlaWdodDogbnVtYmVyID0gdGhpcy5ob3N0LmNsaWVudEhlaWdodDtcbiAgICB0aGlzLmNhbnZhcy5oZWlnaHQgPSBjYW52YXNIZWlnaHQgKiByO1xuXG4gICAgLy8gQWRqdXN0IGhvc3QgYW5kIHJvb3Qgd2lkdGhcbiAgICBpZiAodGhpcy5maXhXaWR0aCkge1xuICAgICAgLy8gZnVsbCB3aWR0aCBmb3IgY2FudmFzIGhvc3QgYW5kIHJvb3RcbiAgICAgIHRoaXMucm9vdC5zdHlsZS53aWR0aCA9IHRoaXMuaG9zdC5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcbiAgICAgIHRoaXMucm9vdC5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xuICAgICAgdGhpcy5yb290LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG4gICAgICB0aGlzLmhvc3Quc3R5bGUuc2V0UHJvcGVydHkoJ292ZXJmbG93LXknLCAnaGlkZGVuJywgJ2ltcG9ydGFudCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBhbGxvdyBzY3JvbGwgY2FudmFzIGluIHJvb3RcbiAgICAgIHRoaXMucm9vdC5zdHlsZS53aWR0aCA9IHRoaXMuaG9zdC5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICAgIHRoaXMuaG9zdC5zdHlsZS5vdmVyZmxvd1ggPSAnYXV0byFpbXBvcnRhbnQnO1xuICAgICAgdGhpcy5ob3N0LnN0eWxlLnNldFByb3BlcnR5KCd0ZXh0LWFsaWduJywgdGhpcy5ob3Jpem9udGFsQWxpZ25tZW50KTtcblxuICAgICAgY29uc3Qgc2xpZGVySGVpZ2h0ID0gdGhpcy52aXNpYmxlU2xpZGVyID8gMTAgOiAwO1xuXG4gICAgICAvLyB2ZXJ0aWNhbCBhbGlnbm1lbnRcbiAgICAgIGxldCBob3N0VG9wTWFyZ2luID0gMDtcbiAgICAgIHN3aXRjaCAodGhpcy52ZXJ0aWNhbEFsaWdubWVudCkge1xuICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgaG9zdFRvcE1hcmdpbiA9IDA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbWlkZGxlJzpcbiAgICAgICAgaG9zdFRvcE1hcmdpbiA9IE1hdGgubWF4KDAsICh0aGlzLnJvb3QuY2xpZW50SGVpZ2h0IC0gaGVpZ2h0KSAvIDIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgIGhvc3RUb3BNYXJnaW4gPSBNYXRoLm1heCgwLCB0aGlzLnJvb3QuY2xpZW50SGVpZ2h0IC0gaGVpZ2h0IC0gc2xpZGVySGVpZ2h0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvLyBob3Jpem9udGFsIGFsaWdubWVudFxuICAgICAgbGV0IGhvc3RMZWZ0TWFyZ2luID0gMDtcbiAgICAgIHN3aXRjaCAodGhpcy5ob3Jpem9udGFsQWxpZ25tZW50KSB7XG4gICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgaG9zdExlZnRNYXJnaW4gPSAwO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICAgIGhvc3RMZWZ0TWFyZ2luID0gTWF0aC5tYXgoMCwgKHRoaXMucm9vdC5jbGllbnRXaWR0aCAtIHdpZHRoKSAvIDIpICogcjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgIGhvc3RMZWZ0TWFyZ2luID0gTWF0aC5tYXgoMCwgdGhpcy5yb290LmNsaWVudFdpZHRoIC0gd2lkdGgpICogcjtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB0aGlzLmhvc3Quc3R5bGUuc2V0UHJvcGVydHkoJ21hcmdpbi10b3AnLCBgJHtob3N0VG9wTWFyZ2lufXB4YCwgJ2ltcG9ydGFudCcpO1xuICAgICAgdGhpcy5ob3N0LnN0eWxlLnNldFByb3BlcnR5KCdtYXJnaW4tbGVmdCcsIGAke2hvc3RMZWZ0TWFyZ2lufXB4YCwgJ2ltcG9ydGFudCcpO1xuICAgICAgaWYgKHRoaXMuc2xpZGVyICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5zbGlkZXIucm9vdC5zdHlsZS5zZXRQcm9wZXJ0eSgnbWFyZ2luLXRvcCcsIGAke2hvc3RUb3BNYXJnaW4gKyBjYW52YXNIZWlnaHR9cHhgLCAnaW1wb3J0YW50Jyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnJvb3QuY2xpZW50SGVpZ2h0IDw9IGhlaWdodCkge1xuICAgICAgICB0aGlzLmhvc3Quc3R5bGUuc2V0UHJvcGVydHkoJ2hlaWdodCcsIGAke3RoaXMucm9vdC5jbGllbnRIZWlnaHR9cHhgKTtcbiAgICAgICAgdGhpcy5ob3N0LnN0eWxlLnNldFByb3BlcnR5KCdvdmVyZmxvdy15JywgbnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmhvc3Quc3R5bGUuc2V0UHJvcGVydHkoJ292ZXJmbG93LXknLCAnaGlkZGVuJywgJ2ltcG9ydGFudCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBTZWxlY3RzIGEgc3VpdGFibGUgcGFsZXR0ZSBiYXNlZCBvbiBjb2x1bW4gZGF0YVxuICAgKiBAcGFyYW0ge0RHLkNvbHVtbn0gc2VxQ29sIENvbHVtbiB0byBsb29rIGZvciBhIHBhbGV0dGVcbiAgICogQHBhcmFtIHtudW1iZXJ9ICBtaW5MZW5ndGggbWluaW11bSBsZW5ndGggb2Ygc2VxdWVuY2UgdG8gZGV0ZWN0IHBhbGV0dGUgKGVtcHR5IHN0cmluZ3MgYXJlIGFsbG93ZWQpXG4gICAqIEByZXR1cm4ge1NlcVBhbGV0dGV9IFBhbGV0dGUgY29ycmVzcG9uZGluZyB0byB0aGUgYWxwaGFiZXQgb2YgdGhlIHNlcXVlbmNlcyBpbiB0aGUgY29sdW1uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHBpY2tVcFBhbGV0dGUoc2VxQ29sOiBERy5Db2x1bW4sIG1pbkxlbmd0aDogbnVtYmVyID0gNSk6IFNlcVBhbGV0dGUge1xuICAgIGxldCByZXM6IFNlcVBhbGV0dGUgfCBudWxsO1xuICAgIHN3aXRjaCAoc2VxQ29sLnNlbVR5cGUpIHtcbiAgICBjYXNlIEFtaW5vYWNpZHMuU2VtVHlwZU11bHRpcGxlQWxpZ25tZW50OlxuICAgICAgcmVzID0gQW1pbm9hY2lkc1BhbGV0dGVzLkdyb2tHcm91cHM7XG4gICAgICBicmVhaztcbiAgICBjYXNlIE51Y2xlb3RpZGVzLlNlbVR5cGVNdWx0aXBsZUFsaWdubWVudDpcbiAgICAgIHJlcyA9IE51Y2xlb3RpZGVzUGFsZXR0ZXMuQ2hyb21hdG9ncmFtO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNvbnN0IHN0YXRzOiBTZXFDb2xTdGF0cyA9IFdlYkxvZ28uZ2V0U3RhdHMoc2VxQ29sLCBtaW5MZW5ndGgsIFdlYkxvZ28uc3BsaXR0ZXJBc0Zhc3RhKTtcblxuICAgIGNvbnN0IGFscGhhYmV0Q2FuZGlkYXRlczogW1NldDxzdHJpbmc+LCBTZXFQYWxldHRlXVtdID0gW1xuICAgICAgW25ldyBTZXQoT2JqZWN0LmtleXMoTnVjbGVvdGlkZXMuTmFtZXMpKSwgTnVjbGVvdGlkZXNQYWxldHRlcy5DaHJvbWF0b2dyYW1dLFxuICAgICAgW25ldyBTZXQoT2JqZWN0LmtleXMoQW1pbm9hY2lkcy5OYW1lcykpLCBBbWlub2FjaWRzUGFsZXR0ZXMuR3Jva0dyb3Vwc10sXG4gICAgXTtcbiAgICAvLyBDYWxjdWxhdGUgbGlrZWxpaG9vZHMgZm9yIGFscGhhYmV0X2NhbmRpZGF0ZXNcbiAgICBjb25zdCBhbHBoYWJldENhbmRpZGF0ZXNTaW06IG51bWJlcltdID0gYWxwaGFiZXRDYW5kaWRhdGVzXG4gICAgICAubWFwKChjKSA9PiBXZWJMb2dvLmdldEFscGhhYmV0U2ltaWxhcml0eShzdGF0cy5mcmVxLCBjWzBdKSk7XG4gICAgY29uc3QgbWF4Q29zID0gTWF0aC5tYXgoLi4uYWxwaGFiZXRDYW5kaWRhdGVzU2ltKTtcbiAgICBpZiAobWF4Q29zID4gMC41NSlcbiAgICAgIHJlcyA9IGFscGhhYmV0Q2FuZGlkYXRlc1thbHBoYWJldENhbmRpZGF0ZXNTaW0uaW5kZXhPZihtYXhDb3MpXVsxXTtcbiAgICBlbHNlXG4gICAgICByZXMgPSBVbmtub3duU2VxUGFsZXR0ZXMuQ29sb3I7XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgcHVibGljIGdldEFscGhhYmV0U2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnVuaXRzSGFuZGxlcj8uZ2V0QWxwaGFiZXRTaXplKCkgPz8gMDtcbiAgfVxuXG4gIC8qKiBTdGF0cyBvZiBzZXF1ZW5jZXMgd2l0aCBzcGVjaWZpZWQgc3BsaXR0ZXIgZnVuYywgcmV0dXJucyB7IGZyZXEsIHNhbWVMZW5ndGggfS5cbiAgICogQHBhcmFtIHtERy5Db2x1bW59IHNlcUNvbFxuICAgKiBAcGFyYW0ge251bWJlcn0gbWluTGVuZ3RoXG4gICAqIEBwYXJhbSB7U3BsaXR0ZXJGdW5jfSBzcGxpdHRlclxuICAgKiBAcmV0dXJuIHsgU2VxQ29sU3RhdHMgfSwgc2FtZUxlbmd0aDogYm9vbGVhbiB9IHN0YXRzIG9mIGNvbHVtbiBzZXF1ZW5jZXNcbiAgICovXG4gIHN0YXRpYyBnZXRTdGF0cyhzZXFDb2w6IERHLkNvbHVtbiwgbWluTGVuZ3RoOiBudW1iZXIsIHNwbGl0dGVyOiBTcGxpdHRlckZ1bmMpOiBTZXFDb2xTdGF0cyB7XG4gICAgY29uc3QgZnJlcTogeyBbbTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgICBsZXQgc2FtZUxlbmd0aCA9IHRydWU7XG4gICAgbGV0IGZpcnN0TGVuZ3RoID0gbnVsbDtcblxuICAgIGZvciAoY29uc3Qgc2VxIG9mIHNlcUNvbC5jYXRlZ29yaWVzKSB7XG4gICAgICBjb25zdCBtU2VxID0gc3BsaXR0ZXIoc2VxKTtcblxuICAgICAgaWYgKGZpcnN0TGVuZ3RoID09IG51bGwpXG4gICAgICAgIGZpcnN0TGVuZ3RoID0gbVNlcS5sZW5ndGg7XG4gICAgICBlbHNlIGlmIChtU2VxLmxlbmd0aCAhPT0gZmlyc3RMZW5ndGgpXG4gICAgICAgIHNhbWVMZW5ndGggPSBmYWxzZTtcblxuICAgICAgaWYgKG1TZXEubGVuZ3RoID4gbWluTGVuZ3RoKSB7XG4gICAgICAgIGZvciAoY29uc3QgbSBvZiBtU2VxKSB7XG4gICAgICAgICAgaWYgKCEobSBpbiBmcmVxKSlcbiAgICAgICAgICAgIGZyZXFbbV0gPSAwO1xuICAgICAgICAgIGZyZXFbbV0gKz0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge2ZyZXE6IGZyZXEsIHNhbWVMZW5ndGg6IHNhbWVMZW5ndGh9O1xuICB9XG5cbiAgLyoqIENhbGN1bGF0ZSBzaW1pbGFyaXR5IGluIGN1cnJlbnQgc2VxdWVuY2UgYW5kIGFscGhhYmV0LlxuICAgKiBAcGFyYW0ge01vbm9tZXJGcmVxc30gZnJlcVxuICAgKiBAcGFyYW0ge1NldDxzdHJpbmc+fSBhbHBoYWJldFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZ2FwU3ltYm9sXG4gICAqIEByZXR1cm4ge251bWJlcn0gQ29zaW5lIHNpbWlsYXJpdHlcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0QWxwaGFiZXRTaW1pbGFyaXR5KGZyZXE6IE1vbm9tZXJGcmVxcywgYWxwaGFiZXQ6IFNldDxzdHJpbmc+LCBnYXBTeW1ib2w6IHN0cmluZyA9ICctJyk6IG51bWJlciB7XG4gICAgY29uc3Qga2V5cyA9IG5ldyBTZXQ8c3RyaW5nPihbLi4ubmV3IFNldChPYmplY3Qua2V5cyhmcmVxKSksIC4uLmFscGhhYmV0XSk7XG4gICAga2V5cy5kZWxldGUoZ2FwU3ltYm9sKTtcblxuICAgIGNvbnN0IGZyZXFBOiBudW1iZXJbXSA9IFtdO1xuICAgIGNvbnN0IGFscGhhYmV0QTogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IG0gb2Yga2V5cykge1xuICAgICAgZnJlcUEucHVzaChtIGluIGZyZXEgPyBmcmVxW21dIDogMCk7XG4gICAgICBhbHBoYWJldEEucHVzaChhbHBoYWJldC5oYXMobSkgPyAxIDogMCk7XG4gICAgfVxuICAgIC8qIFRoZXJlIHdlcmUgYSBmZXcgaWRlYXM6IGNoaS1zcXVhcmVkLCBwZWFyc29uIGNvcnJlbGF0aW9uICh2YXJpYW5jZT8pLCBzY2FsYXIgcHJvZHVjdCAqL1xuICAgIGNvbnN0IGZyZXFWOiBWZWN0b3IgPSBuZXcgVmVjdG9yKGZyZXFBKTtcbiAgICBjb25zdCBhbHBoYWJldFY6IFZlY3RvciA9IG5ldyBWZWN0b3IoYWxwaGFiZXRBKTtcbiAgICByZXR1cm4gdmVjdG9yRG90UHJvZHVjdChmcmVxViwgYWxwaGFiZXRWKSAvICh2ZWN0b3JMZW5ndGgoZnJlcVYpICogdmVjdG9yTGVuZ3RoKGFscGhhYmV0VikpO1xuICB9XG5cbiAgLy8gUHJldmlvdXMgdmVyc2lvbiBvZiBwaWNrVXBTZXFDb2xcbiAgLy8gLyoqIEZpcnN0IHRyeSB0byBmaW5kIGNvbHVtbiB3aXRoIHNlbVR5cGUgJ2FsaWduZWRTZXF1ZW5jZScuXG4gIC8vICAqIE5leHQgbG9vayBmb3IgY29sdW1uIHdpdGggZGF0YSBhbHBoYWJldCBjb3JyZXNwb25kaW5nIHRvIGFueSBvZiB0aGUga25vd24gcGFsZXR0ZXMuXG4gIC8vICAqIEBwYXJhbSB7REcuRGF0YUZyYW1lfSBkYXRhRnJhbWVcbiAgLy8gICogQHJldHVybiB7REcuQ29sdW1ufSBUaGUgY29sdW1uIHdlIHdlcmUgbG9va2luZyBmb3Igb3IgbnVsbFxuICAvLyAgKi9cbiAgLy8gcHJpdmF0ZSBwaWNrVXBTZXFDb2woZGF0YUZyYW1lOiBERy5EYXRhRnJhbWUpOiBERy5Db2x1bW4gfCBudWxsIHtcbiAgLy8gICBsZXQgcmVzOiBERy5Db2x1bW4gfCBudWxsID0gZGF0YUZyYW1lLmNvbHVtbnMuYnlTZW1UeXBlKCdhbGlnbmVkU2VxdWVuY2UnKTtcbiAgLy8gICBpZiAocmVzID09IG51bGwpIHtcbiAgLy8gICAgIGZvciAoY29uc3QgY29sIG9mIGRhdGFGcmFtZS5jb2x1bW5zKSB7XG4gIC8vICAgICAgIGNvbnN0IGNwID0gV2ViTG9nby5waWNrVXBQYWxldHRlKGNvbCBhcyBERy5Db2x1bW4sIDUpO1xuICAvLyAgICAgICBpZiAoY3AgIT09IG51bGwgJiYgIShjcCBpbnN0YW5jZW9mIFVua25vd25TZXFQYWxldHRlKSkge1xuICAvLyAgICAgICAgIHJlcyA9IGNvbDtcbiAgLy8gICAgICAgICBicmVhaztcbiAgLy8gICAgICAgfVxuICAvLyAgICAgfVxuICAvLyAgIH1cbiAgLy8gICByZXR1cm4gcmVzO1xuICAvLyB9XG5cbiAgcHVibGljIHN0YXRpYyBwaWNrVXBTZXFDb2woZGY6IERHLkRhdGFGcmFtZSk6IERHLkNvbHVtbiB8IG51bGwge1xuICAgIGNvbnN0IHNlbVR5cGVDb2xMaXN0ID0gZGYuY29sdW1ucy5ieVNlbVR5cGVBbGwoREcuU0VNVFlQRS5NQUNST01PTEVDVUxFKTtcbiAgICBsZXQgcmVzQ29sOiBERy5Db2x1bW4gfCBudWxsID0gc2VtVHlwZUNvbExpc3QuZmluZCgoY29sKSA9PiB7XG4gICAgICBjb25zdCB1bml0cyA9IGNvbC5nZXRUYWcoREcuVEFHUy5VTklUUyk7XG4gICAgICByZXR1cm4gdW5pdHMgPyB1bml0cy5pbmRleE9mKCdNU0EnKSAhPT0gLTEgOiBmYWxzZTtcbiAgICB9KSA/PyBudWxsO1xuICAgIGlmICghcmVzQ29sICYmIHNlbVR5cGVDb2xMaXN0Lmxlbmd0aCA+IDApXG4gICAgICByZXNDb2wgPSBzZW1UeXBlQ29sTGlzdFswXTtcbiAgICByZXR1cm4gcmVzQ29sO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgbW9ub21lclJlID0gL1xcWyhcXHcrKVxcXXwoXFx3KXwoLSkvZztcblxuICAvKiogT25seSBzb21lIG9mIHRoZSBzeW5vbnltcy4gVGhlc2Ugd2VyZSBvYnRhaW5lZCBmcm9tIHRoZSBjbHVzdGVyZWQgb2xpZ29wZXB0aWRlIGRhdGFzZXQuICovXG4gIHByaXZhdGUgc3RhdGljIGFhU3lub255bXM6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICdbTWVObGVdJzogJ0wnLCAvLyBObGUgLSBub3JsZXVjaW5lXG4gICAgJ1tNZUFdJzogJ0EnLFxuICAgICdbTWVHXSc6ICdHJyxcbiAgICAnW01lRl0nOiAnRicsXG4gIH07XG5cbiAgLyoqIFNwbGl0IHNlcXVlbmNlIGZvciBzaW5nbGUgY2hhcmFjdGVyIG1vbm9tZXJzLCBzcXVhcmUgYnJhY2tldHMgbXVsdGljaGFyIG1vbm9tZXIgbmFtZXMgb3IgZ2FwIHN5bWJvbC5cbiAgICogQHBhcmFtIHthbnl9IHNlcSBvYmplY3Qgd2l0aCBzZXF1ZW5jZVxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXX0gYXJyYXkgb2YgbW9ub21lcnNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc3BsaXR0ZXJBc0Zhc3RhKHNlcTogYW55KTogc3RyaW5nW10ge1xuICAgIHJldHVybiB3dTxSZWdFeHBNYXRjaEFycmF5PihzZXEudG9TdHJpbmcoKS5tYXRjaEFsbChXZWJMb2dvLm1vbm9tZXJSZSkpXG4gICAgICAubWFwKChtYTogUmVnRXhwTWF0Y2hBcnJheSkgPT4ge1xuICAgICAgICBsZXQgbVJlczogc3RyaW5nO1xuICAgICAgICBjb25zdCBtOiBzdHJpbmcgPSBtYVswXTtcbiAgICAgICAgaWYgKG0ubGVuZ3RoID4gMSkge1xuICAgICAgICAgIG1SZXMgPSBtYVsxXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtUmVzID0gbTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbVJlcztcbiAgICAgIH0pLnRvQXJyYXkoKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGhlbG1SZSA9IC8oUEVQVElERTF8RE5BMXxSTkExKVxceyhbXn1dKyl9L2c7XG4gIHByaXZhdGUgc3RhdGljIGhlbG1QcDFSZSA9IC9cXFsoW15cXFtcXF1dKyldL2c7XG5cbiAgLyoqIFNwbGl0cyBIZWxtIHN0cmluZyB0byBtb25vbWVycywgYnV0IGRvZXMgbm90IHJlcGxhY2UgbW9ub21lciBuYW1lcyB0byBvdGhlciBub3RhdGlvbiAoZS5nLiBmb3IgUk5BKS5cbiAgICogT25seSBmb3IgbGluZWFyIHBvbHltZXJzLCBkb2VzIG5vdCBzcGxpdCBSTkEgZm9yIHJpYm9zZSBhbmQgcGhvc3BoYXRlIG1vbm9tZXJzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VxIFNvdXJjZSBzdHJpbmcgb2YgSEVMTSBub3RhdGlvblxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXX1cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc3BsaXR0ZXJBc0hlbG0oc2VxOiBhbnkpOiBzdHJpbmdbXSB7XG4gICAgV2ViTG9nby5oZWxtUmUubGFzdEluZGV4ID0gMDtcbiAgICBjb25zdCBlYTogUmVnRXhwRXhlY0FycmF5IHwgbnVsbCA9IFdlYkxvZ28uaGVsbVJlLmV4ZWMoc2VxLnRvU3RyaW5nKCkpO1xuICAgIGNvbnN0IGluU2VxOiBzdHJpbmcgfCBudWxsID0gZWEgPyBlYVsyXSA6IG51bGw7XG5cbiAgICBjb25zdCBtbVBvc3RQcm9jZXNzID0gKG1tOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgICAgV2ViTG9nby5oZWxtUHAxUmUubGFzdEluZGV4ID0gMDtcbiAgICAgIGNvbnN0IHBwMU0gPSBXZWJMb2dvLmhlbG1QcDFSZS5leGVjKG1tKTtcbiAgICAgIGlmIChwcDFNICYmIHBwMU0ubGVuZ3RoID49IDIpXG4gICAgICAgIHJldHVybiBwcDFNWzFdO1xuICAgICAgZWxzZVxuICAgICAgICByZXR1cm4gbW07XG4gICAgfTtcblxuICAgIGNvbnN0IG1tTGlzdDogc3RyaW5nW10gPSBpblNlcSA/IGluU2VxLnNwbGl0KCcuJykgOiBbXTtcbiAgICByZXR1cm4gbW1MaXN0Lm1hcChtbVBvc3RQcm9jZXNzKTtcbiAgfVxuXG4gIC8qKiBHZXRzIG1ldGhvZCB0byBzcGxpdCBzZXF1ZW5jZSBieSBzZXBhcmF0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlcGFyYXRvclxuICAgKiBAcGFyYW0gbGltaXRcbiAgICogQHJldHVybiB7U3BsaXR0ZXJGdW5jfVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRTcGxpdHRlcldpdGhTZXBhcmF0b3Ioc2VwYXJhdG9yOiBzdHJpbmcsIGxpbWl0OiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQpOiBTcGxpdHRlckZ1bmMge1xuICAgIHJldHVybiAoc2VxOiBzdHJpbmcpID0+IHtcbiAgICAgIHJldHVybiBzZXEuc3BsaXQoc2VwYXJhdG9yLCBsaW1pdCk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKiBHZXQgc3BsaXR0ZXIgbWV0aG9kIHRvIHNwbGl0IHNlcXVlbmNlcyB0byBtb25vbWVyc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdHNcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlcGFyYXRvclxuICAgKiBAcGFyYW0gbGltaXRcbiAgICogQHJldHVybiB7U3BsaXR0ZXJGdW5jfVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRTcGxpdHRlcih1bml0czogc3RyaW5nLCBzZXBhcmF0b3I6IHN0cmluZywgbGltaXQ6IG51bWJlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCk6IFNwbGl0dGVyRnVuYyB7XG4gICAgaWYgKHVuaXRzLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChOT1RBVElPTi5GQVNUQSkpXG4gICAgICByZXR1cm4gV2ViTG9nby5zcGxpdHRlckFzRmFzdGE7XG4gICAgZWxzZSBpZiAodW5pdHMudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKE5PVEFUSU9OLlNFUEFSQVRPUikpXG4gICAgICByZXR1cm4gV2ViTG9nby5nZXRTcGxpdHRlcldpdGhTZXBhcmF0b3Ioc2VwYXJhdG9yLCBsaW1pdCk7XG4gICAgZWxzZSBpZiAodW5pdHMudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKE5PVEFUSU9OLkhFTE0pKVxuICAgICAgcmV0dXJuIFdlYkxvZ28uc3BsaXR0ZXJBc0hlbG07XG4gICAgZWxzZVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHVuaXRzICR7dW5pdHN9IC5gKTtcblxuICAgIC8vIFRPRE86IFNwbGl0dGVyIGZvciBIRUxNXG4gIH1cblxuICAvKiogR2VuZXJhdGUgc3BsaXR0ZXIgZnVuY3Rpb24gZm9yIHNlcXVlbmNlIGNvbHVtblxuICAgKiBAcGFyYW0ge0RHLkNvbHVtbn0gY29sXG4gICAqIEByZXR1cm4ge1NwbGl0dGVyRnVuY30gU3BsaXR0ZXIgZnVuY3Rpb25cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0U3BsaXR0ZXJGb3JDb2x1bW4oY29sOiBERy5Db2x1bW4pOiBTcGxpdHRlckZ1bmMge1xuICAgIGlmIChjb2wuc2VtVHlwZSAhPT0gREcuU0VNVFlQRS5NQUNST01PTEVDVUxFKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBHZXQgc3BsaXR0ZXIgZm9yIHNlbVR5cGUgXCIke0RHLlNFTVRZUEUuTUFDUk9NT0xFQ1VMRX1cIiBvbmx5LmApO1xuXG4gICAgY29uc3QgdW5pdHMgPSBjb2wuZ2V0VGFnKERHLlRBR1MuVU5JVFMpO1xuICAgIGNvbnN0IHNlcGFyYXRvciA9IGNvbC5nZXRUYWcoVW5pdHNIYW5kbGVyLlRBR1Muc2VwYXJhdG9yKTtcbiAgICByZXR1cm4gV2ViTG9nby5nZXRTcGxpdHRlcih1bml0cywgc2VwYXJhdG9yKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGxvbmdNb25vbWVyUGFydFJlID0gLyhcXHcrKS9nO1xuXG4gIC8qKiBDb252ZXJ0IGxvbmcgbW9ub21lciBuYW1lcyB0byBzaG9ydCBvbmVzICovXG4gIHB1YmxpYyBzdGF0aWMgbW9ub21lclRvU2hvcnQoYW1pbm86IHN0cmluZywgbWF4TGVuZ3RoT2ZNb25vbWVyOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNob3J0QW1pbm9NYXRjaDogUmVnRXhwTWF0Y2hBcnJheSB8IG51bGwgPSBhbWluby5tYXRjaChXZWJMb2dvLmxvbmdNb25vbWVyUGFydFJlKTtcbiAgICBjb25zdCBuZWVkQWRkRG90czogYm9vbGVhbiA9IGFtaW5vLmxlbmd0aCA+IG1heExlbmd0aE9mTW9ub21lciB8fCAoc2hvcnRBbWlub01hdGNoPy5sZW5ndGggPz8gMCkgPiAxO1xuICAgIGNvbnN0IHNob3J0QW1pbm8gPSBzaG9ydEFtaW5vTWF0Y2g/LlswXSA/PyAnICc7XG4gICAgcmV0dXJuICFuZWVkQWRkRG90cyA/IHNob3J0QW1pbm8gOiBzaG9ydEFtaW5vLnN1YnN0cmluZygwLCBtYXhMZW5ndGhPZk1vbm9tZXIpICsgJ+KApic7XG4gIH1cbn1cbiJdfQ==
|
|
677
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWxvZ28uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3ZWItbG9nby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssSUFBSSxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEMsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0QyxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEIsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFJN0IsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRXBELE9BQU8sRUFBQyxXQUFXLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQWUsTUFBTSx3QkFBd0IsQ0FBQztBQVE5RyxJQUFLLGNBR0o7QUFIRCxXQUFLLGNBQWM7SUFDakIscUNBQW1CLENBQUE7SUFDbkIsK0JBQWEsQ0FBQTtBQUNmLENBQUMsRUFISSxjQUFjLEtBQWQsY0FBYyxRQUdsQjtBQVFEOzs7R0FHRztBQUNILGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsR0FBRyxVQUFTLEtBQWlCLEVBQUUsQ0FBUztJQUNuRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUMxQyxPQUFPLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3ZGLENBQUMsQ0FBQztBQUVGLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxVQUFTLENBQVMsRUFBRSxDQUFTO0lBQ3hELE9BQU8sSUFBSSxDQUFDLElBQUksSUFBSSxD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RSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLEdBQUcsY0FBYyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDL0UsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksRUFBRTtnQkFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsR0FBRyxhQUFhLEdBQUcsWUFBWSxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7YUFDcEc7WUFFRCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLE1BQU0sRUFBRTtnQkFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQztnQkFDckUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQzthQUNqRDtpQkFBTTtnQkFDTCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQzthQUNsRTtTQUNGO0lBQ0gsQ0FBQztJQUVNLGVBQWU7O1FBQ3BCLE9BQU8sTUFBQSxNQUFBLElBQUksQ0FBQyxZQUFZLDBDQUFFLGVBQWUsRUFBRSxtQ0FBSSxDQUFDLENBQUM7SUFDbkQsQ0FBQzs7QUF4dkJhLG1CQUFXLEdBQUcsYUFBYSxDQUFDO0FBQzNCLG1CQUFXLEdBQVcsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG5pbXBvcnQgd3UgZnJvbSAnd3UnO1xuaW1wb3J0ICogYXMgcnhqcyBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtTZXFQYWxldHRlfSBmcm9tICcuLi9zZXEtcGFsZXR0ZXMnO1xuaW1wb3J0IHtTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtVbml0c0hhbmRsZXJ9IGZyb20gJy4uL3V0aWxzL3VuaXRzLWhhbmRsZXInO1xuaW1wb3J0IHtTbGlkZXJPcHRpb25zfSBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuaW1wb3J0IHtnZXRTcGxpdHRlciwgbW9ub21lclRvU2hvcnQsIHBpY2tVcFBhbGV0dGUsIHBpY2tVcFNlcUNvbCwgU3BsaXR0ZXJGdW5jfSBmcm9tICcuLi91dGlscy9tYWNyb21vbGVjdWxlJztcblxuZGVjbGFyZSBtb2R1bGUgJ2RhdGFncm9rLWFwaS9zcmMvZ3JpZCcge1xuICBpbnRlcmZhY2UgUmVjdCB7XG4gICAgY29udGFpbnMoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBib29sZWFuO1xuICB9XG59XG5cbmVudW0gUG9zaXRpb25IZWlnaHQge1xuICBFbnRyb3B5ID0gJ0VudHJvcHknLFxuICBmdWxsID0gJzEwMCUnLFxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MQ2FudmFzRWxlbWVudCB7XG4gICAgZ2V0Q3Vyc29yUG9zaXRpb24oZXZlbnQ6IE1vdXNlRXZlbnQsIHI6IG51bWJlcik6IERHLlBvaW50O1xuICB9XG59XG5cbi8qKkBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnRcbiAqIEBwYXJhbSB7bnVtYmVyfSByIGRldmljZVBpeGVsUmF0aW9uXG4gKiBAcmV0dXJuIHtERy5Qb2ludH0gY2FudmFzIHJlbGF0ZWQgY3Vyc29yIHBvc2l0aW9uXG4gKi9cbkhUTUxDYW52YXNFbGVtZW50LnByb3RvdHlwZS5nZXRDdXJzb3JQb3NpdGlvbiA9IGZ1bmN0aW9uKGV2ZW50OiBNb3VzZUV2ZW50LCByOiBudW1iZXIpOiBERy5Qb2ludCB7XG4gIGNvbnN0IHJlY3QgPSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICByZXR1cm4gbmV3IERHLlBvaW50KChldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0KSAqIHIsIChldmVudC5jbGllbnRZIC0gcmVjdC50b3ApICogcik7XG59O1xuXG5ERy5SZWN0LnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uKHg6IG51bWJlciwgeTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiB0aGlzLmxlZnQgPD0geCAmJiB4IDw9IHRoaXMucmlnaHQgJiYgdGhpcy50b3AgPD0geSAmJiB5IDw9IHRoaXMuYm90dG9tO1xufTtcblxuZXhwb3J0IGNsYXNzIFBvc2l0aW9uTW9ub21lckluZm8ge1xuICAvKiogU2VxdWVuY2VzIGNvdW50IHdpdGggbW9ub21lciBpbiBwb3NpdGlvbiAqL1xuICBjb3VudDogbnVtYmVyO1xuXG4gIC8qKiBSZW1lbWJlciBzY3JlZW4gY29vcmRzIHJlY3QgKi9cbiAgYm91bmRzOiBERy5SZWN0O1xuXG4gIGNvbnN0cnVjdG9yKGNvdW50OiBudW1iZXIgPSAwLCBib3VuZHM6IERHLlJlY3QgPSBuZXcgREcuUmVjdCgwLCAwLCAwLCAwKSkge1xuICAgIHRoaXMuY291bnQgPSBjb3VudDtcbiAgICB0aGlzLmJvdW5kcyA9IGJvdW5kcztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUG9zaXRpb25JbmZvIHtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgZnJlcTogeyBbbTogc3RyaW5nXTogUG9zaXRpb25Nb25vbWVySW5mbyB9O1xuICByb3dDb3VudDogbnVtYmVyO1xuICBzdW1Gb3JIZWlnaHRDYWxjOiBudW1iZXI7XG5cbiAgLyoqIGZyZXEgPSB7fSwgcm93Q291bnQgPSAwXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgcG9zaXRpb24gKCcxMTFBJywgJzExMS4xJywgZXRjKVxuICAgKiBAcGFyYW0ge251bWJlcn0gc3VtRm9ySGVpZ2h0Q2FsYyBTdW0gb2YgYWxsIG1vbm9tZXIgY291bnRzIGZvciBoZWlnaHQgY2FsY3VsYXRpb25cbiAgICogQHBhcmFtIHtudW1iZXJ9IHJvd0NvdW50IENvdW50IG9mIGVsZW1lbnRzIGluIGNvbHVtblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBmcmVxIGZyZXF1ZW5jeSBvZiBtb25vbWVycyBpbiBwb3NpdGlvblxuICAgKi9cbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBmcmVxOiB7IFttOiBzdHJpbmddOiBQb3NpdGlvbk1vbm9tZXJJbmZvIH0gPSB7fSwgcm93Q291bnQ6IG51bWJlciA9IDAsIHN1bUZvckhlaWdodENhbGM6IG51bWJlciA9IDApIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuZnJlcSA9IGZyZXE7XG4gICAgdGhpcy5yb3dDb3VudCA9IHJvd0NvdW50O1xuICAgIHRoaXMuc3VtRm9ySGVpZ2h0Q2FsYyA9IHN1bUZvckhlaWdodENhbGM7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFdlYkxvZ28gZXh0ZW5kcyBERy5Kc1ZpZXdlciB7XG4gIHB1YmxpYyBzdGF0aWMgcmVzaWR1ZXNTZXQgPSAnbnVjbGVvdGlkZXMnO1xuICBwcml2YXRlIHN0YXRpYyB2aWV3ZXJDb3VudDogbnVtYmVyID0gLTE7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB2aWV3ZXJJZDogbnVtYmVyID0gLTE7XG4gIHByaXZhdGUgdW5pdHNIYW5kbGVyOiBVbml0c0hhbmRsZXIgfCBudWxsO1xuICBwcml2YXRlIGluaXRpYWxpemVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gcHJpdmF0ZSByZWFkb25seSBjb2xvclNjaGVtZTogQ29sb3JTY2hlbWUgPSBDb2xvclNjaGVtZXNbTnVjbGVvdGlkZXNXZWJMb2dvLnJlc2lkdWVzU2V0XTtcbiAgcHJvdGVjdGVkIGNwOiBTZXFQYWxldHRlIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBob3N0PzogSFRNTERpdkVsZW1lbnQ7XG4gIHByaXZhdGUgbXNnSG9zdD86IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7XG4gIHByaXZhdGUgc2xpZGVyOiBERy5SYW5nZVNsaWRlcjtcbiAgcHJpdmF0ZSByZWFkb25seSB0ZXh0QmFzZWxpbmU6IENhbnZhc1RleHRCYXNlbGluZTtcblxuICBwcml2YXRlIGF4aXNIZWlnaHQ6IG51bWJlciA9IDEyO1xuXG4gIHByaXZhdGUgc2VxQ29sOiBERy5Db2x1bW48c3RyaW5nPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNwbGl0dGVyOiBTcGxpdHRlckZ1bmMgfCBudWxsID0gbnVsbDtcbiAgLy8gcHJpdmF0ZSBtYXhMZW5ndGg6IG51bWJlciA9IDEwMDtcbiAgcHJpdmF0ZSBwb3NpdGlvbnM6IFBvc2l0aW9uSW5mb1tdID0gW107XG5cbiAgcHJpdmF0ZSByb3dzTWFza2VkOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIHJvd3NOdWxsOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIHZpc2libGVTbGlkZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBhbGxvd1Jlc2l6ZTogYm9vbGVhbiA9IHRydWU7XG4gIHByaXZhdGUgdHVybk9mUmVzaXplRm9yT25lU2V0VmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvLyBWaWV3ZXIncyBwcm9wZXJ0aWVzIChsaWtlbHkgdGhleSBzaG91bGQgYmUgcHVibGljIHNvIHRoYXQgdGhleSBjYW4gYmUgc2V0IG91dHNpZGUpXG4gIHByaXZhdGUgX3Bvc2l0aW9uV2lkdGg6IG51bWJlcjtcbiAgcHVibGljIHBvc2l0aW9uV2lkdGg6IG51bWJlcjtcbiAgcHVibGljIG1pbkhlaWdodDogbnVtYmVyO1xuICBwdWJsaWMgYmFja2dyb3VuZENvbG9yOiBudW1iZXIgPSAweEZGRkZGRkZGO1xuICBwdWJsaWMgbWF4SGVpZ2h0OiBudW1iZXI7XG4gIHB1YmxpYyBza2lwRW1wdHlTZXF1ZW5jZXM6IGJvb2xlYW47XG4gIHB1YmxpYyBzZXF1ZW5jZUNvbHVtbk5hbWU6IHN0cmluZyB8IG51bGw7XG4gIHB1YmxpYyBwb3NpdGlvbk1hcmdpblN0YXRlOiBzdHJpbmc7XG4gIHB1YmxpYyBwb3NpdGlvbk1hcmdpbjogbnVtYmVyID0gMDtcbiAgcHVibGljIHN0YXJ0UG9zaXRpb25OYW1lOiBzdHJpbmcgfCBudWxsO1xuICBwdWJsaWMgZW5kUG9zaXRpb25OYW1lOiBzdHJpbmcgfCBudWxsO1xuICBwdWJsaWMgZml4V2lkdGg6IGJvb2xlYW47XG4gIHB1YmxpYyB2ZXJ0aWNhbEFsaWdubWVudDogc3RyaW5nIHwgbnVsbDtcbiAgcHVibGljIGhvcml6b250YWxBbGlnbm1lbnQ6IHN0cmluZyB8IG51bGw7XG4gIHB1YmxpYyBmaXRBcmVhOiBib29sZWFuO1xuICBwdWJsaWMgc2hyaW5rRW1wdHlUYWlsOiBib29sZWFuO1xuICBwdWJsaWMgc2tpcEVtcHR5UG9zaXRpb25zOiBib29sZWFuO1xuICBwdWJsaWMgcG9zaXRpb25IZWlnaHQ6IHN0cmluZztcblxuICBwcml2YXRlIHBvc2l0aW9uTmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgcHJpdmF0ZSBzdGFydFBvc2l0aW9uOiBudW1iZXIgPSAtMTtcblxuICBwcml2YXRlIGVuZFBvc2l0aW9uOiBudW1iZXIgPSAtMTtcblxuICAvKiogRm9yIHN0YXJ0UG9zaXRpb24gZXF1YWxzIHRvIGVuZFBvc2l0aW9uIExlbmd0aCBpcyAxICovXG4gIHByaXZhdGUgZ2V0IExlbmd0aCgpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLnNraXBFbXB0eVBvc2l0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb25zLmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRQb3NpdGlvbiA8PSB0aGlzLmVuZFBvc2l0aW9uID8gdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMuc3RhcnRQb3NpdGlvbiArIDEgOiAwO1xuICB9XG5cbiAgLyoqIENhbGN1bGF0ZSBuZXcgcG9zaXRpb24gZGF0YSBiYXNpYyBvbiB7QGxpbmsgcG9zaXRpb25NYXJnaW5TdGF0ZX0gYW5kIHtAbGluayBwb3NpdGlvbk1hcmdpbn0gKi9cbiAgcHJpdmF0ZSBnZXQgcG9zaXRpb25XaWR0aFdpdGhNYXJnaW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Bvc2l0aW9uV2lkdGggKyB0aGlzLnBvc2l0aW9uTWFyZ2luVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGdldCBwb3NpdGlvbk1hcmdpblZhbHVlKCkge1xuICAgIGlmICgodGhpcy5wb3NpdGlvbk1hcmdpblN0YXRlID09PSAnYXV0bycpICYmICh0aGlzLnVuaXRzSGFuZGxlcj8uZ2V0QWxwaGFiZXRJc011bHRpY2hhcigpID09PSB0cnVlKSkge1xuICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb25NYXJnaW47XG4gICAgfVxuICAgIGlmICh0aGlzLnBvc2l0aW9uTWFyZ2luU3RhdGUgPT09ICdlbmFibGUnKSB7XG4gICAgICByZXR1cm4gdGhpcy5wb3NpdGlvbk1hcmdpbjtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIC8qKiBDb3VudCBvZiBwb3NpdGlvbiByZW5kZXJlZCBmb3IgY2FsY3VsYXRpb25zIGNvdW50T2ZSZW5kZXJQb3NpdGlvbnMgKi9cbiAgcHJpdmF0ZSBnZXQgY291bnRPZlJlbmRlclBvc2l0aW9ucygpIHtcbiAgICBpZiAodGhpcy5ob3N0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBjb25zdCByID0gd2luZG93LmRldmljZVBpeGVsUmF0aW87XG4gICAgaWYgKHIgPiAxKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYW52YXNXaWR0aFdpdGhSYXRpbyAvIHRoaXMucG9zaXRpb25XaWR0aFdpdGhNYXJnaW47XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmNhbnZhcy53aWR0aCAvICh0aGlzLnBvc2l0aW9uV2lkdGhXaXRoTWFyZ2luICogcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXQgY2FudmFzV2lkdGhXaXRoUmF0aW8oKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FudmFzLndpZHRoICogd2luZG93LmRldmljZVBpeGVsUmF0aW87XG4gIH1cblxuXG4gIC8qKiBQb3NpdGlvbiBvZiBzdGFydCByZW5kZXJpbmcgKi9cbiAgcHJpdmF0ZSBnZXQgZmlyc3RWaXNpYmxlSW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKHRoaXMudmlzaWJsZVNsaWRlcikgPyBNYXRoLmZsb29yKHRoaXMuc2xpZGVyLm1pbikgOiAwO1xuICB9XG5cbiAgcHJpdmF0ZSB2aWV3U3ViczogU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy52aWV3ZXJJZCA9IFdlYkxvZ28udmlld2VyQ291bnQ7XG4gICAgV2ViTG9nby52aWV3ZXJDb3VudCArPSAxO1xuXG4gICAgdGhpcy50ZXh0QmFzZWxpbmUgPSAndG9wJztcbiAgICB0aGlzLnVuaXRzSGFuZGxlciA9IG51bGw7XG5cbiAgICB0aGlzLmJhY2tncm91bmRDb2xvciA9IHRoaXMuaW50KCdiYWNrZ3JvdW5kQ29sb3InLCAweEZGRkZGRkZGKTtcbiAgICB0aGlzLl9wb3NpdGlvbldpZHRoID0gdGhpcy5wb3NpdGlvbldpZHRoID0gdGhpcy5mbG9hdCgncG9zaXRpb25XaWR0aCcsIDE2LyosXG4gICAgICB7ZWRpdG9yOiAnc2xpZGVyJywgbWluOiA0LCBtYXg6IDY0LCBwb3N0Zml4OiAncHgnfSovKTtcbiAgICB0aGlzLm1pbkhlaWdodCA9IHRoaXMuZmxvYXQoJ21pbkhlaWdodCcsIDUwLyosXG4gICAgICB7ZWRpdG9yOiAnc2xpZGVyJywgbWluOiAyNSwgbWF4OiAyNTAsIHBvc3RmaXg6ICdweCd9Ki8pO1xuICAgIHRoaXMubWF4SGVpZ2h0ID0gdGhpcy5mbG9hdCgnbWF4SGVpZ2h0JywgMTAwLyosXG4gICAgICB7ZWRpdG9yOiAnc2xpZGVyJywgbWluOiAyNSwgbWF4OiA1MDAsIHBvc3RmaXg6ICdweCd9Ki8pO1xuXG4gICAgdGhpcy5za2lwRW1wdHlTZXF1ZW5jZXMgPSB0aGlzLmJvb2woJ3NraXBFbXB0eVNlcXVlbmNlcycsIHRydWUpO1xuICAgIHRoaXMuc2VxdWVuY2VDb2x1bW5OYW1lID0gdGhpcy5zdHJpbmcoJ3NlcXVlbmNlQ29sdW1uTmFtZScsIG51bGwpO1xuXG4gICAgdGhpcy5zdGFydFBvc2l0aW9uTmFtZSA9IHRoaXMuc3RyaW5nKCdzdGFydFBvc2l0aW9uTmFtZScsIG51bGwpO1xuICAgIHRoaXMuZW5kUG9zaXRpb25OYW1lID0gdGhpcy5zdHJpbmcoJ2VuZFBvc2l0aW9uTmFtZScsIG51bGwpO1xuXG4gICAgdGhpcy5maXhXaWR0aCA9IHRoaXMuYm9vbCgnZml4V2lkdGgnLCBmYWxzZSk7XG5cbiAgICB0aGlzLnZlcnRpY2FsQWxpZ25tZW50ID0gdGhpcy5zdHJpbmcoJ3ZlcnRpY2FsQWxpZ25tZW50JywgJ21pZGRsZScsXG4gICAgICB7Y2hvaWNlczogWyd0b3AnLCAnbWlkZGxlJywgJ2JvdHRvbSddfSk7XG4gICAgdGhpcy5ob3Jpem9udGFsQWxpZ25tZW50ID0gdGhpcy5zdHJpbmcoJ2hvcml6b250YWxBbGlnbm1lbnQnLCAnY2VudGVyJyxcbiAgICAgIHtjaG9pY2VzOiBbJ2xlZnQnLCAnY2VudGVyJywgJ3JpZ2h0J119KTtcbiAgICB0aGlzLmZpdEFyZWEgPSB0aGlzLmJvb2woJ2ZpdEFyZWEnLCB0cnVlKTtcbiAgICB0aGlzLnNocmlua0VtcHR5VGFpbCA9IHRoaXMuYm9vbCgnc2hyaW5rRW1wdHlUYWlsJywgdHJ1ZSk7XG4gICAgdGhpcy5za2lwRW1wdHlQb3NpdGlvbnMgPSB0aGlzLmJvb2woJ3NraXBFbXB0eVBvc2l0aW9ucycsIGZhbHNlKTtcbiAgICB0aGlzLnBvc2l0aW9uTWFyZ2luU3RhdGUgPSB0aGlzLnN0cmluZygncG9zaXRpb25NYXJnaW5TdGF0ZScsICdhdXRvJyxcbiAgICAgIHtjaG9pY2VzOiBbJ2F1dG8nLCAnZW5hYmxlJywgJ29mZiddfSk7XG4gICAgbGV0IGRlZmF1bHRWYWx1ZUZvclBvc2l0aW9uTWFyZ2luID0gMDtcbiAgICBpZiAodGhpcy5wb3NpdGlvbk1hcmdpblN0YXRlID09PSAnYXV0bycpIHtcbiAgICAgIGRlZmF1bHRWYWx1ZUZvclBvc2l0aW9uTWFyZ2luID0gNDtcbiAgICB9XG4gICAgdGhpcy5wb3NpdGlvbk1hcmdpbiA9IHRoaXMuaW50KCdwb3NpdGlvbk1hcmdpbicsIGRlZmF1bHRWYWx1ZUZvclBvc2l0aW9uTWFyZ2luLCB7bWluOiAwLCBtYXg6IDE2fSk7XG4gICAgdGhpcy5wb3NpdGlvbkhlaWdodCA9IHRoaXMuc3RyaW5nKCdwb3NpdGlvbkhlaWdodCcsIFBvc2l0aW9uSGVpZ2h0LmZ1bGwsIHtjaG9pY2VzOiBbUG9zaXRpb25IZWlnaHQuZnVsbCwgUG9zaXRpb25IZWlnaHQuRW50cm9weV19KTtcblxuICAgIGNvbnN0IHN0eWxlOiBTbGlkZXJPcHRpb25zID0ge3N0eWxlOiAnYmFyYmVsbCd9O1xuICAgIHRoaXMuc2xpZGVyID0gdWkucmFuZ2VTbGlkZXIoMCwgMTAwLCAwLCAyMCwgZmFsc2UsIHN0eWxlKTtcbiAgICB0aGlzLmNhbnZhcyA9IHVpLmNhbnZhcygpO1xuICAgIHRoaXMuY2FudmFzLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdXZWJMb2dvIHNlY29uZCBpbml0aWFsaXphdGlvbiEnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB0aGlzLmhlbHBVcmwgPSAnL2hlbHAvdmlzdWFsaXplL3ZpZXdlcnMvd2ViLWxvZ28ubWQnO1xuXG4gICAgdGhpcy5tc2dIb3N0ID0gdWkuZGl2KCdObyBtZXNzYWdlJyk7XG4gICAgdGhpcy5tc2dIb3N0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICB0aGlzLmNhbnZhcyA9IHVpLmNhbnZhcygpO1xuICAgIHRoaXMuY2FudmFzLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuXG4gICAgLy90aGlzLnNsaWRlci5zZXRTaG93SGFuZGxlcyhmYWxzZSk7XG4gICAgdGhpcy5zbGlkZXIucm9vdC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgdGhpcy5zbGlkZXIucm9vdC5zdHlsZS56SW5kZXggPSAnOTk5JztcbiAgICB0aGlzLnNsaWRlci5yb290LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgdGhpcy5zbGlkZXIucm9vdC5zdHlsZS5oZWlnaHQgPSAnMC43ZW0nO1xuXG4gICAgdGhpcy52aXNpYmxlU2xpZGVyID0gZmFsc2U7XG5cbiAgICB0aGlzLnNsaWRlci5vblZhbHVlc0NoYW5nZWQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICgodGhpcy5ob3N0ID09IG51bGwpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8qIFJlc2l6ZSBzbGlkZXIgaWYgd2UgY2FuIHJlc2l6ZSBkbyB0aGF0ICovXG4gICAgICBpZiAoKHRoaXMuYWxsb3dSZXNpemUpICYmICghdGhpcy50dXJuT2ZSZXNpemVGb3JPbmVTZXRWYWx1ZSkgJiZcbiAgICAgICAgKHRoaXMudmlzaWJsZVNsaWRlcikpIHtcbiAgICAgICAgY29uc3QgY291bnRPZlBvc2l0aW9ucyA9IE1hdGguY2VpbCh0aGlzLnNsaWRlci5tYXggLSB0aGlzLnNsaWRlci5taW4pO1xuICAgICAgICBjb25zdCBjYWxjdWxhdGVkV2lkdGggPSAodGhpcy5jYW52YXMud2lkdGggLyBjb3VudE9mUG9zaXRpb25zKSAtIHRoaXMucG9zaXRpb25NYXJnaW5WYWx1ZTtcbiAgICAgICAgLy8gc2F2aW5nIHBvc2l0aW9uV2lkdGggdmFsdWUgZ2xvYmFsIChldmVuIGlmIHNsaWRlciBpcyBub3QgdmlzaWJsZSlcbiAgICAgICAgdGhpcy5wb3NpdGlvbldpZHRoID0gY2FsY3VsYXRlZFdpZHRoO1xuICAgICAgICB0aGlzLl9wb3NpdGlvbldpZHRoID0gY2FsY3VsYXRlZFdpZHRoO1xuICAgICAgfVxuICAgICAgdGhpcy50dXJuT2ZSZXNpemVGb3JPbmVTZXRWYWx1ZSA9IGZhbHNlO1xuICAgICAgdGhpcy5yZW5kZXIodHJ1ZSk7XG4gICAgfSk7XG5cblxuICAgIHRoaXMuaG9zdCA9IHVpLmRpdihbdGhpcy5tc2dIb3N0LCB0aGlzLmNhbnZhc10pO1xuXG4gICAgdGhpcy5ob3N0LnN0eWxlLmp1c3RpZnlDb250ZW50ID0gJ2NlbnRlcic7XG4gICAgdGhpcy5ob3N0LnN0eWxlLmFsaWduSXRlbXMgPSAnY2VudGVyJztcbiAgICB0aGlzLmhvc3Quc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgIHRoaXMuaG9zdC5zdHlsZS5zZXRQcm9wZXJ0eSgnb3ZlcmZsb3cnLCAnaGlkZGVuJywgJ2ltcG9ydGFudCcpO1xuXG4gICAgY29uc3QgZ2V0TW9ub21lciA9IChwOiBERy5Qb2ludCk6IFtudW1iZXIsIHN0cmluZyB8IG51bGwsIFBvc2l0aW9uTW9ub21lckluZm8gfCBudWxsXSA9PiB7XG4gICAgICBjb25zdCBjYWxjdWxhdGVkWCA9IHAueCArIHRoaXMuZmlyc3RWaXNpYmxlSW5kZXggKiB0aGlzLnBvc2l0aW9uV2lkdGhXaXRoTWFyZ2luO1xuICAgICAgY29uc3QgalBvcyA9IE1hdGguZmxvb3IocC54IC8gdGhpcy5wb3NpdGlvbldpZHRoV2l0aE1hcmdpbiArIHRoaXMuZmlyc3RWaXNpYmxlSW5kZXgpO1xuICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLnBvc2l0aW9uc1tqUG9zXTtcblxuICAgICAgaWYgKHBvc2l0aW9uID09PSB2b2lkIDApXG4gICAgICAgIHJldHVybiBbalBvcywgbnVsbCwgbnVsbF07XG5cbiAgICAgIGNvbnN0IG1vbm9tZXI6IHN0cmluZyB8IHVuZGVmaW5lZCA9IE9iamVjdC5rZXlzKHBvc2l0aW9uLmZyZXEpXG4gICAgICAgIC5maW5kKChtKSA9PiBwb3NpdGlvbi5mcmVxW21dLmJvdW5kcy5jb250YWlucyhjYWxjdWxhdGVkWCwgcC55KSk7XG4gICAgICBpZiAobW9ub21lciA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gW2pQb3MsIG51bGwsIG51bGxdO1xuXG4gICAgICByZXR1cm4gW2pQb3MsIG1vbm9tZXIsIHBvc2l0aW9uLmZyZXFbbW9ub21lcl1dO1xuICAgIH07XG5cbiAgICBjb25zdCBjb3JyZWN0TW9ub21lckZpbHRlciA9IChpUm93OiBudW1iZXIsIG1vbm9tZXI6IHN0cmluZywgalBvczogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBzZXEgPSB0aGlzLnNlcUNvbCEuZ2V0KGlSb3cpO1xuICAgICAgY29uc3Qgc2VxTSA9IHNlcSA/IHRoaXMuc3BsaXR0ZXIhKHNlcSlbdGhpcy5zdGFydFBvc2l0aW9uICsgalBvc10gOiBudWxsO1xuICAgICAgcmV0dXJuICgoc2VxTSA9PT0gbW9ub21lcikgfHwgKHNlcU0gPT09ICcnICYmIG1vbm9tZXIgPT09ICctJykpICYmIHRoaXMuZGF0YUZyYW1lLmZpbHRlci5nZXQoaVJvdyk7XG4gICAgfTtcblxuICAgIHJ4anMuZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHRoaXMuY2FudmFzLCAnbW91c2Vtb3ZlJykuc3Vic2NyaWJlKChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBhcmdzID0gZSBhcyBNb3VzZUV2ZW50O1xuXG4gICAgICBjb25zdCByOiBudW1iZXIgPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztcbiAgICAgIGNvbnN0IGN1cnNvclA6IERHLlBvaW50ID0gdGhpcy5jYW52YXMuZ2V0Q3Vyc29yUG9zaXRpb24oYXJncywgcik7XG4gICAgICBjb25zdCBbalBvcywgbW9ub21lcl0gPSBnZXRNb25vbWVyKGN1cnNvclApO1xuICAgICAgaWYgKHRoaXMuZGF0YUZyYW1lICYmIHRoaXMuc2VxQ29sICYmIHRoaXMuc3BsaXR0ZXIgJiYgbW9ub21lcikge1xuICAgICAgICBjb25zdCByb3dDb3VudCA9IHd1LmNvdW50KCkudGFrZSh0aGlzLmRhdGFGcmFtZS5yb3dDb3VudCkuZmlsdGVyKGZ1bmN0aW9uKGlSb3cpIHtcbiAgICAgICAgICByZXR1cm4gY29ycmVjdE1vbm9tZXJGaWx0ZXIoaVJvdywgbW9ub21lciwgalBvcyk7XG4gICAgICAgIH0pLnJlZHVjZTxudW1iZXI+KChjb3VudCwgaVJvdykgPT4gY291bnQgKyAxLCAwKTtcbiAgICAgICAgdWkudG9vbHRpcC5zaG93KHVpLmRpdihbdWkuZGl2KGAke21vbm9tZXJ9YCksIHVpLmRpdihgJHtyb3dDb3VudH0gcm93c2ApXSksIGFyZ3MueCArIDE2LCBhcmdzLnkgKyAxNik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1aS50b29sdGlwLmhpZGUoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJ4anMuZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHRoaXMuY2FudmFzLCAnbW91c2Vkb3duJykuc3Vic2NyaWJlKChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBhcmdzID0gZSBhcyBNb3VzZUV2ZW50O1xuICAgICAgY29uc3QgcjogbnVtYmVyID0gd2luZG93LmRldmljZVBpeGVsUmF0aW87XG4gICAgICBjb25zdCBbalBvcywgbW9ub21lcl0gPSBnZXRNb25vbWVyKHRoaXMuY2FudmFzLmdldEN1cnNvclBvc2l0aW9uKGFyZ3MsIHIpKTtcblxuICAgICAgLy8gcHJldmVudHMgZGVzZWxlY3QgYWxsIHJvd3MgaWYgd2UgbWlzcyBtb25vbWVyIGJvdW5kc1xuICAgICAgaWYgKHRoaXMuZGF0YUZyYW1lICYmIHRoaXMuc2VxQ29sICYmIHRoaXMuc3BsaXR0ZXIgJiYgbW9ub21lcikge1xuICAgICAgICB0aGlzLmRhdGFGcmFtZS5zZWxlY3Rpb24uaW5pdChmdW5jdGlvbihpUm93KSB7XG4gICAgICAgICAgcmV0dXJuIGNvcnJlY3RNb25vbWVyRmlsdGVyKGlSb3csIG1vbm9tZXIsIGpQb3MpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJ4anMuZnJvbUV2ZW50PFdoZWVsRXZlbnQ+KHRoaXMuY2FudmFzLCAnd2hlZWwnKS5zdWJzY3JpYmUoKGU6IFdoZWVsRXZlbnQpID0+IHtcbiAgICAgIGlmICghdGhpcy52aXNpYmxlU2xpZGVyKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBjb3VudE9mU2Nyb2xsUG9zaXRpb25zID0gKGUuZGVsdGFZIC8gMTAwKSAqIE1hdGgubWF4KE1hdGguZmxvb3IoKHRoaXMuY291bnRPZlJlbmRlclBvc2l0aW9ucykgLyAyKSwgMSk7XG4gICAgICB0aGlzLnNsaWRlci5zY3JvbGxCeSh0aGlzLnNsaWRlci5taW4gKyBjb3VudE9mU2Nyb2xsUG9zaXRpb25zKTtcblxuICAgIH0pO1xuXG4gICAgdGhpcy52aWV3U3Vicy5wdXNoKHVpLm9uU2l6ZUNoYW5nZWQodGhpcy5yb290KS5zdWJzY3JpYmUodGhpcy5yb290T25TaXplQ2hhbmdlZC5iaW5kKHRoaXMpKSk7XG5cbiAgICB0aGlzLnJvb3QuYXBwZW5kKHRoaXMuaG9zdCk7XG4gICAgdGhpcy5yb290LmFwcGVuZCh0aGlzLnNsaWRlci5yb290KTtcblxuICAgIHRoaXMuX2NhbGN1bGF0ZSh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyk7XG4gICAgdGhpcy51cGRhdGVTbGlkZXIoKTtcbiAgICB0aGlzLnJlbmRlcih0cnVlKTtcbiAgfVxuXG4gIC8qKiBIYW5kbGVyIG9mIGNoYW5naW5nIHNpemUgV2ViTG9nbyAqL1xuICBwcml2YXRlIHJvb3RPblNpemVDaGFuZ2VkKCk6IHZvaWQge1xuICAgIHRoaXMuX2NhbGN1bGF0ZSh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyk7XG4gICAgdGhpcy51cGRhdGVTbGlkZXIoKTtcbiAgICB0aGlzLnJlbmRlcih0cnVlKTtcbiAgfVxuXG4gIC8qKiBBc3NpZ25zIHtAbGluayBzZXFDb2x9IGFuZCB7QGxpbmsgY3B9IGJhc2VkIG9uIHtAbGluayBzZXF1ZW5jZUNvbHVtbk5hbWV9IGFuZCBjYWxscyB7QGxpbmsgcmVuZGVyfSgpLlxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVTZXFDb2woKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGF0YUZyYW1lKSB7XG4gICAgICB0aGlzLnNlcUNvbCA9IHRoaXMuc2VxdWVuY2VDb2x1bW5OYW1lID8gdGhpcy5kYXRhRnJhbWUuY29sKHRoaXMuc2VxdWVuY2VDb2x1bW5OYW1lKSA6IG51bGw7XG4gICAgICBpZiAodGhpcy5zZXFDb2wgPT0gbnVsbCkge1xuICAgICAgICB0aGlzLnNlcUNvbCA9IHBpY2tVcFNlcUNvbCh0aGlzLmRhdGFGcmFtZSk7XG4gICAgICAgIHRoaXMuc2VxdWVuY2VDb2x1bW5OYW1lID0gdGhpcy5zZXFDb2wgPyB0aGlzLnNlcUNvbC5uYW1lIDogbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnNlcUNvbCkge1xuICAgICAgICBjb25zdCB1bml0czogc3RyaW5nID0gdGhpcy5zZXFDb2whLmdldFRhZyhERy5UQUdTLlVOSVRTKTtcbiAgICAgICAgY29uc3Qgc2VwYXJhdG9yOiBzdHJpbmcgPSB0aGlzLnNlcUNvbCEuZ2V0VGFnKFVuaXRzSGFuZGxlci5UQUdTLnNlcGFyYXRvcik7XG4gICAgICAgIHRoaXMuc3BsaXR0ZXIgPSBnZXRTcGxpdHRlcih1bml0cywgc2VwYXJhdG9yKTtcbiAgICAgICAgdGhpcy51bml0c0hhbmRsZXIgPSBuZXcgVW5pdHNIYW5kbGVyKHRoaXMuc2VxQ29sKTtcblxuICAgICAgICB0aGlzLnVwZGF0ZVBvc2l0aW9ucygpO1xuICAgICAgICB0aGlzLmNwID0gcGlja1VwUGFsZXR0ZSh0aGlzLnNlcUNvbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNwbGl0dGVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5wb3NpdGlvbk5hbWVzID0gW107XG4gICAgICAgIHRoaXMuc3RhcnRQb3NpdGlvbiA9IC0xO1xuICAgICAgICB0aGlzLmVuZFBvc2l0aW9uID0gLTE7XG4gICAgICAgIHRoaXMuY3AgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG5cbiAgLyoqIFVwZGF0ZXMge0BsaW5rIHBvc2l0aW9uTmFtZXN9IGFuZCBjYWxjdWxhdGVzIHtAbGluayBzdGFydFBvc2l0aW9ufSBhbmQge0BsaW5rIGVuZFBvc2l0aW9ufS5cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlUG9zaXRpb25zKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZXFDb2wpXG4gICAgICByZXR1cm47XG5cbiAgICBsZXQgY2F0ZWdvcmllczogKHN0cmluZyB8IG51bGwpIFtdO1xuICAgIGlmICh0aGlzLnNocmlua0VtcHR5VGFpbCkge1xuICAgICAgY29uc3QgaW5kaWNlczogSW50MzJBcnJheSA9IHRoaXMuZGF0YUZyYW1lLmZpbHRlci5nZXRTZWxlY3RlZEluZGV4ZXMoKTtcbiAgICAgIGNhdGVnb3JpZXMgPSBBcnJheS5mcm9tKG5ldyBTZXQoXG4gICAgICAgIEFycmF5LmZyb20oQXJyYXkoaW5kaWNlcy5sZW5ndGgpLmtleXMoKSkubWFwKChpOiBudW1iZXIpID0+IHRoaXMuc2VxQ29sIS5nZXQoaW5kaWNlc1tpXSkpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhdGVnb3JpZXMgPSB0aGlzLnNlcUNvbC5jYXRlZ29yaWVzO1xuICAgIH1cbiAgICBjb25zdCBtYXhMZW5ndGggPSBjYXRlZ29yaWVzLmxlbmd0aCA+IDAgPyBNYXRoLm1heCguLi5jYXRlZ29yaWVzLm1hcChcbiAgICAgIChzKSA9PiBzICE9PSBudWxsID8gdGhpcy5zcGxpdHRlciEocykubGVuZ3RoIDogMCkpIDogMDtcblxuICAgIC8vIEdldCBwb3NpdGlvbiBuYW1lcyBmcm9tIGRhdGEgY29sdW1uIHRhZyAncG9zaXRpb25OYW1lcydcbiAgICBjb25zdCBwb3NpdGlvbk5hbWVzVHh0ID0gdGhpcy5zZXFDb2wuZ2V0VGFnKCdwb3NpdGlvbk5hbWVzJyk7XG4gICAgLy8gRmFsbGJhY2sgaWYgJ3Bvc2l0aW9uTmFtZXMnIHRhZyBpcyBub3QgcHJvdmlkZWRcbiAgICB0aGlzLnBvc2l0aW9uTmFtZXMgPSBwb3NpdGlvbk5hbWVzVHh0ID8gcG9zaXRpb25OYW1lc1R4dC5zcGxpdCgnLCAnKS5tYXAoKG4pID0+IG4udHJpbSgpKSA6XG4gICAgICBbLi4uQXJyYXkobWF4TGVuZ3RoKS5rZXlzKCldLm1hcCgoalBvcykgPT4gYCR7alBvcyArIDF9YCk7XG5cbiAgICB0aGlzLnN0YXJ0UG9zaXRpb24gPSAodGhpcy5zdGFydFBvc2l0aW9uTmFtZSAmJiB0aGlzLnBvc2l0aW9uTmFtZXMgJiZcbiAgICAgIHRoaXMucG9zaXRpb25OYW1lcy5pbmNsdWRlcyh0aGlzLnN0YXJ0UG9zaXRpb25OYW1lKSkgP1xuICAgICAgdGhpcy5wb3NpdGlvbk5hbWVzLmluZGV4T2YodGhpcy5zdGFydFBvc2l0aW9uTmFtZSkgOiAwO1xuICAgIHRoaXMuZW5kUG9zaXRpb24gPSAodGhpcy5lbmRQb3NpdGlvbk5hbWUgJiYgdGhpcy5wb3NpdGlvbk5hbWVzICYmXG4gICAgICB0aGlzLnBvc2l0aW9uTmFtZXMuaW5jbHVkZXModGhpcy5lbmRQb3NpdGlvbk5hbWUpKSA/XG4gICAgICB0aGlzLnBvc2l0aW9uTmFtZXMuaW5kZXhPZih0aGlzLmVuZFBvc2l0aW9uTmFtZSkgOiAobWF4TGVuZ3RoIC0gMSk7XG4gIH1cblxuICBwcml2YXRlIGdldCB3aWR0aEFyZWEoKSB7XG4gICAgcmV0dXJuIHRoaXMuTGVuZ3RoICogdGhpcy5wb3NpdGlvbldpZHRoIC8gd2luZG93LmRldmljZVBpeGVsUmF0aW87XG4gIH1cblxuICBwcml2YXRlIGdldCBoZWlnaHRBcmVhKCkge1xuICAgIHJldHVybiBNYXRoLm1pbih0aGlzLm1heEhlaWdodCwgTWF0aC5tYXgodGhpcy5taW5IZWlnaHQsIHRoaXMucm9vdC5jbGllbnRIZWlnaHQpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHhTY2FsZSgpIHtcbiAgICByZXR1cm4gKHRoaXMucm9vdC5jbGllbnRXaWR0aCAtIHRoaXMuTGVuZ3RoICogdGhpcy5wb3NpdGlvbk1hcmdpblZhbHVlKSAvIHRoaXMud2lkdGhBcmVhO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgeVNjYWxlKCkge1xuICAgIHJldHVybiB0aGlzLnJvb3QuY2xpZW50SGVpZ2h0IC8gdGhpcy5oZWlnaHRBcmVhO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0lzSGlkZVNsaWRlcigpOiBib29sZWFuIHtcbiAgICBsZXQgc2hvd1NsaWRlcldpdGhGaXRBcmVhID0gdHJ1ZTtcbiAgICBjb25zdCBtaW5TY2FsZSA9IE1hdGgubWluKHRoaXMueFNjYWxlLCB0aGlzLnlTY2FsZSk7XG5cbiAgICBpZiAoKChtaW5TY2FsZSA9PSB0aGlzLnhTY2FsZSkgfHwgKG1pblNjYWxlIDw9IDEpKSAmJiAodGhpcy5maXRBcmVhKSkge1xuICAgICAgc2hvd1NsaWRlcldpdGhGaXRBcmVhID0gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAoKHRoaXMuZml4V2lkdGggfHwgTWF0aC5jZWlsKHRoaXMuY2FudmFzLndpZHRoIC8gdGhpcy5wb3NpdGlvbldpZHRoV2l0aE1hcmdpbikgPj0gdGhpcy5MZW5ndGgpIHx8IChzaG93U2xpZGVyV2l0aEZpdEFyZWEpKTtcbiAgfVxuXG4gIHNldFNsaWRlclZpc2liaWxpdHkodmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh2aXNpYmxlKSB7XG4gICAgICB0aGlzLnNsaWRlci5yb290LnN0eWxlLmRpc3BsYXkgPSAnaW5oZXJpdCc7XG4gICAgICB0aGlzLnZpc2libGVTbGlkZXIgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNsaWRlci5yb290LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB0aGlzLnZpc2libGVTbGlkZXIgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKiogVXBkYXRlcyB7QGxpbmsgc2xpZGVyfSwgbmVlZGVkIHRvIHNldCBzbGlkZXIgb3B0aW9ucyBhbmQgdG8gdXBkYXRlIHNsaWRlciBwb3NpdGlvbi4gKi9cbiAgcHJpdmF0ZSB1cGRhdGVTbGlkZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hlY2tJc0hpZGVTbGlkZXIoKSkge1xuICAgICAgdGhpcy5zZXRTbGlkZXJWaXNpYmlsaXR5KGZhbHNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRTbGlkZXJWaXNpYmlsaXR5KHRydWUpO1xuICAgIH1cbiAgICBpZiAoKHRoaXMuc2xpZGVyICE9IG51bGwpICYmICh0aGlzLmNhbnZhcyAhPSBudWxsKSkge1xuICAgICAgbGV0IGRpZmZFbmRTY3JvbGxBbmRTbGlkZXJNaW4gPSBNYXRoLmZsb29yKHRoaXMuc2xpZGVyLm1pbiArIHRoaXMuY2FudmFzLndpZHRoIC8gdGhpcy5wb3NpdGlvbldpZHRoV2l0aE1hcmdpbikgLSB0aGlzLkxlbmd0aDtcbiAgICAgIGRpZmZFbmRTY3JvbGxBbmRTbGlkZXJNaW4gPSBkaWZmRW5kU2Nyb2xsQW5kU2xpZGVyTWluID4gMCA/IGRpZmZFbmRTY3JvbGxBbmRTbGlkZXJNaW4gOiAwO1xuICAgICAgbGV0IG5ld01pbiA9IE1hdGguZmxvb3IodGhpcy5zbGlkZXIubWluIC0gZGlmZkVuZFNjcm9sbEFuZFNsaWRlck1pbik7XG4gICAgICBsZXQgbmV3TWF4ID0gTWF0aC5mbG9vcih0aGlzLnNsaWRlci5taW4gLSBkaWZmRW5kU2Nyb2xsQW5kU2xpZGVyTWluKSArIE1hdGguZmxvb3IodGhpcy5jYW52YXMud2lkdGggLyB0aGlzLnBvc2l0aW9uV2lkdGhXaXRoTWFyZ2luKTtcbiAgICAgIGlmICh0aGlzLmNoZWNrSXNIaWRlU2xpZGVyKCkpIHtcbiAgICAgICAgbmV3TWluID0gMDtcbiAgICAgICAgbmV3TWF4ID0gdGhpcy5MZW5ndGggLSAxO1xuICAgICAgfVxuICAgICAgdGhpcy50dXJuT2ZSZXNpemVGb3JPbmVTZXRWYWx1ZSA9IHRydWU7XG4gICAgICB0aGlzLnNsaWRlci5zZXRWYWx1ZXMoMCwgdGhpcy5MZW5ndGgsXG4gICAgICAgIG5ld01pbiwgbmV3TWF4KTtcbiAgICB9XG4gIH1cblxuICAvKiogSGFuZGxlciBvZiBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzLiAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25Qcm9wZXJ0eUNoYW5nZWQocHJvcGVydHk6IERHLlByb3BlcnR5KTogdm9pZCB7XG4gICAgc3VwZXIub25Qcm9wZXJ0eUNoYW5nZWQocHJvcGVydHkpO1xuXG4gICAgc3dpdGNoIChwcm9wZXJ0eS5uYW1lKSB7XG4gICAgY2FzZSAnc2VxdWVuY2VDb2x1bW5OYW1lJzpcbiAgICAgIHRoaXMudXBkYXRlU2VxQ29sKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzdGFydFBvc2l0aW9uTmFtZSc6XG4gICAgICB0aGlzLnVwZGF0ZVNlcUNvbCgpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZW5kUG9zaXRpb25OYW1lJzpcbiAgICAgIHRoaXMudXBkYXRlU2VxQ29sKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdwb3NpdGlvbldpZHRoJzpcbiAgICAgIHRoaXMuX3Bvc2l0aW9uV2lkdGggPSB0aGlzLnBvc2l0aW9uV2lkdGg7XG4gICAgICB0aGlzLnVwZGF0ZVNsaWRlcigpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZml4V2lkdGgnOlxuICAgICAgdGhpcy51cGRhdGVTbGlkZXIoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2ZpdEFyZWEnOlxuICAgICAgdGhpcy51cGRhdGVTbGlkZXIoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3Nocmlua0VtcHR5VGFpbCc6XG4gICAgICB0aGlzLnVwZGF0ZVBvc2l0aW9ucygpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2tpcEVtcHR5UG9zaXRpb25zJzpcbiAgICAgIHRoaXMudXBkYXRlUG9zaXRpb25zKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdwb3NpdGlvbk1hcmdpbic6XG4gICAgICB0aGlzLnVwZGF0ZVNsaWRlcigpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdGhpcy5yZW5kZXIodHJ1ZSk7XG4gIH1cblxuICAvKiogQWRkIGZpbHRlciBoYW5kbGVycyB3aGVuIHRhYmxlIGlzIGEgYXR0YWNoZWQgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvblRhYmxlQXR0YWNoZWQoKSB7XG4gICAgc3VwZXIub25UYWJsZUF0dGFjaGVkKCk7XG5cbiAgICBjb25zdCBkYXRhRnJhbWVUeHQ6IHN0cmluZyA9IHRoaXMuZGF0YUZyYW1lID8gJ2RhdGEnIDogJ251bGwnO1xuICAgIGNvbnNvbGUuZGVidWcoYGJpbzogV2ViTG9nbzwke3RoaXMudmlld2VySWR9Pi5vblRhYmxlQXR0YWNoZWQoIGRhdGFGcmFtZSA9ICR7ZGF0YUZyYW1lVHh0fSApIHN0YXJ0YCk7XG5cbiAgICB0aGlzLnVwZGF0ZVNlcUNvbCgpO1xuXG4gICAgaWYgKHRoaXMuZGF0YUZyYW1lICE9PSB2b2lkIDApIHtcbiAgICAgIHRoaXMuc3Vicy5wdXNoKHRoaXMuZGF0YUZyYW1lLnNlbGVjdGlvbi5vbkNoYW5nZWQuc3Vic2NyaWJlKChfKSA9PiB0aGlzLnJlbmRlcigpKSk7XG4gICAgICB0aGlzLnN1YnMucHVzaCh0aGlzLmRhdGFGcmFtZS5maWx0ZXIub25DaGFuZ2VkLnN1YnNjcmliZSgoXykgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZVBvc2l0aW9ucygpO1xuICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgfSkpO1xuICAgIH1cblxuICAgIHRoaXMuaW5pdCgpO1xuICAgIGNvbnNvbGUuZGVidWcoYGJpbzogV2ViTG9nbzwke3RoaXMudmlld2VySWR9Pi5vblRhYmxlQXR0YWNoZWQoKSBlbmRgKTtcbiAgfVxuXG4gIC8qKiBSZW1vdmUgYWxsIGhhbmRsZXJzIHdoZW4gdGFibGUgaXMgYSBkZXRhY2ggICovXG4gIHB1YmxpYyBvdmVycmlkZSBhc3luYyBkZXRhY2goKSB7XG4gICAgY29uc3QgZGF0YUZyYW1lVHh0ID0gYCR7dGhpcy5kYXRhRnJhbWUgPyAnZGF0YScgOiAnbnVsbCd9YDtcbiAgICBjb25zb2xlLmRlYnVnKGBiaW86IFdlYkxvZ288JHt0aGlzLnZpZXdlcklkfT4ub25UYWJsZUF0dGFjaGVkKCBkYXRhRnJhbWUgPSAke2RhdGFGcmFtZVR4dH0gKSBzdGFydGApO1xuICAgIHN1cGVyLmRldGFjaCgpO1xuXG4gICAgdGhpcy52aWV3U3Vicy5mb3JFYWNoKChzdWIpID0+IHN1Yi51bnN1YnNjcmliZSgpKTtcbiAgICB0aGlzLmhvc3QhLnJlbW92ZSgpO1xuICAgIHRoaXMubXNnSG9zdCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmhvc3QgPSB1bmRlZmluZWQ7XG5cbiAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgY29uc29sZS5kZWJ1ZyhgYmlvOiBXZWJMb2dvPCR7dGhpcy52aWV3ZXJJZH0+Lm9uVGFibGVBdHRhY2hlZCgpIGVuZGApO1xuICB9XG5cbiAgLyoqIEhlbHBlciBmdW5jdGlvbiBmb3IgcmVuZGVyaW5nICovXG4gIHByb3RlY3RlZCBfbnVsbFNlcXVlbmNlKGZpbGxlclJlc2lkdWUgPSAnWCcpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5za2lwRW1wdHlTZXF1ZW5jZXMpXG4gICAgICByZXR1cm4gbmV3IEFycmF5KHRoaXMuTGVuZ3RoKS5maWxsKGZpbGxlclJlc2lkdWUpLmpvaW4oJycpO1xuXG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgLyoqIEhlbHBlciBmdW5jdGlvbiBmb3IgcmVtb3ZlIGVtcHR5IHBvc2l0aW9ucyAqL1xuICAvLyBUT0RPOiB1c2UgdGhpcyBmdW5jdGlvbiBpbiBmcm9tIGNvcmVcbiAgcHJvdGVjdGVkIHJlbW92ZVdoZXJlKGFycmF5OiBBcnJheTxhbnk+LCBwcmVkaWNhdGU6IChUOiBhbnkpID0+IGJvb2xlYW4pOiBBcnJheTxhbnk+IHtcbiAgICBsZXQgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICAgIGxldCB1cGRhdGVJdGVyYXRvciA9IDA7XG4gICAgZm9yIChsZXQgZGVsZXRlSXRlcmF0b3IgPSAwOyBkZWxldGVJdGVyYXRvciA8IGxlbmd0aDsgZGVsZXRlSXRlcmF0b3IrKykge1xuICAgICAgaWYgKCFwcmVkaWNhdGUoYXJyYXlbZGVsZXRlSXRlcmF0b3JdKSkge1xuICAgICAgICBhcnJheVt1cGRhdGVJdGVyYXRvcl0gPSBhcnJheVtkZWxldGVJdGVyYXRvcl07XG4gICAgICAgIHVwZGF0ZUl0ZXJhdG9yKys7XG4gICAgICB9XG4gICAgfVxuICAgIGFycmF5Lmxlbmd0aCA9IHVwZGF0ZUl0ZXJhdG9yO1xuICAgIHJldHVybiBhcnJheTtcbiAgfVxuXG5cbiAgLyoqIEZ1bmN0aW9uIGZvciByZW1vdmluZyBlbXB0eSBwb3NpdGlvbnMgKi9cbiAgcHJvdGVjdGVkIF9yZW1vdmVFbXB0eVBvc2l0aW9ucygpIHtcbiAgICBpZiAodGhpcy5za2lwRW1wdHlQb3NpdGlvbnMpIHtcbiAgICAgIHRoaXMucmVtb3ZlV2hlcmUodGhpcy5wb3NpdGlvbnMsIGl0ZW0gPT4gaXRlbT8uZnJlcVsnLSddPy5jb3VudCA9PT0gaXRlbS5yb3dDb3VudCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIF9jYWxjdWxhdGUocjogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLmhvc3QgfHwgIXRoaXMuc2VxQ29sIHx8ICF0aGlzLmRhdGFGcmFtZSlcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLnVuaXRzSGFuZGxlciA9IG5ldyBVbml0c0hhbmRsZXIodGhpcy5zZXFDb2wpO1xuXG4gICAgdGhpcy5jYWxjU2l6ZSgpO1xuXG4gICAgdGhpcy5wb3NpdGlvbnMgPSBuZXcgQXJyYXkodGhpcy5zdGFydFBvc2l0aW9uIDw9IHRoaXMuZW5kUG9zaXRpb24gPyB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5zdGFydFBvc2l0aW9uICsgMSA6IDApO1xuICAgIGZvciAobGV0IGpQb3MgPSAwOyBqUG9zIDwgdGhpcy5MZW5ndGg7IGpQb3MrKykge1xuICAgICAgY29uc3QgcG9zTmFtZTogc3RyaW5nID0gdGhpcy5wb3NpdGlvbk5hbWVzW3RoaXMuc3RhcnRQb3NpdGlvbiArIGpQb3NdO1xuICAgICAgdGhpcy5wb3NpdGlvbnNbalBvc10gPSBuZXcgUG9zaXRpb25JbmZvKHBvc05hbWUpO1xuICAgIH1cblxuICAgIC8vIDIwMjItMDUtMDUgYXNrYWxraW4gaW5zdHJ1Y3RlZCB0byBzaG93IFdlYkxvZ28gYmFzZWQgb24gZmlsdGVyIChub3Qgc2VsZWN0aW9uKVxuICAgIGNvbnN0IGluZGljZXMgPSB0aGlzLmRhdGFGcmFtZS5maWx0ZXIuZ2V0U2VsZWN0ZWRJbmRleGVzKCk7XG4gICAgLy8gY29uc3QgaW5kaWNlcyA9IHRoaXMuZGF0YUZyYW1lLnNlbGVjdGlvbi50cnVlQ291bnQgPiAwID8gdGhpcy5kYXRhRnJhbWUuc2VsZWN0aW9uLmdldFNlbGVjdGVkSW5kZXhlcygpIDpcbiAgICAvLyAgIHRoaXMuZGF0YUZyYW1lLmZpbHRlci5nZXRTZWxlY3RlZEluZGV4ZXMoKTtcblxuICAgIHRoaXMucm93c01hc2tlZCA9IGluZGljZXMubGVuZ3RoO1xuICAgIHRoaXMucm93c051bGwgPSAwO1xuXG4gICAgZm9yIChjb25zdCBpIG9mIGluZGljZXMpIHtcbiAgICAgIGxldCBzOiBzdHJpbmcgPSA8c3RyaW5nPih0aGlzLnNlcUNvbC5nZXQoaSkpO1xuXG4gICAgICBpZiAoIXMpIHtcbiAgICAgICAgcyA9IHRoaXMuX251bGxTZXF1ZW5jZSgpO1xuICAgICAgICArK3RoaXMucm93c051bGw7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlcU06IHN0cmluZ1tdID0gdGhpcy5zcGxpdHRlciEocyk7XG4gICAgICBmb3IgKGxldCBqUG9zID0gMDsgalBvcyA8IHRoaXMuTGVuZ3RoOyBqUG9zKyspIHtcbiAgICAgICAgY29uc3QgcG1JbmZvID0gdGhpcy5wb3NpdGlvbnNbalBvc10uZnJlcTtcbiAgICAgICAgY29uc3QgbTogc3RyaW5nID0gc2VxTVt0aGlzLnN0YXJ0UG9zaXRpb24gKyBqUG9zXSB8fCAnLSc7XG4gICAgICAgIGlmICghKG0gaW4gcG1JbmZvKSlcbiAgICAgICAgICBwbUluZm9bbV0gPSBuZXcgUG9zaXRpb25Nb25vbWVySW5mbygpO1xuICAgICAgICBwbUluZm9bbV0uY291bnQrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyNyZWdpb24gUG9saXNoIGZyZXEgY291bnRzXG4gICAgZm9yIChsZXQgalBvcyA9IDA7IGpQb3MgPCB0aGlzLkxlbmd0aDsgalBvcysrKSB7XG4gICAgICAvLyBkZWxldGUgdGhpcy5wb3NpdGlvbnNbalBvc10uZnJlcVsnLSddO1xuXG4gICAgICB0aGlzLnBvc2l0aW9uc1tqUG9zXS5yb3dDb3VudCA9IDA7XG4gICAgICBmb3IgKGNvbnN0IG0gaW4gdGhpcy5wb3NpdGlvbnNbalBvc10uZnJlcSlcbiAgICAgICAgdGhpcy5wb3NpdGlvbnNbalBvc10ucm93Q291bnQgKz0gdGhpcy5wb3NpdGlvbnNbalBvc10uZnJlcVttXS5jb3VudDtcbiAgICAgIGlmICh0aGlzLnBvc2l0aW9uSGVpZ2h0ID09IFBvc2l0aW9uSGVpZ2h0LkVudHJvcHkpIHtcbiAgICAgICAgdGhpcy5wb3NpdGlvbnNbalBvc10uc3VtRm9ySGVpZ2h0Q2FsYyA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgbSBpbiB0aGlzLnBvc2l0aW9uc1tqUG9zXS5mcmVxKSB7XG4gICAgICAgICAgY29uc3QgcG4gPSB0aGlzLnBvc2l0aW9uc1tqUG9zXS5mcmVxW21dLmNvdW50IC8gdGhpcy5wb3NpdGlvbnNbalBvc10ucm93Q291bnQ7XG4gICAgICAgICAgdGhpcy5wb3NpdGlvbnNbalBvc10uc3VtRm9ySGVpZ2h0Q2FsYyArPSAtcG4gKiBNYXRoLmxvZzIocG4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vI2VuZHJlZ2lvblxuICAgIHRoaXMuX3JlbW92ZUVtcHR5UG9zaXRpb25zKCk7XG5cbiAgICBjb25zdCBhYnNvbHV0ZU1heEhlaWdodCA9IHRoaXMuY2FudmFzLmhlaWdodCAtIHRoaXMuYXhpc0hlaWdodCAqIHI7XG5cbiAgICAvLyNyZWdpb24gQ2FsY3VsYXRlIHNjcmVlblxuICAgIGZvciAobGV0IGpQb3MgPSAwOyBqUG9zIDwgdGhpcy5MZW5ndGg7IGpQb3MrKykge1xuICAgICAgY29uc3QgZnJlcTogeyBbYzogc3RyaW5nXTogUG9zaXRpb25Nb25vbWVySW5mbyB9ID0gdGhpcy5wb3NpdGlvbnNbalBvc10uZnJlcTtcbiAgICAgIGNvbnN0IHJvd0NvdW50ID0gdGhpcy5wb3NpdGlvbnNbalBvc10ucm93Q291bnQ7XG4gICAgICBjb25zdCBhbHBoYWJldFNpemUgPSB0aGlzLmdldEFscGhhYmV0U2l6ZSgpO1xuICAgICAgaWYgKCh0aGlzLnBvc2l0aW9uSGVpZ2h0ID09IFBvc2l0aW9uSGVpZ2h0LkVudHJvcHkpICYmIChhbHBoYWJldFNpemUgPT0gbnVsbCkpIHtcbiAgICAgICAgZ3Jvay5zaGVsbC5lcnJvcignV2ViTG9nbzogYWxwaGFiZXQgaXMgdW5kZWZpbmVkLicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXhIZWlnaHQgPSAodGhpcy5wb3NpdGlvbkhlaWdodCA9PSBQb3NpdGlvbkhlaWdodC5FbnRyb3B5KSA/IChhYnNvbHV0ZU1heEhlaWdodCAqIChNYXRoLmxvZzIoYWxwaGFiZXRTaXplKSAtICh0aGlzLnBvc2l0aW9uc1tqUG9zXS5zdW1Gb3JIZWlnaHRDYWxjKSkgLyBNYXRoLmxvZzIoYWxwaGFiZXRTaXplKSkgOiBhYnNvbHV0ZU1heEhlaWdodDtcblxuICAgICAgbGV0IHk6IG51bWJlciA9IHRoaXMuYXhpc0hlaWdodCAqIHIgKyAoYWJzb2x1dGVNYXhIZWlnaHQgLSBtYXhIZWlnaHQgLSAxKTtcblxuICAgICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKGZyZXEpLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgaWYgKGFbMF0gIT09ICctJyAmJiBiWzBdICE9PSAnLScpXG4gICAgICAgICAgcmV0dXJuIGJbMV0uY291bnQgLSBhWzFdLmNvdW50O1xuICAgICAgICBlbHNlIGlmIChhWzBdID09PSAnLScgJiYgYlswXSA9PT0gJy0nKVxuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICBlbHNlIGlmIChhWzBdID09PSAnLScpXG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICBlbHNlIC8qIChiWzBdID09PSAnLScpICovXG4gICAgICAgICAgcmV0dXJuICsxO1xuICAgICAgfSk7XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgY29uc3QgcG1JbmZvOiBQb3NpdGlvbk1vbm9tZXJJbmZvID0gZW50cnlbMV07XG4gICAgICAgIC8vIGNvbnN0IG06IHN0cmluZyA9IGVudHJ5WzBdO1xuICAgICAgICBjb25zdCBoOiBudW1iZXIgPSBtYXhIZWlnaHQgKiBwbUluZm8uY291bnQgLyByb3dDb3VudDtcblxuICAgICAgICBwbUluZm8uYm91bmRzID0gbmV3IERHLlJlY3QoalBvcyAqIHRoaXMucG9zaXRpb25XaWR0aFdpdGhNYXJnaW4sIHksIHRoaXMuX3Bvc2l0aW9uV2lkdGgsIGgpO1xuICAgICAgICB5ICs9IGg7XG4gICAgICB9XG4gICAgfVxuICAgIC8vI2VuZHJlZ2lvblxuXG4gIH1cblxuICAvKiogUmVuZGVyIFdlYkxvZ28gc2Vuc2l0aXZlIHRvIGNoYW5nZXMgaW4gcGFyYW1zIG9mIHJlbmRlcmluZ1xuICAgKkBwYXJhbSB7Ym9vbGVhbn0gcmVjYWxjIC0gaW5kaWNhdGVzIHRoYXQgbmVlZCB0byByZWNhbGN1bGF0ZSBkYXRhIGZvciByZW5kZXJpbmdcbiAgICovXG4gIHJlbmRlcihyZWNhbGMgPSB0cnVlKSB7XG4gICAgaWYgKHRoaXMubXNnSG9zdCkge1xuICAgICAgaWYgKHRoaXMuc2VxQ29sICYmICF0aGlzLmNwKSB7XG4gICAgICAgIHRoaXMubXNnSG9zdCEuaW5uZXJUZXh0ID0gYFVua25vd24gcGFsZXR0ZSAoY29sdW1uIHNlbVR5cGU6ICcke3RoaXMuc2VxQ29sLnNlbVR5cGV9JykuYDtcbiAgICAgICAgdGhpcy5tc2dIb3N0IS5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1zZ0hvc3QhLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnNlcUNvbCB8fCAhdGhpcy5kYXRhRnJhbWUgfHwgIXRoaXMuY3AgfHwgdGhpcy5zdGFydFBvc2l0aW9uID09PSAtMSB8fCB0aGlzLmVuZFBvc2l0aW9uID09PSAtMSB8fCB0aGlzLmhvc3QgPT0gbnVsbCB8fCB0aGlzLnNsaWRlciA9PSBudWxsKVxuICAgICAgcmV0dXJuO1xuXG4gICAgY29uc3QgZyA9IHRoaXMuY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgaWYgKCFnKSByZXR1cm47XG5cbiAgICB0aGlzLnNsaWRlci5yb290LnN0eWxlLndpZHRoID0gYCR7dGhpcy5ob3N0LmNsaWVudFdpZHRofXB4YDtcblxuICAgIGNvbnN0IHIgPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztcblxuICAgIGlmIChyZWNhbGMpXG4gICAgICB0aGlzLl9jYWxjdWxhdGUocik7XG5cbiAgICBnLnJlc2V0VHJhbnNmb3JtKCk7XG4gICAgZy5maWxsU3R5bGUgPSBERy5Db2xvci50b0h0bWwodGhpcy5iYWNrZ3JvdW5kQ29sb3IpO1xuICAgIGcuZmlsbFJlY3QoMCwgMCwgdGhpcy5jYW52YXMud2lkdGgsIHRoaXMuY2FudmFzLmhlaWdodCk7XG4gICAgZy50ZXh0QmFzZWxpbmUgPSB0aGlzLnRleHRCYXNlbGluZTtcblxuICAgIGNvbnN0IG1heENvdW50T2ZSb3dzUmVuZGVyZWQgPSB0aGlzLmNvdW50T2ZSZW5kZXJQb3NpdGlvbnMgKyAxO1xuICAgIGNvbnN0IGZpcnN0VmlzaWJsZUluZGV4ID0gKHRoaXMudmlzaWJsZVNsaWRlcikgPyBNYXRoLmZsb29yKHRoaXMuc2xpZGVyLm1pbikgOiAwO1xuICAgIGNvbnN0IGxhc3RWaXNpYmxlSW5kZXggPSBNYXRoLm1pbih0aGlzLkxlbmd0aCwgZmlyc3RWaXNpYmxlSW5kZXggKyBtYXhDb3VudE9mUm93c1JlbmRlcmVkKTtcblxuICAgIC8vI3JlZ2lvbiBQbG90IHBvc2l0aW9uTmFtZXNcbiAgICBjb25zdCBwb3NpdGlvbkZvbnRTaXplID0gMTAgKiByO1xuICAgIGcucmVzZXRUcmFuc2Zvcm0oKTtcbiAgICBnLmZpbGxTdHlsZSA9ICdibGFjayc7XG4gICAgZy50ZXh0QWxpZ24gPSAnY2VudGVyJztcbiAgICBnLmZvbnQgPSBgJHtwb3NpdGlvbkZvbnRTaXplLnRvRml4ZWQoMSl9cHggUm9ib3RvLCBSb2JvdG8gTG9jYWwsIHNhbnMtc2VyaWZgO1xuICAgIGNvbnN0IHBvc05hbWVNYXhXaWR0aCA9IE1hdGgubWF4KC4uLnRoaXMucG9zaXRpb25zLm1hcCgocG9zKSA9PiBnLm1lYXN1cmVUZXh0KHBvcy5uYW1lKS53aWR0aCkpO1xuICAgIGNvbnN0IGhTY2FsZSA9IHBvc05hbWVNYXhXaWR0aCA8ICh0aGlzLl9wb3NpdGlvbldpZHRoIC0gMikgPyAxIDogKHRoaXMuX3Bvc2l0aW9uV2lkdGggLSAyKSAvIHBvc05hbWVNYXhXaWR0aDtcblxuICAgIGZvciAobGV0IGpQb3MgPSB0aGlzLmZpcnN0VmlzaWJsZUluZGV4OyBqUG9zIDwgbGFzdFZpc2libGVJbmRleDsgalBvcysrKSB7XG4gICAgICBjb25zdCBwb3M6IFBvc2l0aW9uSW5mbyA9IHRoaXMucG9zaXRpb25zW2pQb3NdO1xuICAgICAgZy5yZXNldFRyYW5zZm9ybSgpO1xuICAgICAgZy5zZXRUcmFuc2Zvcm0oXG4gICAgICAgIGhTY2FsZSwgMCwgMCwgMSxcbiAgICAgICAgalBvcyAqIHRoaXMucG9zaXRpb25XaWR0aFdpdGhNYXJnaW4gKyB0aGlzLl9wb3NpdGlvbldpZHRoIC8gMiAtIHRoaXMucG9zaXRpb25XaWR0aFdpdGhNYXJnaW4gKiBmaXJzdFZpc2libGVJbmRleCwgMCk7XG4gICAgICBnLmZpbGxUZXh0KHBvcy5uYW1lLCAwLCAwKTtcbiAgICB9XG4gICAgLy8jZW5kcmVnaW9uIFBsb3QgcG9zaXRpb25OYW1lc1xuICAgIGNvbnN0IGZvbnRTdHlsZSA9ICcxNnB4IFJvYm90bywgUm9ib3RvIExvY2FsLCBzYW5zLXNlcmlmJztcbiAgICAvLyBIYWNrcyB0byBzY2FsZSB1cHBlcmNhc2UgY2hhcmFjdGVycyB0byB0YXJnZXQgcmVjdGFuZ2xlXG4gICAgY29uc3QgdXBwZXJjYXNlTGV0dGVyQXNjZW50ID0gMC4yNTtcbiAgICBjb25zdCB1cHBlcmNhc2VMZXR0ZXJIZWlnaHQgPSAxMi4yO1xuICAgIGZvciAobGV0IGpQb3MgPSB0aGlzLmZpcnN0VmlzaWJsZUluZGV4OyBqUG9zIDwgbGFzdFZpc2libGVJbmRleDsgalBvcysrKSB7XG4gICAgICBmb3IgKGNvbnN0IFttb25vbWVyLCBwbUluZm9dIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMucG9zaXRpb25zW2pQb3NdLmZyZXEpKSB7XG4gICAgICAgIGlmIChtb25vbWVyICE9PSAnLScpIHtcbiAgICAgICAgICBjb25zdCBtb25vbWVyVHh0ID0gbW9ub21lclRvU2hvcnQobW9ub21lciwgNSk7XG4gICAgICAgICAgY29uc3QgYiA9IHBtSW5mby5ib3VuZHM7XG4gICAgICAgICAgY29uc3QgbGVmdCA9IGIubGVmdCAtIHRoaXMucG9zaXRpb25XaWR0aFdpdGhNYXJnaW4gKiB0aGlzLmZpcnN0VmlzaWJsZUluZGV4O1xuXG4gICAgICAgICAgZy5yZXNldFRyYW5zZm9ybSgpO1xuICAgICAgICAgIGcuc3Ryb2tlU3R5bGUgPSAnbGlnaHRncmF5JztcbiAgICAgICAgICBnLmxpbmVXaWR0aCA9IDE7XG4gICAgICAgICAgZy5yZWN0KGxlZnQsIGIudG9wLCBiLndpZHRoLCBiLmhlaWdodCk7XG4gICAgICAgICAgZy5maWxsU3R5bGUgPSB0aGlzLmNwLmdldChtb25vbWVyKSA/PyB0aGlzLmNwLmdldCgnb3RoZXInKTtcbiAgICAgICAgICBnLnRleHRBbGlnbiA9ICdsZWZ0JztcbiAgICAgICAgICBnLmZvbnQgPSBmb250U3R5bGU7XG4gICAgICAgICAgLy9nLmZpbGxSZWN0KGIubGVmdCwgYi50b3AsIGIud2lkdGgsIGIuaGVpZ2h0KTtcbiAgICAgICAgICBjb25zdCBtVG06IFRleHRNZXRyaWNzID0gZy5tZWFzdXJlVGV4dChtb25vbWVyVHh0KTtcblxuICAgICAgICAgIGcuc2V0VHJhbnNmb3JtKFxuICAgICAgICAgICAgYi53aWR0aCAvIG1UbS53aWR0aCwgMCwgMCwgYi5oZWlnaHQgLyB1cHBlcmNhc2VMZXR0ZXJIZWlnaHQsXG4gICAgICAgICAgICBsZWZ0LCBiLnRvcCk7XG4gICAgICAgICAgZy5maWxsVGV4dChtb25vbWVyVHh0LCAwLCAtdXBwZXJjYXNlTGV0dGVyQXNjZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBDYWxjdWxhdGUgY2FudmFzIHNpemUgYW4gcG9zaXRpb25XaWR0aCBhbmQgdXBkYXRlcyBwcm9wZXJ0aWVzICovXG4gIHByaXZhdGUgY2FsY1NpemUoKSB7XG4gICAgaWYgKCF0aGlzLmhvc3QpXG4gICAgICByZXR1cm47XG5cbiAgICBjb25zdCByOiBudW1iZXIgPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztcblxuICAgIGxldCB3aWR0aDogbnVtYmVyID0gdGhpcy53aWR0aEFyZWE7XG4gICAgbGV0IGhlaWdodCA9IHRoaXMuaGVpZ2h0QXJlYTtcblxuICAgIGlmICgodGhpcy5maXRBcmVhKSAmJiAoIXRoaXMudmlzaWJsZVNsaWRlcikpIHtcbiAgICAgIGNvbnN0IHNjYWxlID0gTWF0aC5tYXgoMSwgTWF0aC5taW4odGhpcy54U2NhbGUsIHRoaXMueVNjYWxlKSk7XG4gICAgICB3aWR0aCA9IHdpZHRoICogc2NhbGU7XG4gICAgICBoZWlnaHQgPSBoZWlnaHQgKiBzY2FsZTtcbiAgICAgIHRoaXMuX3Bvc2l0aW9uV2lkdGggPSB0aGlzLnBvc2l0aW9uV2lkdGggKiBzY2FsZTtcbiAgICB9XG5cbiAgICB3aWR0aCA9IHRoaXMuTGVuZ3RoICogdGhpcy5wb3NpdGlvbldpZHRoV2l0aE1hcmdpbiAvIHI7XG5cbiAgICB0aGlzLmNhbnZhcy53aWR0aCA9IHRoaXMucm9vdC5jbGllbnRXaWR0aCAqIHI7XG4gICAgdGhpcy5jYW52YXMuc3R5bGUud2lkdGggPSBgJHt0aGlzLnJvb3QuY2xpZW50V2lkdGh9cHhgO1xuXG4gICAgLy8gY29uc3QgY2FudmFzSGVpZ2h0OiBudW1iZXIgPSB3aWR0aCA+IHRoaXMucm9vdC5jbGllbnRXaWR0aCA/IGhlaWdodCAtIDggOiBoZWlnaHQ7XG4gICAgdGhpcy5ob3N0LnN0eWxlLnNldFByb3BlcnR5KCdoZWlnaHQnLCBgJHtoZWlnaHR9cHhgKTtcbiAgICBjb25zdCBjYW52YXNIZWlnaHQ6IG51bWJlciA9IHRoaXMuaG9zdC5jbGllbnRIZWlnaHQ7XG4gICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gY2FudmFzSGVpZ2h0ICogcjtcblxuICAgIC8vIEFkanVzdCBob3N0IGFuZCByb290IHdpZHRoXG4gICAgaWYgKHRoaXMuZml4V2lkdGgpIHtcbiAgICAgIC8vIGZ1bGwgd2lkdGggZm9yIGNhbnZhcyBob3N0IGFuZCByb290XG4gICAgICB0aGlzLnJvb3Quc3R5bGUud2lkdGggPSB0aGlzLmhvc3Quc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XG4gICAgICB0aGlzLnJvb3Quc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcbiAgICAgIHRoaXMucm9vdC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICAgICAgdGhpcy5ob3N0LnN0eWxlLnNldFByb3BlcnR5KCdvdmVyZmxvdy15JywgJ2hpZGRlbicsICdpbXBvcnRhbnQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYWxsb3cgc2Nyb2xsIGNhbnZhcyBpbiByb290XG4gICAgICB0aGlzLnJvb3Quc3R5bGUud2lkdGggPSB0aGlzLmhvc3Quc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgICB0aGlzLmhvc3Quc3R5bGUub3ZlcmZsb3dYID0gJ2F1dG8haW1wb3J0YW50JztcbiAgICAgIHRoaXMuaG9zdC5zdHlsZS5zZXRQcm9wZXJ0eSgndGV4dC1hbGlnbicsIHRoaXMuaG9yaXpvbnRhbEFsaWdubWVudCk7XG5cbiAgICAgIGNvbnN0IHNsaWRlckhlaWdodCA9IHRoaXMudmlzaWJsZVNsaWRlciA/IDEwIDogMDtcblxuICAgICAgLy8gdmVydGljYWwgYWxpZ25tZW50XG4gICAgICBsZXQgaG9zdFRvcE1hcmdpbiA9IDA7XG4gICAgICBzd2l0Y2ggKHRoaXMudmVydGljYWxBbGlnbm1lbnQpIHtcbiAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgIGhvc3RUb3BNYXJnaW4gPSAwO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21pZGRsZSc6XG4gICAgICAgIGhvc3RUb3BNYXJnaW4gPSBNYXRoLm1heCgwLCAodGhpcy5yb290LmNsaWVudEhlaWdodCAtIGhlaWdodCkgLyAyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICBob3N0VG9wTWFyZ2luID0gTWF0aC5tYXgoMCwgdGhpcy5yb290LmNsaWVudEhlaWdodCAtIGhlaWdodCAtIHNsaWRlckhlaWdodCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy8gaG9yaXpvbnRhbCBhbGlnbm1lbnRcbiAgICAgIGxldCBob3N0TGVmdE1hcmdpbiA9IDA7XG4gICAgICBzd2l0Y2ggKHRoaXMuaG9yaXpvbnRhbEFsaWdubWVudCkge1xuICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgIGhvc3RMZWZ0TWFyZ2luID0gMDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgICBob3N0TGVmdE1hcmdpbiA9IE1hdGgubWF4KDAsICh0aGlzLnJvb3QuY2xpZW50V2lkdGggLSB3aWR0aCkgLyAyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgIGhvc3RMZWZ0TWFyZ2luID0gTWF0aC5tYXgoMCwgdGhpcy5yb290LmNsaWVudFdpZHRoIC0gd2lkdGgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHRoaXMuaG9zdC5zdHlsZS5zZXRQcm9wZXJ0eSgnbWFyZ2luLXRvcCcsIGAke2hvc3RUb3BNYXJnaW59cHhgLCAnaW1wb3J0YW50Jyk7XG4gICAgICB0aGlzLmhvc3Quc3R5bGUuc2V0UHJvcGVydHkoJ21hcmdpbi1sZWZ0JywgYCR7aG9zdExlZnRNYXJnaW59cHhgLCAnaW1wb3J0YW50Jyk7XG4gICAgICBpZiAodGhpcy5zbGlkZXIgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLnNsaWRlci5yb290LnN0eWxlLnNldFByb3BlcnR5KCdtYXJnaW4tdG9wJywgYCR7aG9zdFRvcE1hcmdpbiArIGNhbnZhc0hlaWdodH1weGAsICdpbXBvcnRhbnQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucm9vdC5jbGllbnRIZWlnaHQgPD0gaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuaG9zdC5zdHlsZS5zZXRQcm9wZXJ0eSgnaGVpZ2h0JywgYCR7dGhpcy5yb290LmNsaWVudEhlaWdodH1weGApO1xuICAgICAgICB0aGlzLmhvc3Quc3R5bGUuc2V0UHJvcGVydHkoJ292ZXJmbG93LXknLCBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaG9zdC5zdHlsZS5zZXRQcm9wZXJ0eSgnb3ZlcmZsb3cteScsICdoaWRkZW4nLCAnaW1wb3J0YW50Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldEFscGhhYmV0U2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnVuaXRzSGFuZGxlcj8uZ2V0QWxwaGFiZXRTaXplKCkgPz8gMDtcbiAgfVxufVxuIl19
|