@jax-data-science/sci-image-visualizer 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +49 -0
- package/esm2022/lib/contracts/display-types.mjs +1 -1
- package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
- package/esm2022/lib/contracts/toolbar-tool.contract.mjs +46 -4
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +2 -3
- package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +2 -2
- package/esm2022/lib/implementations/plotly/plotly.service.mjs +2 -3
- package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +44 -3
- package/esm2022/lib/toolbar/toolbar.component.mjs +15 -3
- package/esm2022/lib/visualizer.component.mjs +221 -7
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +325 -18
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
- package/lib/contracts/display-types.d.ts +10 -0
- package/lib/contracts/plot-type-contribution.contract.d.ts +27 -0
- package/lib/contracts/toolbar-tool.contract.d.ts +84 -5
- package/lib/toolbar/brush/brush-tool.service.d.ts +21 -0
- package/lib/toolbar/toolbar.component.d.ts +11 -3
- package/lib/visualizer.component.d.ts +54 -2
- package/package.json +1 -1
|
@@ -53,6 +53,8 @@ export class BrushToolService {
|
|
|
53
53
|
this.lastMatrix = null;
|
|
54
54
|
this.dragging = false;
|
|
55
55
|
this.size = DEFAULT_BRUSH_SIZE;
|
|
56
|
+
/** The class being painted ({@link BrushOptions.label} / `color`); null = plain brush. */
|
|
57
|
+
this.paintClass = null;
|
|
56
58
|
this.boundMouseDown = (e) => this.onMouseDown(e);
|
|
57
59
|
this.boundMouseMove = (e) => this.onMouseMove(e);
|
|
58
60
|
this.boundMouseUp = (e) => this.onMouseUp(e);
|
|
@@ -65,15 +67,39 @@ export class BrushToolService {
|
|
|
65
67
|
/** Toggle the brush on/off. */
|
|
66
68
|
setMode(active, options = {}) {
|
|
67
69
|
this.active = active;
|
|
70
|
+
// Size applies whether arming or not, as before brush classes: a host may set it
|
|
71
|
+
// while the brush is off, and the next arm without options keeps it.
|
|
68
72
|
if (options.size != null)
|
|
69
73
|
this.setSize(options.size);
|
|
70
74
|
if (active) {
|
|
75
|
+
// Arming sets the class in full: no label/color means the plain brush.
|
|
76
|
+
this.setOptions({ label: undefined, color: undefined, ...options });
|
|
71
77
|
this.createOverlay();
|
|
72
78
|
}
|
|
73
79
|
else {
|
|
74
80
|
this.destroyOverlay();
|
|
81
|
+
this.paintClass = null;
|
|
75
82
|
}
|
|
76
83
|
}
|
|
84
|
+
/**
|
|
85
|
+
* Update size and/or class while armed. The class changes only when `label`
|
|
86
|
+
* or `color` is passed (as a key, even `undefined`), so a size-only update
|
|
87
|
+
* keeps it. Switching class drops the active region, so the next stroke
|
|
88
|
+
* starts a region of the new class.
|
|
89
|
+
*/
|
|
90
|
+
setOptions(options = {}) {
|
|
91
|
+
if (options.size != null)
|
|
92
|
+
this.setSize(options.size);
|
|
93
|
+
if (!('label' in options) && !('color' in options))
|
|
94
|
+
return;
|
|
95
|
+
const next = options.label != null || options.color != null
|
|
96
|
+
? { label: options.label, color: options.color }
|
|
97
|
+
: null;
|
|
98
|
+
if (next?.label !== this.paintClass?.label || next?.color !== this.paintClass?.color) {
|
|
99
|
+
this.resetStroke();
|
|
100
|
+
}
|
|
101
|
+
this.paintClass = next;
|
|
102
|
+
}
|
|
77
103
|
/** Live-update the brush size (matrix-pixel diameter). */
|
|
78
104
|
setSize(size) {
|
|
79
105
|
if (!Number.isFinite(size) || size <= 0)
|
|
@@ -344,6 +370,12 @@ export class BrushToolService {
|
|
|
344
370
|
this.strokeRegionId = null;
|
|
345
371
|
this.strokeExtraIds = [];
|
|
346
372
|
}
|
|
373
|
+
/** Whether the stroke may adopt or merge `region`: always for the plain brush,
|
|
374
|
+
* otherwise only a region of the class being painted. */
|
|
375
|
+
paintsInto(region) {
|
|
376
|
+
const label = this.paintClass?.label;
|
|
377
|
+
return label == null || region?.label === label;
|
|
378
|
+
}
|
|
347
379
|
/** A region's closed-polygon vertices (image/data coords), or null when it
|
|
348
380
|
* isn't a fillable closed polygon (rectangles, open polylines). */
|
|
349
381
|
regionVerts(region) {
|
|
@@ -390,6 +422,8 @@ export class BrushToolService {
|
|
|
390
422
|
return false;
|
|
391
423
|
// Most-recently-added regions are on top — check them first.
|
|
392
424
|
for (let i = regions.length - 1; i >= 0; i--) {
|
|
425
|
+
if (!this.paintsInto(regions[i]))
|
|
426
|
+
continue; // another class's region
|
|
393
427
|
const verts = this.regionVerts(regions[i]);
|
|
394
428
|
if (!verts)
|
|
395
429
|
continue;
|
|
@@ -426,6 +460,8 @@ export class BrushToolService {
|
|
|
426
460
|
const region = regions[i];
|
|
427
461
|
if (region.id != null && region.id === this.strokeRegionId)
|
|
428
462
|
continue;
|
|
463
|
+
if (!this.paintsInto(region))
|
|
464
|
+
continue; // never fold another class in
|
|
429
465
|
const verts = this.regionVerts(region);
|
|
430
466
|
if (!verts)
|
|
431
467
|
continue;
|
|
@@ -516,14 +552,19 @@ export class BrushToolService {
|
|
|
516
552
|
poly.holes = c.holes;
|
|
517
553
|
const region = new Region();
|
|
518
554
|
region.bounds = poly;
|
|
519
|
-
|
|
555
|
+
const paint = this.paintClass;
|
|
556
|
+
region.color = paint?.color ?? this.host.getShapeColor();
|
|
557
|
+
// An explicit class colour must survive a preset (re)apply, like a colour
|
|
558
|
+
// picked in the region editor (jit-ui#70).
|
|
559
|
+
if (paint?.color != null)
|
|
560
|
+
region.colorOverridden = true;
|
|
520
561
|
if (existing) {
|
|
521
562
|
region.id = existing.id;
|
|
522
563
|
region.name = existing.name;
|
|
523
564
|
}
|
|
524
565
|
// Default class/annotation name, matching the overlay-drawn regions and the
|
|
525
566
|
// wand so a brush region isn't left unlabeled.
|
|
526
|
-
region.label = existing?.label ?? 'Region';
|
|
567
|
+
region.label = existing?.label ?? paint?.label ?? 'Region';
|
|
527
568
|
if (existing) {
|
|
528
569
|
const idx = regions.findIndex((r) => r.id === id);
|
|
529
570
|
if (idx >= 0)
|
|
@@ -543,4 +584,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
|
|
|
543
584
|
type: Injectable,
|
|
544
585
|
args: [{ providedIn: 'root' }]
|
|
545
586
|
}], ctorParameters: () => [{ type: i1.WandService }] });
|
|
546
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJ1c2gtdG9vbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90b29sYmFyL2JydXNoL2JydXNoLXRvb2wuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVuRCxPQUFPLEVBQVksWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzNFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7OztBQU90RCxrRUFBa0U7QUFDbEUsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLENBQUM7QUFXOUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBRUgsTUFBTSxPQUFPLGdCQUFnQjtJQStCM0IsWUFBb0IsV0FBd0I7UUFBeEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUE3QnBDLFlBQU8sR0FBNkIsSUFBSSxDQUFDO1FBQ3pDLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFFdkI7Ozs7V0FJRztRQUNLLFdBQU0sR0FBb0IsSUFBSSxDQUFDO1FBQ3ZDO3FGQUM2RTtRQUNyRSxtQkFBYyxHQUFrQixJQUFJLENBQUM7UUFDN0M7NkVBQ3FFO1FBQzdELG1CQUFjLEdBQWtCLElBQUksQ0FBQztRQUM3Qzs7MkVBRW1FO1FBQzNELG1CQUFjLEdBQWEsRUFBRSxDQUFDO1FBQ3RDOzZFQUNxRTtRQUM3RCxlQUFVLEdBQW9DLElBQUksQ0FBQztRQUNuRCxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLFNBQUksR0FBRyxrQkFBa0IsQ0FBQztRQU9oQyxJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pELElBQUks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LENBQUMsRUFBRSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRTlFLE1BQU0sSUFBSSxHQUFHLElBQUksVUFBVSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUN2QyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztRQUN0QixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztRQUN0QixLQUFLLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzFCLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ2pFLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELDZFQUE2RTtJQUNyRSxhQUFhLENBQUMsT0FBZSxFQUFFLE9BQWU7UUFDcEQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN0QixJQUFJLENBQUMsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3JCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFD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dkIsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7OEdBN2hCVSxnQkFBZ0I7a0hBQWhCLGdCQUFnQixjQURILE1BQU07OzJGQUNuQixnQkFBZ0I7a0JBRDVCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBXYW5kU2VydmljZSB9IGZyb20gJy4uL3dhbmQvd2FuZC5zZXJ2aWNlJztcbmltcG9ydCB7IENhY2hlZEltYWdlRGF0YSwgV2FuZFRvb2xIb3N0IH0gZnJvbSAnLi4vd2FuZC93YW5kLXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBCQm94TWFzaywgbWFza3NPdmVybGFwLCB1bmlvbk1hc2tzIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlb21ldHJ5JztcbmltcG9ydCB7IFJlZ2lvbiwgUG9seWdvbiB9IGZyb20gJy4uLy4uL21vZGVscy9yZWdpb24nO1xuXG4vKiogQnJ1c2ggcGFyYW1ldGVycy4gYHNpemVgIGlzIHRoZSBicnVzaCAqZGlhbWV0ZXIqIGluIG1hdHJpeCAoaW1hZ2UpIHBpeGVscy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnJ1c2hPcHRpb25zIHtcbiAgc2l6ZT86IG51bWJlcjtcbn1cblxuLyoqIERlZmF1bHQgYnJ1c2ggZGlhbWV0ZXIgKG1hdHJpeCBwaXhlbHMpIGlmIG5vbmUgaXMgc3VwcGxpZWQuICovXG5jb25zdCBERUZBVUxUX0JSVVNIX1NJWkUgPSA0MDtcblxuLyoqXG4gKiBUaGUgYnJ1c2ggaG9zdCBpcyBpZGVudGljYWwgdG8gdGhlIHdhbmQncyDigJQgYm90aCBuZWVkIHRoZSBjYWNoZWQtaW1hZ2VcbiAqIGNvb3JkaW5hdGUgZnJhbWUsIHRoZSBvdmVybGF5IGNvbnRhaW5lciwgdGhlIGNvb3JkaW5hdGUgdHJhbnNmb3JtLCBhbmRcbiAqIHJlYWQvd3JpdGUgYWNjZXNzIHRvIHRoZSBzaGFyZWQgcmVnaW9uIGxpc3QuIFRoZSBicnVzaCBpZ25vcmVzIHRoZSB3YW5kJ3NcbiAqIHBpeGVsIHZhbHVlcyAoaXQgcGFpbnRzIGEgZ2VvbWV0cmljIGRpc2MgcmF0aGVyIHRoYW4gZmxvb2QtZmlsbGluZyBieSBjb2xvdXIpLFxuICogc28gcmV1c2luZyB7QGxpbmsgV2FuZFRvb2xIb3N0fSBsZXRzIGVhY2ggYmFja2VuZCBiaW5kIHRoZSBzYW1lIGhvc3Qgb2JqZWN0LlxuICovXG5leHBvcnQgdHlwZSBCcnVzaFRvb2xIb3N0ID0gV2FuZFRvb2xIb3N0O1xuXG4vKipcbiAqIFF1UGF0aC1zdHlsZSBicnVzaCB0b29sLiBQYWludGluZyBhIHN0cm9rZSB1bmlvbnMgYSBkaXNjIG9mIHRoZSBjb25maWd1cmVkXG4gKiBzaXplIGludG8gdGhlIGFjdGl2ZSByZWdpb24gYXMgdGhlIGN1cnNvciBkcmFnczsgaG9sZGluZyA8a2JkPlNoaWZ0PC9rYmQ+XG4gKiBzdWJ0cmFjdHMgaW5zdGVhZCAoZXJhc2VyIGJydXNoKSwgbWF0Y2hpbmcgdGhlIHdhbmQncyBtb2RpZmllci4gVGhlIHN0cm9rZSBpc1xuICogYWNjdW11bGF0ZWQgYXMgYSBiYm94LXJlbGF0aXZlIG1hc2sgKGV4YWN0bHkgbGlrZSB7QGxpbmsgV2FuZFRvb2xTZXJ2aWNlfSkgc29cbiAqIHRoZSBicnVzaCBpbmhlcml0cyB0aGUgd2FuZCdzIGFkb3B0LWV4aXN0aW5nLXJlZ2lvbiBhbmQgbWVyZ2Utb24tdG91Y2hcbiAqIGJlaGF2aW91ciwgdGhlbiB0aGUgdW5pb24gYm91bmRhcnkgaXMgdHJhY2VkIGJhY2sgaW50byBhIHBvbHlnb24gUmVnaW9uLlxuICpcbiAqIE5vIHBpeGVsIHNhbXBsaW5nIGFuZCBubyBjdXJzb3IgaW5kaWNhdG9yOiB0aGUgcGFpbnRlZCBzdHJva2UgaXRzZWxmIHNob3dzIHRoZVxuICogYnJ1c2ggc2l6ZS4gVGhlIG92ZXJsYXkgY2FudmFzIG9ubHkgY2FwdHVyZXMgdGhlIHBvaW50ZXIuXG4gKlxuICogTGlmZWN5Y2xlIG1pcnJvcnMgdGhlIHdhbmQ6IGEgYmFja2VuZCBiaW5kcyBpdHMgaG9zdCBvbmNlLCB0aGVuIHRvZ2dsZXMgdGhlXG4gKiB0b29sIHdpdGggYHNldE1vZGUodHJ1ZSB8IGZhbHNlLCBvcHRpb25zKWAuXG4gKlxuICogSG9sZXMgLyBkb251dHMgKGppdC11aSM4NSk6IGJydXNoaW5nIGEgcmluZyB0aGF0IGVuY2xvc2VzIGFuIHVucGFpbnRlZCBhcmVhXG4gKiBrZWVwcyB0aGUgZW5jbG9zZWQgaG9sZSDigJQge0BsaW5rIFdhbmRTZXJ2aWNlLm1hc2tUb1BvbHlnb25zfSB0cmFjZXMgaW50ZXJpb3JcbiAqIHJpbmdzIGludG8ge0BsaW5rIFBvbHlnb24uaG9sZXN9LCB3aGljaCBhZG9wdC9tZXJnZSBwcmVzZXJ2ZSAodGhlIHJlLXJhc3Rlcml6ZVxuICogcHVuY2hlcyB0aGUgaG9sZXMgYmFjayBvdXQpLiBUaGUgT3BlblNlYWRyYWdvbiBvdmVybGF5IHJlbmRlcnMgdGhlbSB3aXRoXG4gKiBldmVuLW9kZCBmaWxsIGFuZCBHZW9KU09OIHJvdW5kLXRyaXBzIHRoZW0gYXMgZXh0cmEgUG9seWdvbiByaW5ncy4gVGhlIFBsb3RseVxuICogKEhlYXRtYXApIGJhY2tlbmQgY3VycmVudGx5IHJlbmRlcnMgdGhlIGZpbGxlZCBleHRlcmlvciBvbmx5LlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIEJydXNoVG9vbFNlcnZpY2Uge1xuICBwcml2YXRlIGhvc3QhOiBCcnVzaFRvb2xIb3N0O1xuICBwcml2YXRlIG92ZXJsYXk6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYWN0aXZlID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEFjY3VtdWxhdGVkIGJydXNoIHJlZ2lvbiAoYmJveC1yZWxhdGl2ZSBtYXNrKS4gUGVyc2lzdHMgYWNyb3NzIG1vdXNldXAgc28gYVxuICAgKiBzdWJzZXF1ZW50IHN0cm9rZSBleHRlbmRzIHRoZSAqc2FtZSogcmVnaW9uIHVudGlsIHRoZSB1c2VyIHN3aXRjaGVzIHRvb2wg4oCUXG4gICAqIG1hdGNoaW5nIFF1UGF0aCwgYW5kIHRoZSB3YW5kLlxuICAgKi9cbiAgcHJpdmF0ZSBzdHJva2U6IEJCb3hNYXNrIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBJZCBvZiB0aGUgcmVnaW9uIHRoaXMgc3Ryb2tlIGlzIGVkaXRpbmcgKG51bGwgPSBhIGZyZXNoIHJlZ2lvbikuIEZvciBhblxuICAgKiAgZXJhc2UgdGhhdCBzcGxpdHMgdGhlIHJlZ2lvbiwgdGhpcyB0cmFja3MgdGhlIGxhcmdlc3QgcmVzdWx0aW5nIHBpZWNlLiAqL1xuICBwcml2YXRlIHN0cm9rZVJlZ2lvbklkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIFJlYWRiYWNrIHJhdGlvL29yaWdpbiBzaWduYXR1cmUgdGhlIGFjdGl2ZSBzdHJva2UgaXMgdGllZCB0bzsgYSBjaGFuZ2UgKHpvb20vcGFuKSBpbnZhbGlkYXRlc1xuICAgKiAgaXQgc28gaXQgaXNuJ3QgcmUtY29tbWl0dGVkIGF0IGEgZGlmZmVyZW50IHNjYWxlIChqaXQtdWkjMTAyKS4gKi9cbiAgcHJpdmF0ZSBzdHJva2VSYXRpb1NpZzogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBJZHMgb2YgdGhlIGV4dHJhIHJlZ2lvbnMgcHJvZHVjZWQgd2hlbiBhbiBlcmFzZSBzdHJva2Ugc3BsaXRzIGEgcmVnaW9uXG4gICAqICBpbnRvIGRpc2Nvbm5lY3RlZCBwaWVjZXMg4oCUIHJldXNlZCBhY3Jvc3MgZHJhZyB0aWNrcyBzbyB0aGUgc3BsaXQgcGllY2VzXG4gICAqICBrZWVwIHN0YWJsZSBpZGVudGl0aWVzIGluc3RlYWQgb2YgYmVpbmcgcmVjcmVhdGVkIGVhY2ggdGljay4gKi9cbiAgcHJpdmF0ZSBzdHJva2VFeHRyYUlkczogbnVtYmVyW10gPSBbXTtcbiAgLyoqIFByZXZpb3VzIGN1cnNvciBwb3NpdGlvbiAobWF0cml4IGNvb3Jkcykgd2l0aGluIHRoZSBjdXJyZW50IGRyYWcsIHNvIGZhc3RcbiAgICogIGRyYWdzIHBhaW50IGEgY29udGludW91cyBzdHJva2UgcmF0aGVyIHRoYW4gZGlzY29ubmVjdGVkIGRhYnMuICovXG4gIHByaXZhdGUgbGFzdE1hdHJpeDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZHJhZ2dpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBzaXplID0gREVGQVVMVF9CUlVTSF9TSVpFO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYm91bmRNb3VzZURvd246IChlOiBNb3VzZUV2ZW50KSA9PiB2b2lkO1xuICBwcml2YXRlIHJlYWRvbmx5IGJvdW5kTW91c2VNb3ZlOiAoZTogTW91c2VFdmVudCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSBib3VuZE1vdXNlVXA6IChlOiBNb3VzZUV2ZW50KSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgd2FuZFNlcnZpY2U6IFdhbmRTZXJ2aWNlKSB7XG4gICAgdGhpcy5ib3VuZE1vdXNlRG93biA9IChlKSA9PiB0aGlzLm9uTW91c2VEb3duKGUpO1xuICAgIHRoaXMuYm91bmRNb3VzZU1vdmUgPSAoZSkgPT4gdGhpcy5vbk1vdXNlTW92ZShlKTtcbiAgICB0aGlzLmJvdW5kTW91c2VVcCA9IChlKSA9PiB0aGlzLm9uTW91c2VVcChlKTtcbiAgfVxuXG4gIC8qKiBXaXJlIHRoZSB0b29sIHRvIGl0cyBob3N0LiBNdXN0IGJlIGNhbGxlZCBvbmNlIGJlZm9yZSBgc2V0TW9kZSh0cnVlKWAuICovXG4gIGJpbmRIb3N0KGhvc3Q6IEJydXNoVG9vbEhvc3QpIHtcbiAgICB0aGlzLmhvc3QgPSBob3N0O1xuICB9XG5cbiAgLy8g4pSA4pSAIFB1YmxpYyBBUEkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIFRvZ2dsZSB0aGUgYnJ1c2ggb24vb2ZmLiAqL1xuICBzZXRNb2RlKGFjdGl2ZTogYm9vbGVhbiwgb3B0aW9uczogQnJ1c2hPcHRpb25zID0ge30pIHtcbiAgICB0aGlzLmFjdGl2ZSA9IGFjdGl2ZTtcbiAgICBpZiAob3B0aW9ucy5zaXplICE9IG51bGwpIHRoaXMuc2V0U2l6ZShvcHRpb25zLnNpemUpO1xuICAgIGlmIChhY3RpdmUpIHtcbiAgICAgIHRoaXMuY3JlYXRlT3ZlcmxheSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRlc3Ryb3lPdmVybGF5KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIExpdmUtdXBkYXRlIHRoZSBicnVzaCBzaXplIChtYXRyaXgtcGl4ZWwgZGlhbWV0ZXIpLiAqL1xuICBzZXRTaXplKHNpemU6IG51bWJlcikge1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHNpemUpIHx8IHNpemUgPD0gMCkgcmV0dXJuO1xuICAgIHRoaXMuc2l6ZSA9IHNpemU7XG4gIH1cblxuICAvKiogRHJvcCB0aGUgYWN0aXZlIGJydXNoIHJlZ2lvbiBzbyB0aGUgbmV4dCBzdHJva2Ugc3RhcnRzIGEgbmV3IG9uZS4gKi9cbiAgY2xlYXJBY3RpdmVSZWdpb24oKSB7XG4gICAgdGhpcy5yZXNldFN0cm9rZSgpO1xuICB9XG5cbiAgLy8g4pSA4pSAIE92ZXJsYXkgbGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHByaXZhdGUgY3JlYXRlT3ZlcmxheSgpIHtcbiAgICBjb25zdCBwbG90RWwgPSB0aGlzLmhvc3QuZ2V0T3ZlcmxheUNvbnRhaW5lcigpO1xuICAgIGlmICghcGxvdEVsIHx8IHRoaXMub3ZlcmxheSkgcmV0dXJuO1xuXG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICBjYW52YXMuc3R5bGUudG9wID0gJzAnO1xuICAgIGNhbnZhcy5zdHlsZS5sZWZ0ID0gJzAnO1xuICAgIGNhbnZhcy5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnO1xuICAgIGNhbnZhcy5zdHlsZS5jdXJzb3IgPSAnY3Jvc3NoYWlyJztcbiAgICBjYW52YXMuc3R5bGUuekluZGV4ID0gJzEwMCc7XG4gICAgY2FudmFzLndpZHRoID0gcGxvdEVsLm9mZnNldFdpZHRoO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBwbG90RWwub2Zmc2V0SGVpZ2h0O1xuXG4gICAgcGxvdEVsLmFwcGVuZENoaWxkKGNhbnZhcyk7XG4gICAgdGhpcy5vdmVybGF5ID0gY2FudmFzO1xuXG4gICAgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuYm91bmRNb3VzZURvd24pO1xuICAgIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmJvdW5kTW91c2VNb3ZlKTtcbiAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuYm91bmRNb3VzZVVwKTtcbiAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHRoaXMuYm91bmRNb3VzZVVwKTtcbiAgfVxuXG4gIHByaXZhdGUgZGVzdHJveU92ZXJsYXkoKSB7XG4gICAgaWYgKCF0aGlzLm92ZXJsYXkpIHJldHVybjtcbiAgICB0aGlzLm92ZXJsYXkucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5ib3VuZE1vdXNlRG93bik7XG4gICAgdGhpcy5vdmVybGF5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuYm91bmRNb3VzZU1vdmUpO1xuICAgIHRoaXMub3ZlcmxheS5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5ib3VuZE1vdXNlVXApO1xuICAgIHRoaXMub3ZlcmxheS5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgdGhpcy5ib3VuZE1vdXNlVXApO1xuICAgIHRoaXMub3ZlcmxheS5yZW1vdmUoKTtcbiAgICB0aGlzLm92ZXJsYXkgPSBudWxsO1xuICAgIHRoaXMucmVzZXRTdHJva2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgb25Nb3VzZURvd24oZTogTW91c2VFdmVudCkge1xuICAgIGlmIChlLmJ1dHRvbiAhPT0gMCkgcmV0dXJuO1xuICAgIHRoaXMuZHJhZ2dpbmcgPSB0cnVlO1xuICAgIHRoaXMubGFzdE1hdHJpeCA9IG51bGw7IC8vIGZpcnN0IHN0YW1wIG9mIHRoaXMgZHJhZyBpcyBhIHNpbmdsZSBkYWJcbiAgICB0aGlzLmFwcGx5QXRDbGllbnQoZSwgdHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIG9uTW91c2VNb3ZlKGU6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuZHJhZ2dpbmcpIHJldHVybjtcbiAgICBpZiAoKGUuYnV0dG9ucyAmIDEpID09PSAwKSB7XG4gICAgICB0aGlzLmRyYWdnaW5nID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYXBwbHlBdENsaWVudChlLCBmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIG9uTW91c2VVcChfOiBNb3VzZUV2ZW50KSB7XG4gICAgLy8gU3RvcCBhY2N1bXVsYXRpbmcgZnJvbSB0aGlzIGRyYWcsIGJ1dCBrZWVwIHRoZSByZWdpb24gYWxpdmUgc28gdGhlIG5leHRcbiAgICAvLyBtb3VzZWRvd24gZXh0ZW5kcyBpdC4gQ2xlYXIgbGFzdE1hdHJpeCBzbyB0aGUgbmV4dCBkcmFnIHN0YXJ0cyBhIGRhYi5cbiAgICB0aGlzLmRyYWdnaW5nID0gZmFsc2U7XG4gICAgdGhpcy5sYXN0TWF0cml4ID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRTdHJva2UoKSB7XG4gICAgdGhpcy5zdHJva2UgPSBudWxsO1xuICAgIHRoaXMuc3Ryb2tlUmVnaW9uSWQgPSBudWxsO1xuICAgIHRoaXMuc3Ryb2tlRXh0cmFJZHMgPSBbXTtcbiAgICB0aGlzLmxhc3RNYXRyaXggPSBudWxsO1xuICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBQZXItdGljayBzdHJva2UgbG9naWMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFBhaW50IChvciBlcmFzZSkgYSBkaXNjIOKAlCBvciBhIHN3ZXB0IGxpbmUgb2YgZGlzY3Mgc2luY2UgdGhlIHByZXZpb3VzXG4gICAqIHRpY2sg4oCUIGludG8gdGhlIGFjdGl2ZSByZWdpb24ncyBhY2N1bXVsYXRvciBtYXNrLCByZS10cmFjZSB0aGUgYm91bmRhcnksXG4gICAqIGFuZCBjb21taXQgdGhlIHVwZGF0ZWQgUmVnaW9uLiBTaGlmdCA9IGVyYXNlLlxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseUF0Q2xpZW50KGU6IE1vdXNlRXZlbnQsIGlzU3RhcnQ6IGJvb2xlYW4pIHtcbiAgICBpZiAoIXRoaXMub3ZlcmxheSkgcmV0dXJuO1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuaG9zdC5nZXRDYWNoZWRJbWFnZURhdGEoKTtcbiAgICBpZiAoIWNhY2hlZCB8fCBjYWNoZWQuZnJhbWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVnaW9ucyA9IHRoaXMuaG9zdC5nZXRSZWdpb25zKCk7XG5cbiAgICBjb25zdCB0cmFuc2Zvcm0gPSB0aGlzLmhvc3QuZ2V0Q29vcmRpbmF0ZVRyYW5zZm9ybSgpO1xuICAgIGlmICghdHJhbnNmb3JtLmlzUmVhZHkoKSkgcmV0dXJuO1xuICAgIGNvbnN0IHsgeDogZGF0YVgsIHk6IGRhdGFZIH0gPSB0cmFuc2Zvcm0uY2xpZW50VG9EYXRhKGUuY2xpZW50WCwgZS5jbGllbnRZKTtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShkYXRhWCkgfHwgIU51bWJlci5pc0Zpbml0ZShkYXRhWSkpIHJldHVybjtcblxuICAgIC8vIEhlYXRtYXAvaW1hZ2UgdHJhY2VzIHVzZSByYXRpb3NbMF0gZm9yIGJvdGggZHggYW5kIGR5LlxuICAgIGNvbnN0IHJ4ID0gY2FjaGVkLnJhdGlvc1swXSB8fCAxO1xuICAgIGNvbnN0IHJ5ID0gY2FjaGVkLnJhdGlvc1swXSB8fCAxO1xuICAgIGNvbnN0IG94ID0gY2FjaGVkLm9yaWdpblggPz8gMDtcbiAgICBjb25zdCBveSA9IGNhY2hlZC5vcmlnaW5ZID8/IDA7XG4gICAgLy8gRHJvcCBhIHN0cm9rZSBidWlsdCBhdCBhIGRpZmZlcmVudCB2aWV3ICh6b29tL3Bhbik6IGl0cyBtYXRyaXggY29vcmRzIGFyZSB0aWVkIHRvIHRoZSBvbGRcbiAgICAvLyByYXRpby9vcmlnaW4sIGFuZCByZS1jb21taXR0aW5nIHdvdWxkIHJlc2NhbGUgdGhlIHJlZ2lvbiBieSB0aGUgem9vbSBmYWN0b3IgKGppdC11aSMxMDIpLlxuICAgIGNvbnN0IHNpZyA9IGAke3J4fSwke3J5fSwke294fSwke295fWA7XG4gICAgaWYgKHRoaXMuc3Ryb2tlICYmIHRoaXMuc3Ryb2tlUmF0aW9TaWcgIT09IHNpZykge1xuICAgICAgdGhpcy5zdHJva2UgPSBudWxsO1xuICAgICAgdGhpcy5zdHJva2VSZWdpb25JZCA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuc3Ryb2tlUmF0aW9TaWcgPSBzaWc7XG4gICAgY29uc3QgbWF0cml4WCA9IChkYXRhWCAtIG94KSAvIHJ4O1xuICAgIGNvbnN0IG1hdHJpeFkgPSAoZGF0YVkgLSBveSkgLyByeTtcbiAgICBpZiAobWF0cml4WCA8IDAgfHwgbWF0cml4WCA+PSBjYWNoZWQud2lkdGgpIHJldHVybjtcbiAgICBpZiAobWF0cml4WSA8IDAgfHwgbWF0cml4WSA+PSBjYWNoZWQuaGVpZ2h0KSByZXR1cm47XG5cbiAgICBjb25zdCBlcmFzZSA9IGUuc2hpZnRLZXk7XG4gICAgY29uc3QgcmFkaXVzID0gTWF0aC5tYXgoMC41LCB0aGlzLnNpemUgLyAyKTtcblxuICAgIC8vIFN0YXJ0IG9mIGEgZnJlc2ggZHJhZyB0aGF0IGlzbid0IGluc2lkZSB0aGUgY3VycmVudCBhY2N1bXVsYXRvcjogZHJvcCB0aGVcbiAgICAvLyBvbGQgc3Ryb2tlIHNvIGEgYnJhbmQtbmV3IHJlZ2lvbiBzdGFydHMgaGVyZSAobWlycm9ycyB0aGUgd2FuZCkuXG4gICAgaWYgKGlzU3RhcnQgJiYgIWVyYXNlICYmIHRoaXMuc3Ryb2tlICYmICF0aGlzLnBvaW50SW5TdHJva2UobWF0cml4WCwgbWF0cml4WSkpIHtcbiAgICAgIHRoaXMuc3Ryb2tlID0gbnVsbDtcbiAgICAgIHRoaXMuc3Ryb2tlUmVnaW9uSWQgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlJ3Mgbm8gYWN0aXZlIHJlZ2lvbiwgYWRvcHQgYW4gZXhpc3Rpbmcgc2hhcGUgdW5kZXIgdGhlIGN1cnNvciBzb1xuICAgIC8vIHRoZSBzdHJva2UgZXh0ZW5kcyAob3IgZXJhc2VzIGZyb20pIGl0IGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgcmVnaW9uLlxuICAgIGlmICghdGhpcy5zdHJva2UpIHtcbiAgICAgIHRoaXMudHJ5QWRvcHRTaGFwZUF0KHJlZ2lvbnMsIG1hdHJpeFgsIG1hdHJpeFksIHJ4LCByeSwgY2FjaGVkKTtcbiAgICB9XG5cbiAgICAvLyBFcmFzaW5nIHJlcXVpcmVzIGFuIGV4aXN0aW5nIHJlZ2lvbiDigJQgc2hpZnQgb24gZW1wdHkgc3BhY2UgaXMgYSBuby1vcC5cbiAgICBpZiAoZXJhc2UgJiYgIXRoaXMuc3Ryb2tlKSB7XG4gICAgICB0aGlzLmxhc3RNYXRyaXggPSB7IHg6IG1hdHJpeFgsIHk6IG1hdHJpeFkgfTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTdGFtcCB0aGUgZGlzYywgc3dlZXBpbmcgZnJvbSB0aGUgcHJldmlvdXMgcG9pbnQgZm9yIGEgY29udGludW91cyBzdHJva2UuXG4gICAgaWYgKGlzU3RhcnQgfHwgIXRoaXMubGFzdE1hdHJpeCkge1xuICAgICAgdGhpcy5zdGFtcERpc2MobWF0cml4WCwgbWF0cml4WSwgcmFkaXVzLCBlcmFzZSwgY2FjaGVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZHggPSBtYXRyaXhYIC0gdGhpcy5sYXN0TWF0cml4Lng7XG4gICAgICBjb25zdCBkeSA9IG1hdHJpeFkgLSB0aGlzLmxhc3RNYXRyaXgueTtcbiAgICAgIGNvbnN0IGRpc3QgPSBNYXRoLmh5cG90KGR4LCBkeSk7XG4gICAgICBjb25zdCBzdGVwID0gTWF0aC5tYXgoMSwgcmFkaXVzIC8gMik7XG4gICAgICBjb25zdCBuID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGRpc3QgLyBzdGVwKSk7XG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBuOyBpKyspIHtcbiAgICAgICAgY29uc3QgdCA9IGkgLyBuO1xuICAgICAgICB0aGlzLnN0YW1wRGlzYyh0aGlzLmxhc3RNYXRyaXgueCArIGR4ICogdCwgdGhpcy5sYXN0TWF0cml4LnkgKyBkeSAqIHQsIHJhZGl1cywgZXJhc2UsIGNhY2hlZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubGFzdE1hdHJpeCA9IHsgeDogbWF0cml4WCwgeTogbWF0cml4WSB9O1xuXG4gICAgaWYgKCF0aGlzLnN0cm9rZSkgcmV0dXJuO1xuXG4gICAgaWYgKCFlcmFzZSkge1xuICAgICAgLy8gR3Jvd2luZyBpbnRvIGFub3RoZXIgc2hhcGUgZm9sZHMgaXQgaW50byB0aGlzIHN0cm9rZSAobWVyZ2Utb24tdG91Y2gpLlxuICAgICAgdGhpcy5tZXJnZU92ZXJsYXBwaW5nU2hhcGVzKHJlZ2lvbnMsIHJ4LCByeSwgY2FjaGVkKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdHJva2UgPSB0aGlzLnN0cm9rZTtcbiAgICAvLyBUcmFjZSBldmVyeSBjb25uZWN0ZWQgcGllY2U6IGFuIGVyYXNlIHRoYXQgY3V0cyB0aHJvdWdoIHRoZSByZWdpb24gc3BsaXRzXG4gICAgLy8gaXQgaW50byB0d28sIGFuZCBib3RoIG11c3Qgc3Vydml2ZSAodGhlIGxhcmdlciBrZWVwcyB0aGUgcmVnaW9uIGlkZW50aXR5KS5cbiAgICBjb25zdCBwb2x5cyA9IHRoaXMud2FuZFNlcnZpY2UubWFza1RvUG9seWdvbnMoXG4gICAgICBzdHJva2UubWFzaywgc3Ryb2tlLmJ3LCBzdHJva2UuYmgsIGNhY2hlZC53aWR0aCwgY2FjaGVkLmhlaWdodCwgc3Ryb2tlLmJ4LCBzdHJva2UuYnksXG4gICAgKTtcbiAgICBpZiAocG9seXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBFcmFzZWQgdG8gbm90aGluZyDigJQgcmVtb3ZlIHRoZSBzaGFwZShzKSBlbnRpcmVseS5cbiAgICAgIGlmIChlcmFzZSkgdGhpcy5kcm9wQWN0aXZlU2hhcGUocmVnaW9ucyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29tcG9uZW50cyA9IHBvbHlzLm1hcCgocG9seSkgPT4gKHtcbiAgICAgIHhQbG90OiBwb2x5Lnhwb2ludHMubWFwKCh4KSA9PiBveCArIHggKiByeCksXG4gICAgICB5UGxvdDogcG9seS55cG9pbnRzLm1hcCgoeSkgPT4gb3kgKyB5ICogcnkpLFxuICAgICAgLy8gQ2FycnkgdHJhY2VkIGludGVyaW9yIHJpbmdzIChob2xlcykgYmFjayB0byBwbG90IGNvb3JkcyBzbyB0aGUgZG9udXRcbiAgICAgIC8vIHN1cnZpdmVzIHRoZSBjb21taXQgKGppdC11aSM4NSkuXG4gICAgICBob2xlczogcG9seS5ob2xlcz8ubWFwKChyaW5nKSA9PiByaW5nLm1hcCgoW3gsIHldKSA9PiBbb3ggKyB4ICogcngsIG95ICsgeSAqIHJ5XSkpLFxuICAgIH0pKTtcbiAgICB0aGlzLmNvbW1pdENvbXBvbmVudHMocmVnaW9ucywgY29tcG9uZW50cyk7XG4gIH1cblxuICAvKipcbiAgICogT1IgKGFkZCkgb3IgQU5ELU5PVCAoZXJhc2UpIGEgZmlsbGVkIGRpc2Mgb2YgYHJhZGl1c2AgbWF0cml4LXBpeGVscyBjZW50cmVkXG4gICAqIGF0IChjeCwgY3kpIGludG8gdGhlIGFjY3VtdWxhdG9yLCBncm93aW5nIGl0cyBiYm94IHRvIGZpdCB3aGVuIGFkZGluZy5cbiAgICovXG4gIHByaXZhdGUgc3RhbXBEaXNjKGN4OiBudW1iZXIsIGN5OiBudW1iZXIsIHJhZGl1czogbnVtYmVyLCBlcmFzZTogYm9vbGVhbiwgY2FjaGVkOiBDYWNoZWRJbWFnZURhdGEpIHtcbiAgICBjb25zdCBweDAgPSBNYXRoLmZsb29yKGN4IC0gcmFkaXVzKTtcbiAgICBjb25zdCBweTAgPSBNYXRoLmZsb29yKGN5IC0gcmFkaXVzKTtcbiAgICBjb25zdCBweDEgPSBNYXRoLmNlaWwoY3ggKyByYWRpdXMpICsgMTtcbiAgICBjb25zdCBweTEgPSBNYXRoLmNlaWwoY3kgKyByYWRpdXMpICsgMTtcblxuICAgIGlmICghZXJhc2UpIHtcbiAgICAgIGlmICghdGhpcy5lbnN1cmVTdHJva2VDb3ZlcnMocHgwLCBweTAsIHB4MSwgcHkxLCBjYWNoZWQpKSByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHMgPSB0aGlzLnN0cm9rZTtcbiAgICBpZiAoIXMpIHJldHVybjsgLy8gZXJhc2luZyB3aXRoIG5vIGFjdGl2ZSByZWdpb25cblxuICAgIGNvbnN0IHIyID0gcmFkaXVzICogcmFkaXVzO1xuICAgIGNvbnN0IGl5MCA9IE1hdGgubWF4KHMuYnksIHB5MCk7XG4gICAgY29uc3QgaXkxID0gTWF0aC5taW4ocy5ieSArIHMuYmgsIHB5MSk7XG4gICAgY29uc3QgaXgwID0gTWF0aC5tYXgocy5ieCwgcHgwKTtcbiAgICBjb25zdCBpeDEgPSBNYXRoLm1pbihzLmJ4ICsgcy5idywgcHgxKTtcbiAgICBmb3IgKGxldCBpeSA9IGl5MDsgaXkgPCBpeTE7IGl5KyspIHtcbiAgICAgIGNvbnN0IGR5ID0gaXkgKyAwLjUgLSBjeTtcbiAgICAgIGNvbnN0IHJvdyA9IChpeSAtIHMuYnkpICogcy5idztcbiAgICAgIGZvciAobGV0IGl4ID0gaXgwOyBpeCA8IGl4MTsgaXgrKykge1xuICAgICAgICBjb25zdCBkeCA9IGl4ICsgMC41IC0gY3g7XG4gICAgICAgIGlmIChkeCAqIGR4ICsgZHkgKiBkeSA+IHIyKSBjb250aW51ZTtcbiAgICAgICAgcy5tYXNrW3JvdyArIChpeCAtIHMuYngpXSA9IGVyYXNlID8gMCA6IDE7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZSB0aGUgYWNjdW11bGF0b3IncyBiYm94IGNvdmVycyBbcHgwLHB5MCxweDEscHkxKSAoY2xhbXBlZCB0byB0aGVcbiAgICogaW1hZ2UpLCBhbGxvY2F0aW5nL2NvcHlpbmcgYSBsYXJnZXIgbWFzayB3aGVuIGl0IG11c3QgZ3Jvdy4gUmV0dXJucyBmYWxzZSBpZlxuICAgKiB0aGUgcmVxdWVzdGVkIGJveCBpcyBlbXB0eSBhZnRlciBjbGFtcGluZy5cbiAgICovXG4gIHByaXZhdGUgZW5zdXJlU3Ryb2tlQ292ZXJzKFxuICAgIHB4MDogbnVtYmVyLCBweTA6IG51bWJlciwgcHgxOiBudW1iZXIsIHB5MTogbnVtYmVyLCBjYWNoZWQ6IENhY2hlZEltYWdlRGF0YSxcbiAgKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYnggPSBNYXRoLm1heCgwLCBweDApO1xuICAgIGNvbnN0IGJ5ID0gTWF0aC5tYXgoMCwgcHkwKTtcbiAgICBjb25zdCBieDEgPSBNYXRoLm1pbihjYWNoZWQud2lkdGgsIHB4MSk7XG4gICAgY29uc3QgYnkxID0gTWF0aC5taW4oY2FjaGVkLmhlaWdodCwgcHkxKTtcbiAgICBjb25zdCBidyA9IGJ4MSAtIGJ4O1xuICAgIGNvbnN0IGJoID0gYnkxIC0gYnk7XG4gICAgaWYgKGJ3IDw9IDAgfHwgYmggPD0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKCF0aGlzLnN0cm9rZSkge1xuICAgICAgdGhpcy5zdHJva2UgPSB7IGJ4LCBieSwgYncsIGJoLCBtYXNrOiBuZXcgVWludDhBcnJheShidyAqIGJoKSB9O1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHMgPSB0aGlzLnN0cm9rZTtcbiAgICBjb25zdCBuYnggPSBNYXRoLm1pbihzLmJ4LCBieCk7XG4gICAgY29uc3QgbmJ5ID0gTWF0aC5taW4ocy5ieSwgYnkpO1xuICAgIGNvbnN0IG5ieDEgPSBNYXRoLm1heChzLmJ4ICsgcy5idywgYngxKTtcbiAgICBjb25zdCBuYnkxID0gTWF0aC5tYXgocy5ieSArIHMuYmgsIGJ5MSk7XG4gICAgY29uc3QgbmJ3ID0gbmJ4MSAtIG5ieDtcbiAgICBjb25zdCBuYmggPSBuYnkxIC0gbmJ5O1xuICAgIGlmIChuYncgPT09IHMuYncgJiYgbmJoID09PSBzLmJoICYmIG5ieCA9PT0gcy5ieCAmJiBuYnkgPT09IHMuYnkpIHJldHVybiB0cnVlO1xuXG4gICAgY29uc3QgbmV4dCA9IG5ldyBVaW50OEFycmF5KG5idyAqIG5iaCk7XG4gICAgY29uc3QgZHggPSBzLmJ4IC0gbmJ4O1xuICAgIGNvbnN0IGR5ID0gcy5ieSAtIG5ieTtcbiAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBzLmJoOyByb3crKykge1xuICAgICAgY29uc3Qgc3JjT2ZmID0gcm93ICogcy5idztcbiAgICAgIGNvbnN0IGRzdE9mZiA9IChyb3cgKyBkeSkgKiBuYncgKyBkeDtcbiAgICAgIG5leHQuc2V0KHMubWFzay5zdWJhcnJheShzcmNPZmYsIHNyY09mZiArIHMuYncpLCBkc3RPZmYpO1xuICAgIH1cbiAgICB0aGlzLnN0cm9rZSA9IHsgYng6IG5ieCwgYnk6IG5ieSwgYnc6IG5idywgYmg6IG5iaCwgbWFzazogbmV4dCB9O1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIFRydWUgaWYgKG1hdHJpeFgsIG1hdHJpeFkpIGxpZXMgaW5zaWRlIHRoZSBjdXJyZW50IHN0cm9rZSBhY2N1bXVsYXRvci4gKi9cbiAgcHJpdmF0ZSBwb2ludEluU3Ryb2tlKG1hdHJpeFg6IG51bWJlciwgbWF0cml4WTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcyA9IHRoaXMuc3Ryb2tlO1xuICAgIGlmICghcykgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IG14ID0gTWF0aC5mbG9vcihtYXRyaXhYKSAtIHMuYng7XG4gICAgY29uc3QgbXkgPSBNYXRoLmZsb29yKG1hdHJpeFkpIC0gcy5ieTtcbiAgICBpZiAobXggPCAwIHx8IG15IDwgMCB8fCBteCA+PSBzLmJ3IHx8IG15ID49IHMuYmgpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gcy5tYXNrW215ICogcy5idyArIG14XSA9PT0gMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhlIHJlZ2lvbihzKSByZWZlcmVuY2VkIGJ5IHRoZSBzdHJva2UgYW5kIHJlc2V0IGl0IOKAlCB1c2VkIHdoZW4gYW5cbiAgICogZXJhc2Ugc3Ryb2tlIGRlbGV0ZXMgZXZlcnkgcGl4ZWwuXG4gICAqL1xuICBwcml2YXRlIGRyb3BBY3RpdmVTaGFwZShyZWdpb25zOiBSZWdpb25bXSkge1xuICAgIGNvbnN0IGlkcyA9IFt0aGlzLnN0cm9rZVJlZ2lvbklkLCAuLi50aGlzLnN0cm9rZUV4dHJhSWRzXS5maWx0ZXIoKGlkKTogaWQgaXMgbnVtYmVyID0+IGlkICE9IG51bGwpO1xuICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAgIGNvbnN0IGlkeCA9IHJlZ2lvbnMuZmluZEluZGV4KChyKSA9PiByLmlkID09PSBpZCk7XG4gICAgICBpZiAoaWR4ID49IDApIHsgcmVnaW9ucy5zcGxpY2UoaWR4LCAxKTsgY2hhbmdlZCA9IHRydWU7IH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZWQpIHRoaXMuaG9zdC5zZXRSZWdpb25zKHJlZ2lvbnMpO1xuICAgIHRoaXMuc3Ryb2tlID0gbnVsbDtcbiAgICB0aGlzLnN0cm9rZVJlZ2lvbklkID0gbnVsbDtcbiAgICB0aGlzLnN0cm9rZUV4dHJhSWRzID0gW107XG4gIH1cblxuICAvKiogQSByZWdpb24ncyBjbG9zZWQtcG9seWdvbiB2ZXJ0aWNlcyAoaW1hZ2UvZGF0YSBjb29yZHMpLCBvciBudWxsIHdoZW4gaXRcbiAgICogIGlzbid0IGEgZmlsbGFibGUgY2xvc2VkIHBvbHlnb24gKHJlY3RhbmdsZXMsIG9wZW4gcG9seWxpbmVzKS4gKi9cbiAgcHJpdmF0ZSByZWdpb25WZXJ0cyhcbiAgICByZWdpb246IFJlZ2lvbixcbiAgKTogeyB4cG9pbnRzOiBudW1iZXJbXTsgeXBvaW50czogbnVtYmVyW107IGhvbGVzPzogbnVtYmVyW11bXVtdIH0gfCBudWxsIHtcbiAgICBjb25zdCBiID0gcmVnaW9uPy5ib3VuZHM7XG4gICAgaWYgKGIgaW5zdGFuY2VvZiBQb2x5Z29uICYmIGIuY2xvc2VkICE9PSBmYWxzZSAmJiBiLnhwb2ludHMubGVuZ3RoID49IDMpIHtcbiAgICAgIHJldHVybiB7IHhwb2ludHM6IGIueHBvaW50cywgeXBvaW50czogYi55cG9pbnRzLCBob2xlczogYi5ob2xlcyB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIGEgcmVnaW9uIGNhbiBiZSBmYWl0aGZ1bGx5IHJhc3Rlcml6ZWQgYXQgdGhpcyB6b29tIChyeC9yeSA9IGRhdGEgdW5pdHMgcGVyIG1hdHJpeCBweCkuXG4gICAqICBFZGl0aW5nIHJhc3Rlcml6ZXMgKyByZS10cmFjZXMgdGhlIHJlZ2lvbiwgc28gb25lIHdob3NlIG1hdHJpeC1zcGFjZSBiYm94IGV4Y2VlZHMgdGhlXG4gICAqICByYXN0ZXJpemVyIGNhcCB3b3VsZCBjb21lIGJhY2sgcmVzY2FsZWQvY29ycnVwdGVkIChlLmcuIGEgd2hvbGUtc2xpZGUgYW5ub3RhdGlvbiB3aGlsZSB6b29tZWRcbiAgICogIG91dCkg4oCUIHNraXAgYWRvcHQvbWVyZ2UgZm9yIHRob3NlIGFuZCBvbmx5IGVkaXQgdGhlbSBuZWFyIG5hdGl2ZSB6b29tIChqaXQtdWkjMTAyKS4gKi9cbiAgcHJpdmF0ZSBmaXRzRm9yRWRpdCh2ZXJ0czogeyB4cG9pbnRzOiBudW1iZXJbXTsgeXBvaW50czogbnVtYmVyW10gfSwgcng6IG51bWJlciwgcnk6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHhzID0gdmVydHMueHBvaW50cztcbiAgICBjb25zdCB5cyA9IHZlcnRzLnlwb2ludHM7XG4gICAgbGV0IG1pblggPSBJbmZpbml0eSwgbWF4WCA9IC1JbmZpbml0eSwgbWluWSA9IEluZmluaXR5LCBtYXhZID0gLUluZmluaXR5O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh4c1tpXSA8IG1pblgpIG1pblggPSB4c1tpXTtcbiAgICAgIGlmICh4c1tpXSA+IG1heFgpIG1heFggPSB4c1tpXTtcbiAgICAgIGlmICh5c1tpXSA8IG1pblkpIG1pblkgPSB5c1tpXTtcbiAgICAgIGlmICh5c1tpXSA+IG1heFkpIG1heFkgPSB5c1tpXTtcbiAgICB9XG4gICAgY29uc3QgdyA9IChtYXhYIC0gbWluWCkgLyAocnggfHwgMSk7XG4gICAgY29uc3QgaCA9IChtYXhZIC0gbWluWSkgLyAocnkgfHwgMSk7XG4gICAgcmV0dXJuIHcgPiAwICYmIGggPiAwICYmIHcgKiBoIDw9IDQwOTYgKiA0MDk2O1xuICB9XG5cbiAgLyoqIENvbnZlcnQgYSByZWdpb24ncyBob2xlIHJpbmdzIGZyb20gaW1hZ2UvZGF0YSBjb29yZHMgaW50byBtYXRyaXggY29vcmRzIHNvXG4gICAqICB0aGV5IGxpbmUgdXAgd2l0aCB0aGUgc3Ryb2tlIGFjY3VtdWxhdG9yIChqaXQtdWkjODUpLiAqL1xuICBwcml2YXRlIGhvbGVzVG9NYXRyaXgoXG4gICAgaG9sZXM6IG51bWJlcltdW11bXSB8IHVuZGVmaW5lZCwgb3g6IG51bWJlciwgb3k6IG51bWJlciwgcng6IG51bWJlciwgcnk6IG51bWJlcixcbiAgKTogbnVtYmVyW11bXVtdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gaG9sZXM/Lm1hcCgocmluZykgPT4gcmluZy5tYXAoKFt4LCB5XSkgPT4gWyh4IC0gb3gpIC8gcngsICh5IC0gb3kpIC8gcnldKSk7XG4gIH1cblxuICAvKipcbiAgICogSWYgKG1hdHJpeFgsIG1hdHJpeFkpIGZhbGxzIGluc2lkZSBhbiBleGlzdGluZyByZWdpb24sIHJhc3Rlcml6ZSBpdCBpbnRvIHRoZVxuICAgKiBzdHJva2UgYWNjdW11bGF0b3Igc28gc3Vic2VxdWVudCBicnVzaCBpbnB1dCBleHRlbmRzIGl0IHJhdGhlciB0aGFuIHN0YXJ0aW5nXG4gICAqIGEgbmV3IHJlZ2lvbi5cbiAgICovXG4gIHByaXZhdGUgdHJ5QWRvcHRTaGFwZUF0KFxuICAgIHJlZ2lvbnM6IFJlZ2lvbltdLFxuICAgIG1hdHJpeFg6IG51bWJlcixcbiAgICBtYXRyaXhZOiBudW1iZXIsXG4gICAgcng6IG51bWJlcixcbiAgICByeTogbnVtYmVyLFxuICAgIGNhY2hlZDogQ2FjaGVkSW1hZ2VEYXRhLFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIXJlZ2lvbnMgfHwgcmVnaW9ucy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICAvLyBNb3N0LXJlY2VudGx5LWFkZGVkIHJlZ2lvbnMgYXJlIG9uIHRvcCDigJQgY2hlY2sgdGhlbSBmaXJzdC5cbiAgICBmb3IgKGxldCBpID0gcmVnaW9ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgdmVydHMgPSB0aGlzLnJlZ2lvblZlcnRzKHJlZ2lvbnNbaV0pO1xuICAgICAgaWYgKCF2ZXJ0cykgY29udGludWU7XG4gICAgICBpZiAoIXRoaXMuZml0c0ZvckVkaXQodmVydHMsIHJ4LCByeSkpIGNvbnRpbnVlOyAvLyB0b28gbGFyZ2UgYXQgdGhpcyB6b29tIOKGkiBkb24ndCBhZG9wdFxuXG4gICAgICBjb25zdCBveCA9IGNhY2hlZC5vcmlnaW5YID8/IDA7XG4gICAgICBjb25zdCBveSA9IGNhY2hlZC5vcmlnaW5ZID8/IDA7XG4gICAgICBjb25zdCB4cyA9IHZlcnRzLnhwb2ludHMubWFwKCh4KSA9PiAoeCAtIG94KSAvIHJ4KTtcbiAgICAgIGNvbnN0IHlzID0gdmVydHMueXBvaW50cy5tYXAoKHkpID0+ICh5IC0gb3kpIC8gcnkpO1xuICAgICAgY29uc3QgaG9sZXMgPSB0aGlzLmhvbGVzVG9NYXRyaXgodmVydHMuaG9sZXMsIG94LCBveSwgcngsIHJ5KTtcblxuICAgICAgLy8gQ2xpY2tpbmcgaW5zaWRlIGEgaG9sZSBtdXN0IE5PVCBhZG9wdCB0aGUgZG9udXQgKGl0J3MgZW1wdHkgdGhlcmUpLlxuICAgICAgaWYgKCF0aGlzLndhbmRTZXJ2aWNlLnBvaW50SW5Qb2x5Z29uV2l0aEhvbGVzKG1hdHJpeFgsIG1hdHJpeFksIHhzLCB5cywgaG9sZXMpKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgcmFzdGVyID0gdGhpcy53YW5kU2VydmljZS5yYXN0ZXJpemVQb2x5Z29uKHhzLCB5cywgY2FjaGVkLndpZHRoLCBjYWNoZWQuaGVpZ2h0LCBob2xlcyk7XG4gICAgICBpZiAoIXJhc3RlcikgY29udGludWU7XG5cbiAgICAgIHRoaXMuc3Ryb2tlID0gcmFzdGVyO1xuICAgICAgdGhpcy5zdHJva2VSZWdpb25JZCA9IHJlZ2lvbnNbaV0uaWQgPz8gbnVsbDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogRm9sZCBldmVyeSByZWdpb24gd2hvc2UgcmFzdGVyaXplZCBtYXNrIG92ZXJsYXBzIHRoZSBzdHJva2UgbWFzayBpbnRvIHRoZVxuICAgKiBzdHJva2UgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0LCBzbyBicnVzaGluZyBhY3Jvc3MgcmVnaW9ucyBtZXJnZXMgdGhlbS5cbiAgICovXG4gIHByaXZhdGUgbWVyZ2VPdmVybGFwcGluZ1NoYXBlcyhyZWdpb25zOiBSZWdpb25bXSwgcng6IG51bWJlciwgcnk6IG51bWJlciwgY2FjaGVkOiBDYWNoZWRJbWFnZURhdGEpIHtcbiAgICBpZiAoIXRoaXMuc3Ryb2tlKSByZXR1cm47XG4gICAgbGV0IGRpZE1lcmdlID0gdHJ1ZTtcbiAgICB3aGlsZSAoZGlkTWVyZ2UpIHtcbiAgICAgIGRpZE1lcmdlID0gZmFsc2U7XG4gICAgICBmb3IgKGxldCBpID0gcmVnaW9ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBjb25zdCByZWdpb24gPSByZWdpb25zW2ldO1xuICAgICAgICBpZiAocmVnaW9uLmlkICE9IG51bGwgJiYgcmVnaW9uLmlkID09PSB0aGlzLnN0cm9rZVJlZ2lvbklkKSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCB2ZXJ0cyA9IHRoaXMucmVnaW9uVmVydHMocmVnaW9uKTtcbiAgICAgICAgaWYgKCF2ZXJ0cykgY29udGludWU7XG4gICAgICAgIGlmICghdGhpcy5maXRzRm9yRWRpdCh2ZXJ0cywgcngsIHJ5KSkgY29udGludWU7IC8vIHRvbyBsYXJnZSBhdCB0aGlzIHpvb20g4oaSIGRvbid0IG1lcmdlXG5cbiAgICAgICAgY29uc3Qgb3ggPSBjYWNoZWQub3JpZ2luWCA/PyAwO1xuICAgICAgICBjb25zdCBveSA9IGNhY2hlZC5vcmlnaW5ZID8/IDA7XG4gICAgICAgIGNvbnN0IHhzID0gdmVydHMueHBvaW50cy5tYXAoKHgpID0+ICh4IC0gb3gpIC8gcngpO1xuICAgICAgICBjb25zdCB5cyA9IHZlcnRzLnlwb2ludHMubWFwKCh5KSA9PiAoeSAtIG95KSAvIHJ5KTtcblxuICAgICAgICAvLyBRdWljayBiYm94IHJlamVjdCBiZWZvcmUgcmFzdGVyaXppbmcuXG4gICAgICAgIGxldCBtaW5YID0gSW5maW5pdHksIG1heFggPSAtSW5maW5pdHksIG1pblkgPSBJbmZpbml0eSwgbWF4WSA9IC1JbmZpbml0eTtcbiAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCB4cy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgIGlmICh4c1trXSA8IG1pblgpIG1pblggPSB4c1trXTtcbiAgICAgICAgICBpZiAoeHNba10gPiBtYXhYKSBtYXhYID0geHNba107XG4gICAgICAgICAgaWYgKHlzW2tdIDwgbWluWSkgbWluWSA9IHlzW2tdO1xuICAgICAgICAgIGlmICh5c1trXSA+IG1heFkpIG1heFkgPSB5c1trXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB3eDAgPSB0aGlzLnN0cm9rZS5ieCwgd3kwID0gdGhpcy5zdHJva2UuYnk7XG4gICAgICAgIGNvbnN0IHd4MSA9IHd4MCArIHRoaXMuc3Ryb2tlLmJ3LCB3eTEgPSB3eTAgKyB0aGlzLnN0cm9rZS5iaDtcbiAgICAgICAgaWYgKG1heFggPCB3eDAgfHwgbWluWCA+IHd4MSB8fCBtYXhZIDwgd3kwIHx8IG1pblkgPiB3eTEpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IGhvbGVzID0gdGhpcy5ob2xlc1RvTWF0cml4KHZlcnRzLmhvbGVzLCBveCwgb3ksIHJ4LCByeSk7XG4gICAgICAgIGNvbnN0IHJhc3RlciA9IHRoaXMud2FuZFNlcnZpY2UucmFzdGVyaXplUG9seWdvbih4cywgeXMsIGNhY2hlZC53aWR0aCwgY2FjaGVkLmhlaWdodCwgaG9sZXMpO1xuICAgICAgICBpZiAoIXJhc3RlcikgY29udGludWU7XG4gICAgICAgIGlmICghbWFza3NPdmVybGFwKHRoaXMuc3Ryb2tlLCByYXN0ZXIpKSBjb250aW51ZTtcblxuICAgICAgICB0aGlzLnN0cm9rZSA9IHVuaW9uTWFza3ModGhpcy5zdHJva2UsIHJhc3Rlcik7XG4gICAgICAgIGlmICh0aGlzLnN0cm9rZVJlZ2lvbklkID09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLnN0cm9rZVJlZ2lvbklkID0gcmVnaW9uLmlkID8/IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmVnaW9ucy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIGRpZE1lcmdlID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbW1pdCB0aGUgc3Ryb2tlJ3MgY29ubmVjdGVkIHBpZWNlcyBhcyByZWdpb25zIOKAlCB0aGUgbGFyZ2VzdCBrZWVwcyB0aGVcbiAgICogc3Ryb2tlJ3MgcmVnaW9uIGlkZW50aXR5LCBhZGRpdGlvbmFsIHBpZWNlcyAoZnJvbSBhbiBlcmFzZSB0aGF0IHNwbGl0IHRoZVxuICAgKiByZWdpb24pIGJlY29tZSB0aGVpciBvd24gcmVnaW9ucyB0cmFja2VkIGluIGBzdHJva2VFeHRyYUlkc2Agc28gdGhleSBrZWVwXG4gICAqIHN0YWJsZSBpZGVudGl0aWVzIGFjcm9zcyBkcmFnIHRpY2tzLiBUaGUgc3RvcmUgbWludHMgaWRzIG9uIGNvbW1pdCwgd2hpY2hcbiAgICogd2UgcmVhZCBiYWNrIHNvIHN1YnNlcXVlbnQgdGlja3MgcmVwbGFjZSB0aGUgc2FtZSByZWdpb25zLlxuICAgKi9cbiAgcHJpdmF0ZSBjb21taXRDb21wb25lbnRzKFxuICAgIHJlZ2lvbnM6IFJlZ2lvbltdLFxuICAgIGNvbXBvbmVudHM6IHsgeFBsb3Q6IG51bWJlcltdOyB5UGxvdDogbnVtYmVyW107IGhvbGVzPzogbnVtYmVyW11bXVtdIH1bXSxcbiAgKSB7XG4gICAgY29uc3QgdmFsaWQgPSBjb21wb25lbnRzLmZpbHRlcigoYykgPT4gYy54UGxvdC5sZW5ndGggPj0gMyk7XG4gICAgaWYgKHZhbGlkLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcHJldkV4dHJhSWRzID0gdGhpcy5zdHJva2VFeHRyYUlkcztcbiAgICAvLyBEcm9wIHByZXZpb3VzbHktdHJhY2tlZCBleHRyYXMgdGhhdCBubyBsb25nZXIgaGF2ZSBhIG1hdGNoaW5nIHBpZWNlICh0aGVcbiAgICAvLyBjb21wb25lbnQgY291bnQgc2hyYW5rLCBlLmcuIGFuIGFkZCBzdHJva2UgYnJpZGdlZCBhIGdhcCkuXG4gICAgY29uc3QgcmV1c2VDb3VudCA9IE1hdGgubWF4KDAsIHZhbGlkLmxlbmd0aCAtIDEpO1xuICAgIGZvciAobGV0IGsgPSByZXVzZUNvdW50OyBrIDwgcHJldkV4dHJhSWRzLmxlbmd0aDsgaysrKSB7XG4gICAgICBjb25zdCBpZHggPSByZWdpb25zLmZpbmRJbmRleCgocikgPT4gci5pZCA9PT0gcHJldkV4dHJhSWRzW2tdKTtcbiAgICAgIGlmIChpZHggPj0gMCkgcmVnaW9ucy5zcGxpY2UoaWR4LCAxKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcmltYXJ5ID0gdGhpcy51cHNlcnRDb21wb25lbnQocmVnaW9ucywgdGhpcy5zdHJva2VSZWdpb25JZCwgdmFsaWRbMF0pO1xuICAgIGNvbnN0IGV4dHJhczogUmVnaW9uW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHZhbGlkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBleHRyYXMucHVzaCh0aGlzLnVwc2VydENvbXBvbmVudChyZWdpb25zLCBwcmV2RXh0cmFJZHNbaSAtIDFdID8/IG51bGwsIHZhbGlkW2ldKSk7XG4gICAgfVxuXG4gICAgdGhpcy5ob3N0LnNldFJlZ2lvbnMocmVnaW9ucyk7XG4gICAgLy8gSWRzIGFyZSBtaW50ZWQgZHVyaW5nIHNldFJlZ2lvbnMg4oCUIHJlYWQgdGhlbSBiYWNrIGZvciB0aGUgbmV4dCB0aWNrLlxuICAgIHRoaXMuc3Ryb2tlUmVnaW9uSWQgPSBwcmltYXJ5LmlkID8/IHRoaXMuc3Ryb2tlUmVnaW9uSWQ7XG4gICAgdGhpcy5zdHJva2VFeHRyYUlkcyA9IGV4dHJhc1xuICAgICAgLm1hcCgocikgPT4gci5pZClcbiAgICAgIC5maWx0ZXIoKGlkKTogaWQgaXMgbnVtYmVyID0+IGlkICE9IG51bGwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgUmVnaW9uIGZvciBvbmUgY29tcG9uZW50IGFuZCBpbnNlcnQgaXQgaW50byBgcmVnaW9uc2A6IHJlcGxhY2UgdGhlXG4gICAqIHJlZ2lvbiB3aXRoIGBpZGAgaW4gcGxhY2UgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgYXBwZW5kIGEgbmV3IG9uZS4gUmV0dXJuc1xuICAgKiB0aGUgUmVnaW9uIGluc3RhbmNlIChpdHMgaWQgaXMgbWludGVkIGxhdGVyIGJ5IHRoZSBzdG9yZSB3aGVuIG5ldykuXG4gICAqL1xuICBwcml2YXRlIHVwc2VydENvbXBvbmVudChcbiAgICByZWdpb25zOiBSZWdpb25bXSwgaWQ6IG51bWJlciB8IG51bGwsXG4gICAgYzogeyB4UGxvdDogbnVtYmVyW107IHlQbG90OiBudW1iZXJbXTsgaG9sZXM/OiBudW1iZXJbXVtdW10gfSxcbiAgKTogUmVnaW9uIHtcbiAgICBjb25zdCBleGlzdGluZyA9IGlkICE9IG51bGwgPyByZWdpb25zLmZpbmQoKHIpID0+IHIuaWQgPT09IGlkKSA6IG51bGw7XG5cbiAgICBjb25zdCBwb2x5ID0gbmV3IFBvbHlnb24oKTtcbiAgICBwb2x5Lm5wb2ludHMgPSBjLnhQbG90Lmxlbmd0aDtcbiAgICBwb2x5Lnhwb2ludHMgPSBjLnhQbG90O1xuICAgIHBvbHkueXBvaW50cyA9IGMueVBsb3Q7XG4gICAgcG9seS5jb29yZGluYXRlcyA9IGMueFBsb3QubWFwKCh4LCBpKSA9PiBbeCwgYy55UGxvdFtpXV0pO1xuICAgIHBvbHkuY2xvc2VkID0gdHJ1ZTtcbiAgICBpZiAoYy5ob2xlcyAmJiBjLmhvbGVzLmxlbmd0aCkgcG9seS5ob2xlcyA9IGMuaG9sZXM7XG5cbiAgICBjb25zdCByZWdpb24gPSBuZXcgUmVnaW9uKCk7XG4gICAgcmVnaW9uLmJvdW5kcyA9IHBvbHk7XG4gICAgcmVnaW9uLmNvbG9yID0gdGhpcy5ob3N0LmdldFNoYXBlQ29sb3IoKTtcbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIHJlZ2lvbi5pZCA9IGV4aXN0aW5nLmlkO1xuICAgICAgcmVnaW9uLm5hbWUgPSBleGlzdGluZy5uYW1lO1xuICAgIH1cbiAgICAvLyBEZWZhdWx0IGNsYXNzL2Fubm90YXRpb24gbmFtZSwgbWF0Y2hpbmcgdGhlIG92ZXJsYXktZHJhd24gcmVnaW9ucyBhbmQgdGhlXG4gICAgLy8gd2FuZCBzbyBhIGJydXNoIHJlZ2lvbiBpc24ndCBsZWZ0IHVubGFiZWxlZC5cbiAgICByZWdpb24ubGFiZWwgPSBleGlzdGluZz8ubGFiZWwgPz8gJ1JlZ2lvbic7XG5cbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIGNvbnN0IGlkeCA9IHJlZ2lvbnMuZmluZEluZGV4KChyKSA9PiByLmlkID09PSBpZCk7XG4gICAgICBpZiAoaWR4ID49IDApIHJlZ2lvbnNbaWR4XSA9IHJlZ2lvbjtcbiAgICAgIGVsc2UgcmVnaW9ucy5wdXNoKHJlZ2lvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlZ2lvbnMucHVzaChyZWdpb24pO1xuICAgIH1cbiAgICByZXR1cm4gcmVnaW9uO1xuICB9XG59XG4iXX0=
|
|
587
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJ1c2gtdG9vbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90b29sYmFyL2JydXNoL2JydXNoLXRvb2wuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVuRCxPQUFPLEVBQVksWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzNFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7OztBQWdCdEQsa0VBQWtFO0FBQ2xFLE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxDQUFDO0FBVzlCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUVILE1BQU0sT0FBTyxnQkFBZ0I7SUFpQzNCLFlBQW9CLFdBQXdCO1FBQXhCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBL0JwQyxZQUFPLEdBQTZCLElBQUksQ0FBQztRQUN6QyxXQUFNLEdBQUcsS0FBSyxDQUFDO1FBRXZCOzs7O1dBSUc7UUFDSyxXQUFNLEdBQW9CLElBQUksQ0FBQztRQUN2QztxRkFDNkU7UUFDckUsbUJBQWMsR0FBa0IsSUFBSSxDQUFDO1FBQzdDOzZFQUNxRTtRQUM3RCxtQkFBYyxHQUFrQixJQUFJLENBQUM7UUFDN0M7OzJFQUVtRTtRQUMzRCxtQkFBYyxHQUFhLEVBQUUsQ0FBQztRQUN0Qzs2RUFDcUU7UUFDN0QsZUFBVSxHQUFvQyxJQUFJLENBQUM7UUFDbkQsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixTQUFJLEdBQUcsa0JBQWtCLENBQUM7UUFDbEMsMEZBQTBGO1FBQ2xGLGVBQVUsR0FBOEMsSUFBSSxDQUFDO1FBT25FLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCw2RUFBNkU7SUFDN0UsUUFBUSxDQUFDLElBQW1CO1FBQzFCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFFRCx1RUFBdUU7SUFFdkUsK0JBQStCO0lBQy9CLE9BQU8sQ0FBQyxNQUFlLEVBQUUsVUFBd0IsRUFBRTtRQUNqRCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixpRkFBaUY7UUFDakYscUVBQXFFO1FBQ3JFLElBQUksT0FBTyxDQUFDLElBQUksSUFBSSxJQUFJO1lBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckQsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLHVFQUF1RTtZQUN2RSxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUNwRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDdkIsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDekIsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILFVBQVUsQ0FBQyxVQUF3QixFQUFFO1FBQ25DLElBQUksT0FBTyxDQUFDLElBQUksSUFBSSxJQUFJO1lBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDO1lBQUUsT0FBTztRQUMzRCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsS0FBSyxJQUFJLElBQUksSUFBSSxPQUFPLENBQUMsS0FBSyxJQUFJLElBQUk7WUFDekQsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUU7WUFDaEQsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNULElBQUksSUFBSSxFQUFFLEtBQUssS0FBSyxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssSUFBSSxJQUFJLEVBQUUsS0FBSyxLQUFLLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDckYsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JCLENBQUM7UUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztJQUN6QixDQUFDO0lBRUQsMERBQTBEO0lBQzFELE9BQU8sQ0FBQyxJQUFZO1FBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDO1lBQUUsT0FBTztRQUNoRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLGlCQUFpQjtRQUNmLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsdUVBQXVFO0lBRS9ELGFBQWE7UUFDbkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQy9DLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPO1FBRXBDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEQsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO1FBQ25DLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUN2QixNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7UUFDeEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO1FBQzVCLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUM3QixNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUM7UUFDbEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQzVCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztRQUNsQyxNQUFNLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7UUFFcEMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUV0QixNQUFNLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMxRCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMxRCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN0RCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRU8sY0FBYztRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPO1FBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRU8sV0FBVyxDQUFDLENBQWE7UUFDL0IsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPO1FBQzNCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLENBQUMsMkNBQTJDO1FBQ25FLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFTyxXQUFXLENBQUMsQ0FBYTtRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBQzNCLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQ3RCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVPLFNBQVMsQ0FBQyxDQUFhO1FBQzdCLDBFQUEwRTtRQUMxRSx3RUFBd0U7UUFDeEUsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7SUFDekIsQ0FBQztJQUVPLFdBQVc7UUFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDM0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDeEIsQ0FBQztJQUVELHVFQUF1RTtJQUV2RTs7OztPQUlHO0lBQ0ssYUFBYSxDQUFDLENBQWEsRUFBRSxPQUFnQjtRQUNuRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPO1FBQzFCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUM5QyxJQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPO1FBRWxELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFdkMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ3JELElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFO1lBQUUsT0FBTztRQUNqQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTztRQUUvRCx5REFBeUQ7UUFDekQsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUM7UUFDL0IsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUM7UUFDL0IsNEZBQTRGO1FBQzVGLDRGQUE0RjtRQUM1RixNQUFNLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQ3RDLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQ25CLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzdCLENBQUM7UUFDRCxJQUFJLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQztRQUMxQixNQUFNLE9BQU8sR0FBRyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDbEMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2xDLElBQUksT0FBTyxHQUFHLENBQUMsSUFBSSxPQUFPLElBQUksTUFBTSxDQUFDLEtBQUs7WUFBRSxPQUFPO1FBQ25ELElBQUksT0FBTyxHQUFHLENBQUMsSUFBSSxPQUFPLElBQUksTUFBTSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBRXBELE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUM7UUFDekIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztRQUU1Qyw0RUFBNEU7UUFDNUUsbUVBQW1FO1FBQ25FLElBQUksT0FBTyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzlFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQ25CLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzdCLENBQUM7UUFFRCwyRUFBMkU7UUFDM0UsMkVBQTJFO1FBQzNFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2xFLENBQUM7UUFFRCx5RUFBeUU7UUFDekUsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDO1lBQzdDLE9BQU87UUFDVCxDQUFDO1FBRUQsNEVBQTRFO1FBQzVFLElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzFELENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxFQUFFLEdBQUcsT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sRUFBRSxHQUFHLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUN2QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNoQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDckMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUM5QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzVCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2hCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDaEcsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFFN0MsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUV6QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCx5RUFBeUU7WUFDekUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzNCLDRFQUE0RTtRQUM1RSw2RUFBNkU7UUFDN0UsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQzNDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQ3JGLENBQUM7UUFDRixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdkIsb0RBQW9EO1lBQ3BELElBQUksS0FBSztnQkFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3pDLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN0QyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQzNDLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDM0MsdUVBQXVFO1lBQ3ZFLG1DQUFtQztZQUNuQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDbkYsQ0FBQyxDQUFDLENBQUM7UUFDSixJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7O09BR0c7SUFDSyxTQUFTLENBQUMsRUFBVSxFQUFFLEVBQVUsRUFBRSxNQUFjLEVBQUUsS0FBYyxFQUFFLE1BQXVCO1FBQy9GLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFdkMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDO2dCQUFFLE9BQU87UUFDbkUsQ0FBQztRQUNELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDdEIsSUFBSSxDQUFDLENBQUM7WUFBRSxPQUFPLENBQUMsZ0NBQWdDO1FBRWhELE1BQU0sRUFBRSxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDM0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2hDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNoQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN2QyxLQUFLLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFDbEMsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDekIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDL0IsS0FBSyxJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO2dCQUNsQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtvQkFBRSxTQUFTO2dCQUNyQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxrQkFBa0IsQ0FDeEIsR0FBVyxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFFLE1BQXVCO1FBRTNFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDekMsTUFBTSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNwQixNQUFNLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRXJDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxVQUFVLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDaEUsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN0QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDL0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUM7UUFDdkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQztRQUN2QixJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRTlFLE1BQU0sSUFBSSxHQUFHLElBQUksVUFBVSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUN2QyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztRQUN0QixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztRQUN0QixLQUFLLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzFCLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ2pFLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELDZFQUE2RTtJQUNyRSxhQUFhLENBQUMsT0FBZSxFQUFFLE9BQWU7UUFDcEQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN0QixJQUFJLENBQUMsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3JCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN0QyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdEMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDL0QsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssZUFBZSxDQUFDLE9BQWlCO1FBQ3ZDLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQWdCLEVBQUUsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLENBQUM7UUFDbkcsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLEtBQUssTUFBTSxFQUFFLElBQUksR0FBRyxFQUFFLENBQUM7WUFDckIsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUNsRCxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQUMsQ0FBQztRQUMzRCxDQUFDO1FBQ0QsSUFBSSxPQUFPO1lBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDM0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVE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RCw0RUFBNEU7UUFDNUUsK0NBQStDO1FBQy9DLE1BQU0sQ0FBQyxLQUFLLEdBQUcsUUFBUSxFQUFFLEtBQUssSUFBSSxLQUFLLEVBQUUsS0FBSyxJQUFJLFFBQVEsQ0FBQztRQUUzRCxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUNsRCxJQUFJLEdBQUcsSUFBSSxDQUFDO2dCQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUM7O2dCQUMvQixPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVCLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2QixDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQzs4R0Fua0JVLGdCQUFnQjtrSEFBaEIsZ0JBQWdCLGNBREgsTUFBTTs7MkZBQ25CLGdCQUFnQjtrQkFENUIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFdhbmRTZXJ2aWNlIH0gZnJvbSAnLi4vd2FuZC93YW5kLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2FjaGVkSW1hZ2VEYXRhLCBXYW5kVG9vbEhvc3QgfSBmcm9tICcuLi93YW5kL3dhbmQtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IEJCb3hNYXNrLCBtYXNrc092ZXJsYXAsIHVuaW9uTWFza3MgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VvbWV0cnknO1xuaW1wb3J0IHsgUmVnaW9uLCBQb2x5Z29uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3JlZ2lvbic7XG5cbi8qKiBCcnVzaCBwYXJhbWV0ZXJzLiBgc2l6ZWAgaXMgdGhlIGJydXNoICpkaWFtZXRlciogaW4gbWF0cml4IChpbWFnZSkgcGl4ZWxzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBCcnVzaE9wdGlvbnMge1xuICBzaXplPzogbnVtYmVyO1xuICAvKipcbiAgICogUGFpbnQgYXMgb25lIGNsYXNzLiBXaXRoIGBsYWJlbGAgc2V0LCBuZXcgcmVnaW9ucyB0YWtlIHRoaXMgbGFiZWwsIGFuZCB0aGVcbiAgICogc3Ryb2tlIG9ubHkgYWRvcHRzIG9yIG1lcmdlcyByZWdpb25zIHRoYXQgYWxyZWFkeSBoYXZlIGl0LCBzbyBwYWludGluZyBvbmVcbiAgICogY2xhc3MgbmV2ZXIgZ3Jvd3MgYW5vdGhlciBjbGFzcydzIHJlZ2lvbi4gYGNvbG9yYCBjb2xvdXJzIHRoZSBwYWludGVkXG4gICAqIHJlZ2lvbnMgaW5zdGVhZCBvZiB0aGUgdG9vbGJhcidzIHNoYXBlIGNvbG91ci4gTGVhdmUgYm90aCB1bnNldCBmb3IgdGhlXG4gICAqIHBsYWluIHRvb2xiYXIgYnJ1c2guXG4gICAqL1xuICBsYWJlbD86IHN0cmluZztcbiAgY29sb3I/OiBzdHJpbmc7XG59XG5cbi8qKiBEZWZhdWx0IGJydXNoIGRpYW1ldGVyIChtYXRyaXggcGl4ZWxzKSBpZiBub25lIGlzIHN1cHBsaWVkLiAqL1xuY29uc3QgREVGQVVMVF9CUlVTSF9TSVpFID0gNDA7XG5cbi8qKlxuICogVGhlIGJydXNoIGhvc3QgaXMgaWRlbnRpY2FsIHRvIHRoZSB3YW5kJ3Mg4oCUIGJvdGggbmVlZCB0aGUgY2FjaGVkLWltYWdlXG4gKiBjb29yZGluYXRlIGZyYW1lLCB0aGUgb3ZlcmxheSBjb250YWluZXIsIHRoZSBjb29yZGluYXRlIHRyYW5zZm9ybSwgYW5kXG4gKiByZWFkL3dyaXRlIGFjY2VzcyB0byB0aGUgc2hhcmVkIHJlZ2lvbiBsaXN0LiBUaGUgYnJ1c2ggaWdub3JlcyB0aGUgd2FuZCdzXG4gKiBwaXhlbCB2YWx1ZXMgKGl0IHBhaW50cyBhIGdlb21ldHJpYyBkaXNjIHJhdGhlciB0aGFuIGZsb29kLWZpbGxpbmcgYnkgY29sb3VyKSxcbiAqIHNvIHJldXNpbmcge0BsaW5rIFdhbmRUb29sSG9zdH0gbGV0cyBlYWNoIGJhY2tlbmQgYmluZCB0aGUgc2FtZSBob3N0IG9iamVjdC5cbiAqL1xuZXhwb3J0IHR5cGUgQnJ1c2hUb29sSG9zdCA9IFdhbmRUb29sSG9zdDtcblxuLyoqXG4gKiBRdVBhdGgtc3R5bGUgYnJ1c2ggdG9vbC4gUGFpbnRpbmcgYSBzdHJva2UgdW5pb25zIGEgZGlzYyBvZiB0aGUgY29uZmlndXJlZFxuICogc2l6ZSBpbnRvIHRoZSBhY3RpdmUgcmVnaW9uIGFzIHRoZSBjdXJzb3IgZHJhZ3M7IGhvbGRpbmcgPGtiZD5TaGlmdDwva2JkPlxuICogc3VidHJhY3RzIGluc3RlYWQgKGVyYXNlciBicnVzaCksIG1hdGNoaW5nIHRoZSB3YW5kJ3MgbW9kaWZpZXIuIFRoZSBzdHJva2UgaXNcbiAqIGFjY3VtdWxhdGVkIGFzIGEgYmJveC1yZWxhdGl2ZSBtYXNrIChleGFjdGx5IGxpa2Uge0BsaW5rIFdhbmRUb29sU2VydmljZX0pIHNvXG4gKiB0aGUgYnJ1c2ggaW5oZXJpdHMgdGhlIHdhbmQncyBhZG9wdC1leGlzdGluZy1yZWdpb24gYW5kIG1lcmdlLW9uLXRvdWNoXG4gKiBiZWhhdmlvdXIsIHRoZW4gdGhlIHVuaW9uIGJvdW5kYXJ5IGlzIHRyYWNlZCBiYWNrIGludG8gYSBwb2x5Z29uIFJlZ2lvbi5cbiAqXG4gKiBObyBwaXhlbCBzYW1wbGluZyBhbmQgbm8gY3Vyc29yIGluZGljYXRvcjogdGhlIHBhaW50ZWQgc3Ryb2tlIGl0c2VsZiBzaG93cyB0aGVcbiAqIGJydXNoIHNpemUuIFRoZSBvdmVybGF5IGNhbnZhcyBvbmx5IGNhcHR1cmVzIHRoZSBwb2ludGVyLlxuICpcbiAqIExpZmVjeWNsZSBtaXJyb3JzIHRoZSB3YW5kOiBhIGJhY2tlbmQgYmluZHMgaXRzIGhvc3Qgb25jZSwgdGhlbiB0b2dnbGVzIHRoZVxuICogdG9vbCB3aXRoIGBzZXRNb2RlKHRydWUgfCBmYWxzZSwgb3B0aW9ucylgLlxuICpcbiAqIEhvbGVzIC8gZG9udXRzIChqaXQtdWkjODUpOiBicnVzaGluZyBhIHJpbmcgdGhhdCBlbmNsb3NlcyBhbiB1bnBhaW50ZWQgYXJlYVxuICoga2VlcHMgdGhlIGVuY2xvc2VkIGhvbGUg4oCUIHtAbGluayBXYW5kU2VydmljZS5tYXNrVG9Qb2x5Z29uc30gdHJhY2VzIGludGVyaW9yXG4gKiByaW5ncyBpbnRvIHtAbGluayBQb2x5Z29uLmhvbGVzfSwgd2hpY2ggYWRvcHQvbWVyZ2UgcHJlc2VydmUgKHRoZSByZS1yYXN0ZXJpemVcbiAqIHB1bmNoZXMgdGhlIGhvbGVzIGJhY2sgb3V0KS4gVGhlIE9wZW5TZWFkcmFnb24gb3ZlcmxheSByZW5kZXJzIHRoZW0gd2l0aFxuICogZXZlbi1vZGQgZmlsbCBhbmQgR2VvSlNPTiByb3VuZC10cmlwcyB0aGVtIGFzIGV4dHJhIFBvbHlnb24gcmluZ3MuIFRoZSBQbG90bHlcbiAqIChIZWF0bWFwKSBiYWNrZW5kIGN1cnJlbnRseSByZW5kZXJzIHRoZSBmaWxsZWQgZXh0ZXJpb3Igb25seS5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBCcnVzaFRvb2xTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBob3N0ITogQnJ1c2hUb29sSG9zdDtcbiAgcHJpdmF0ZSBvdmVybGF5OiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGFjdGl2ZSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBBY2N1bXVsYXRlZCBicnVzaCByZWdpb24gKGJib3gtcmVsYXRpdmUgbWFzaykuIFBlcnNpc3RzIGFjcm9zcyBtb3VzZXVwIHNvIGFcbiAgICogc3Vic2VxdWVudCBzdHJva2UgZXh0ZW5kcyB0aGUgKnNhbWUqIHJlZ2lvbiB1bnRpbCB0aGUgdXNlciBzd2l0Y2hlcyB0b29sIOKAlFxuICAgKiBtYXRjaGluZyBRdVBhdGgsIGFuZCB0aGUgd2FuZC5cbiAgICovXG4gIHByaXZhdGUgc3Ryb2tlOiBCQm94TWFzayB8IG51bGwgPSBudWxsO1xuICAvKiogSWQgb2YgdGhlIHJlZ2lvbiB0aGlzIHN0cm9rZSBpcyBlZGl0aW5nIChudWxsID0gYSBmcmVzaCByZWdpb24pLiBGb3IgYW5cbiAgICogIGVyYXNlIHRoYXQgc3BsaXRzIHRoZSByZWdpb24sIHRoaXMgdHJhY2tzIHRoZSBsYXJnZXN0IHJlc3VsdGluZyBwaWVjZS4gKi9cbiAgcHJpdmF0ZSBzdHJva2VSZWdpb25JZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBSZWFkYmFjayByYXRpby9vcmlnaW4gc2lnbmF0dXJlIHRoZSBhY3RpdmUgc3Ryb2tlIGlzIHRpZWQgdG87IGEgY2hhbmdlICh6b29tL3BhbikgaW52YWxpZGF0ZXNcbiAgICogIGl0IHNvIGl0IGlzbid0IHJlLWNvbW1pdHRlZCBhdCBhIGRpZmZlcmVudCBzY2FsZSAoaml0LXVpIzEwMikuICovXG4gIHByaXZhdGUgc3Ryb2tlUmF0aW9TaWc6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogSWRzIG9mIHRoZSBleHRyYSByZWdpb25zIHByb2R1Y2VkIHdoZW4gYW4gZXJhc2Ugc3Ryb2tlIHNwbGl0cyBhIHJlZ2lvblxuICAgKiAgaW50byBkaXNjb25uZWN0ZWQgcGllY2VzIOKAlCByZXVzZWQgYWNyb3NzIGRyYWcgdGlja3Mgc28gdGhlIHNwbGl0IHBpZWNlc1xuICAgKiAga2VlcCBzdGFibGUgaWRlbnRpdGllcyBpbnN0ZWFkIG9mIGJlaW5nIHJlY3JlYXRlZCBlYWNoIHRpY2suICovXG4gIHByaXZhdGUgc3Ryb2tlRXh0cmFJZHM6IG51bWJlcltdID0gW107XG4gIC8qKiBQcmV2aW91cyBjdXJzb3IgcG9zaXRpb24gKG1hdHJpeCBjb29yZHMpIHdpdGhpbiB0aGUgY3VycmVudCBkcmFnLCBzbyBmYXN0XG4gICAqICBkcmFncyBwYWludCBhIGNvbnRpbnVvdXMgc3Ryb2tlIHJhdGhlciB0aGFuIGRpc2Nvbm5lY3RlZCBkYWJzLiAqL1xuICBwcml2YXRlIGxhc3RNYXRyaXg6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGRyYWdnaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgc2l6ZSA9IERFRkFVTFRfQlJVU0hfU0laRTtcbiAgLyoqIFRoZSBjbGFzcyBiZWluZyBwYWludGVkICh7QGxpbmsgQnJ1c2hPcHRpb25zLmxhYmVsfSAvIGBjb2xvcmApOyBudWxsID0gcGxhaW4gYnJ1c2guICovXG4gIHByaXZhdGUgcGFpbnRDbGFzczogeyBsYWJlbD86IHN0cmluZzsgY29sb3I/OiBzdHJpbmcgfSB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYm91bmRNb3VzZURvd246IChlOiBNb3VzZUV2ZW50KSA9PiB2b2lkO1xuICBwcml2YXRlIHJlYWRvbmx5IGJvdW5kTW91c2VNb3ZlOiAoZTogTW91c2VFdmVudCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSBib3VuZE1vdXNlVXA6IChlOiBNb3VzZUV2ZW50KSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgd2FuZFNlcnZpY2U6IFdhbmRTZXJ2aWNlKSB7XG4gICAgdGhpcy5ib3VuZE1vdXNlRG93biA9IChlKSA9PiB0aGlzLm9uTW91c2VEb3duKGUpO1xuICAgIHRoaXMuYm91bmRNb3VzZU1vdmUgPSAoZSkgPT4gdGhpcy5vbk1vdXNlTW92ZShlKTtcbiAgICB0aGlzLmJvdW5kTW91c2VVcCA9IChlKSA9PiB0aGlzLm9uTW91c2VVcChlKTtcbiAgfVxuXG4gIC8qKiBXaXJlIHRoZSB0b29sIHRvIGl0cyBob3N0LiBNdXN0IGJlIGNhbGxlZCBvbmNlIGJlZm9yZSBgc2V0TW9kZSh0cnVlKWAuICovXG4gIGJpbmRIb3N0KGhvc3Q6IEJydXNoVG9vbEhvc3QpIHtcbiAgICB0aGlzLmhvc3QgPSBob3N0O1xuICB9XG5cbiAgLy8g4pSA4pSAIFB1YmxpYyBBUEkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIFRvZ2dsZSB0aGUgYnJ1c2ggb24vb2ZmLiAqL1xuICBzZXRNb2RlKGFjdGl2ZTogYm9vbGVhbiwgb3B0aW9uczogQnJ1c2hPcHRpb25zID0ge30pIHtcbiAgICB0aGlzLmFjdGl2ZSA9IGFjdGl2ZTtcbiAgICAvLyBTaXplIGFwcGxpZXMgd2hldGhlciBhcm1pbmcgb3Igbm90LCBhcyBiZWZvcmUgYnJ1c2ggY2xhc3NlczogYSBob3N0IG1heSBzZXQgaXRcbiAgICAvLyB3aGlsZSB0aGUgYnJ1c2ggaXMgb2ZmLCBhbmQgdGhlIG5leHQgYXJtIHdpdGhvdXQgb3B0aW9ucyBrZWVwcyBpdC5cbiAgICBpZiAob3B0aW9ucy5zaXplICE9IG51bGwpIHRoaXMuc2V0U2l6ZShvcHRpb25zLnNpemUpO1xuICAgIGlmIChhY3RpdmUpIHtcbiAgICAgIC8vIEFybWluZyBzZXRzIHRoZSBjbGFzcyBpbiBmdWxsOiBubyBsYWJlbC9jb2xvciBtZWFucyB0aGUgcGxhaW4gYnJ1c2guXG4gICAgICB0aGlzLnNldE9wdGlvbnMoeyBsYWJlbDogdW5kZWZpbmVkLCBjb2xvcjogdW5kZWZpbmVkLCAuLi5vcHRpb25zIH0pO1xuICAgICAgdGhpcy5jcmVhdGVPdmVybGF5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGVzdHJveU92ZXJsYXkoKTtcbiAgICAgIHRoaXMucGFpbnRDbGFzcyA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBzaXplIGFuZC9vciBjbGFzcyB3aGlsZSBhcm1lZC4gVGhlIGNsYXNzIGNoYW5nZXMgb25seSB3aGVuIGBsYWJlbGBcbiAgICogb3IgYGNvbG9yYCBpcyBwYXNzZWQgKGFzIGEga2V5LCBldmVuIGB1bmRlZmluZWRgKSwgc28gYSBzaXplLW9ubHkgdXBkYXRlXG4gICAqIGtlZXBzIGl0LiBTd2l0Y2hpbmcgY2xhc3MgZHJvcHMgdGhlIGFjdGl2ZSByZWdpb24sIHNvIHRoZSBuZXh0IHN0cm9rZVxuICAgKiBzdGFydHMgYSByZWdpb24gb2YgdGhlIG5ldyBjbGFzcy5cbiAgICovXG4gIHNldE9wdGlvbnMob3B0aW9uczogQnJ1c2hPcHRpb25zID0ge30pIHtcbiAgICBpZiAob3B0aW9ucy5zaXplICE9IG51bGwpIHRoaXMuc2V0U2l6ZShvcHRpb25zLnNpemUpO1xuICAgIGlmICghKCdsYWJlbCcgaW4gb3B0aW9ucykgJiYgISgnY29sb3InIGluIG9wdGlvbnMpKSByZXR1cm47XG4gICAgY29uc3QgbmV4dCA9IG9wdGlvbnMubGFiZWwgIT0gbnVsbCB8fCBvcHRpb25zLmNvbG9yICE9IG51bGxcbiAgICAgID8geyBsYWJlbDogb3B0aW9ucy5sYWJlbCwgY29sb3I6IG9wdGlvbnMuY29sb3IgfVxuICAgICAgOiBudWxsO1xuICAgIGlmIChuZXh0Py5sYWJlbCAhPT0gdGhpcy5wYWludENsYXNzPy5sYWJlbCB8fCBuZXh0Py5jb2xvciAhPT0gdGhpcy5wYWludENsYXNzPy5jb2xvcikge1xuICAgICAgdGhpcy5yZXNldFN0cm9rZSgpO1xuICAgIH1cbiAgICB0aGlzLnBhaW50Q2xhc3MgPSBuZXh0O1xuICB9XG5cbiAgLyoqIExpdmUtdXBkYXRlIHRoZSBicnVzaCBzaXplIChtYXRyaXgtcGl4ZWwgZGlhbWV0ZXIpLiAqL1xuICBzZXRTaXplKHNpemU6IG51bWJlcikge1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHNpemUpIHx8IHNpemUgPD0gMCkgcmV0dXJuO1xuICAgIHRoaXMuc2l6ZSA9IHNpemU7XG4gIH1cblxuICAvKiogRHJvcCB0aGUgYWN0aXZlIGJydXNoIHJlZ2lvbiBzbyB0aGUgbmV4dCBzdHJva2Ugc3RhcnRzIGEgbmV3IG9uZS4gKi9cbiAgY2xlYXJBY3RpdmVSZWdpb24oKSB7XG4gICAgdGhpcy5yZXNldFN0cm9rZSgpO1xuICB9XG5cbiAgLy8g4pSA4pSAIE92ZXJsYXkgbGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHByaXZhdGUgY3JlYXRlT3ZlcmxheSgpIHtcbiAgICBjb25zdCBwbG90RWwgPSB0aGlzLmhvc3QuZ2V0T3ZlcmxheUNvbnRhaW5lcigpO1xuICAgIGlmICghcGxvdEVsIHx8IHRoaXMub3ZlcmxheSkgcmV0dXJuO1xuXG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICBjYW52YXMuc3R5bGUudG9wID0gJzAnO1xuICAgIGNhbnZhcy5zdHlsZS5sZWZ0ID0gJzAnO1xuICAgIGNhbnZhcy5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnO1xuICAgIGNhbnZhcy5zdHlsZS5jdXJzb3IgPSAnY3Jvc3NoYWlyJztcbiAgICBjYW52YXMuc3R5bGUuekluZGV4ID0gJzEwMCc7XG4gICAgY2FudmFzLndpZHRoID0gcGxvdEVsLm9mZnNldFdpZHRoO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBwbG90RWwub2Zmc2V0SGVpZ2h0O1xuXG4gICAgcGxvdEVsLmFwcGVuZENoaWxkKGNhbnZhcyk7XG4gICAgdGhpcy5vdmVybGF5ID0gY2FudmFzO1xuXG4gICAgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuYm91bmRNb3VzZURvd24pO1xuICAgIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmJvdW5kTW91c2VNb3ZlKTtcbiAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuYm91bmRNb3VzZVVwKTtcbiAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHRoaXMuYm91bmRNb3VzZVVwKTtcbiAgfVxuXG4gIHByaXZhdGUgZGVzdHJveU92ZXJsYXkoKSB7XG4gICAgaWYgKCF0aGlzLm92ZXJsYXkpIHJldHVybjtcbiAgICB0aGlzLm92ZXJsYXkucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5ib3VuZE1vdXNlRG93bik7XG4gICAgdGhpcy5vdmVybGF5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuYm91bmRNb3VzZU1vdmUpO1xuICAgIHRoaXMub3ZlcmxheS5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5ib3VuZE1vdXNlVXApO1xuICAgIHRoaXMub3ZlcmxheS5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgdGhpcy5ib3VuZE1vdXNlVXApO1xuICAgIHRoaXMub3ZlcmxheS5yZW1vdmUoKTtcbiAgICB0aGlzLm92ZXJsYXkgPSBudWxsO1xuICAgIHRoaXMucmVzZXRTdHJva2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgb25Nb3VzZURvd24oZTogTW91c2VFdmVudCkge1xuICAgIGlmIChlLmJ1dHRvbiAhPT0gMCkgcmV0dXJuO1xuICAgIHRoaXMuZHJhZ2dpbmcgPSB0cnVlO1xuICAgIHRoaXMubGFzdE1hdHJpeCA9IG51bGw7IC8vIGZpcnN0IHN0YW1wIG9mIHRoaXMgZHJhZyBpcyBhIHNpbmdsZSBkYWJcbiAgICB0aGlzLmFwcGx5QXRDbGllbnQoZSwgdHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIG9uTW91c2VNb3ZlKGU6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuZHJhZ2dpbmcpIHJldHVybjtcbiAgICBpZiAoKGUuYnV0dG9ucyAmIDEpID09PSAwKSB7XG4gICAgICB0aGlzLmRyYWdnaW5nID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYXBwbHlBdENsaWVudChlLCBmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIG9uTW91c2VVcChfOiBNb3VzZUV2ZW50KSB7XG4gICAgLy8gU3RvcCBhY2N1bXVsYXRpbmcgZnJvbSB0aGlzIGRyYWcsIGJ1dCBrZWVwIHRoZSByZWdpb24gYWxpdmUgc28gdGhlIG5leHRcbiAgICAvLyBtb3VzZWRvd24gZXh0ZW5kcyBpdC4gQ2xlYXIgbGFzdE1hdHJpeCBzbyB0aGUgbmV4dCBkcmFnIHN0YXJ0cyBhIGRhYi5cbiAgICB0aGlzLmRyYWdnaW5nID0gZmFsc2U7XG4gICAgdGhpcy5sYXN0TWF0cml4ID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRTdHJva2UoKSB7XG4gICAgdGhpcy5zdHJva2UgPSBudWxsO1xuICAgIHRoaXMuc3Ryb2tlUmVnaW9uSWQgPSBudWxsO1xuICAgIHRoaXMuc3Ryb2tlRXh0cmFJZHMgPSBbXTtcbiAgICB0aGlzLmxhc3RNYXRyaXggPSBudWxsO1xuICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBQZXItdGljayBzdHJva2UgbG9naWMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFBhaW50IChvciBlcmFzZSkgYSBkaXNjIOKAlCBvciBhIHN3ZXB0IGxpbmUgb2YgZGlzY3Mgc2luY2UgdGhlIHByZXZpb3VzXG4gICAqIHRpY2sg4oCUIGludG8gdGhlIGFjdGl2ZSByZWdpb24ncyBhY2N1bXVsYXRvciBtYXNrLCByZS10cmFjZSB0aGUgYm91bmRhcnksXG4gICAqIGFuZCBjb21taXQgdGhlIHVwZGF0ZWQgUmVnaW9uLiBTaGlmdCA9IGVyYXNlLlxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseUF0Q2xpZW50KGU6IE1vdXNlRXZlbnQsIGlzU3RhcnQ6IGJvb2xlYW4pIHtcbiAgICBpZiAoIXRoaXMub3ZlcmxheSkgcmV0dXJuO1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuaG9zdC5nZXRDYWNoZWRJbWFnZURhdGEoKTtcbiAgICBpZiAoIWNhY2hlZCB8fCBjYWNoZWQuZnJhbWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVnaW9ucyA9IHRoaXMuaG9zdC5nZXRSZWdpb25zKCk7XG5cbiAgICBjb25zdCB0cmFuc2Zvcm0gPSB0aGlzLmhvc3QuZ2V0Q29vcmRpbmF0ZVRyYW5zZm9ybSgpO1xuICAgIGlmICghdHJhbnNmb3JtLmlzUmVhZHkoKSkgcmV0dXJuO1xuICAgIGNvbnN0IHsgeDogZGF0YVgsIHk6IGRhdGFZIH0gPSB0cmFuc2Zvcm0uY2xpZW50VG9EYXRhKGUuY2xpZW50WCwgZS5jbGllbnRZKTtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShkYXRhWCkgfHwgIU51bWJlci5pc0Zpbml0ZShkYXRhWSkpIHJldHVybjtcblxuICAgIC8vIEhlYXRtYXAvaW1hZ2UgdHJhY2VzIHVzZSByYXRpb3NbMF0gZm9yIGJvdGggZHggYW5kIGR5LlxuICAgIGNvbnN0IHJ4ID0gY2FjaGVkLnJhdGlvc1swXSB8fCAxO1xuICAgIGNvbnN0IHJ5ID0gY2FjaGVkLnJhdGlvc1swXSB8fCAxO1xuICAgIGNvbnN0IG94ID0gY2FjaGVkLm9yaWdpblggPz8gMDtcbiAgICBjb25zdCBveSA9IGNhY2hlZC5vcmlnaW5ZID8/IDA7XG4gICAgLy8gRHJvcCBhIHN0cm9rZSBidWlsdCBhdCBhIGRpZmZlcmVudCB2aWV3ICh6b29tL3Bhbik6IGl0cyBtYXRyaXggY29vcmRzIGFyZSB0aWVkIHRvIHRoZSBvbGRcbiAgICAvLyByYXRpby9vcmlnaW4sIGFuZCByZS1jb21taXR0aW5nIHdvdWxkIHJlc2NhbGUgdGhlIHJlZ2lvbiBieSB0aGUgem9vbSBmYWN0b3IgKGppdC11aSMxMDIpLlxuICAgIGNvbnN0IHNpZyA9IGAke3J4fSwke3J5fSwke294fSwke295fWA7XG4gICAgaWYgKHRoaXMuc3Ryb2tlICYmIHRoaXMuc3Ryb2tlUmF0aW9TaWcgIT09IHNpZykge1xuICAgICAgdGhpcy5zdHJva2UgPSBudWxsO1xuICAgICAgdGhpcy5zdHJva2VSZWdpb25JZCA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuc3Ryb2tlUmF0aW9TaWcgPSBzaWc7XG4gICAgY29uc3QgbWF0cml4WCA9IChkYXRhWCAtIG94KSAvIHJ4O1xuICAgIGNvbnN0IG1hdHJpeFkgPSAoZGF0YVkgLSBveSkgLyByeTtcbiAgICBpZiAobWF0cml4WCA8IDAgfHwgbWF0cml4WCA+PSBjYWNoZWQud2lkdGgpIHJldHVybjtcbiAgICBpZiAobWF0cml4WSA8IDAgfHwgbWF0cml4WSA+PSBjYWNoZWQuaGVpZ2h0KSByZXR1cm47XG5cbiAgICBjb25zdCBlcmFzZSA9IGUuc2hpZnRLZXk7XG4gICAgY29uc3QgcmFkaXVzID0gTWF0aC5tYXgoMC41LCB0aGlzLnNpemUgLyAyKTtcblxuICAgIC8vIFN0YXJ0IG9mIGEgZnJlc2ggZHJhZyB0aGF0IGlzbid0IGluc2lkZSB0aGUgY3VycmVudCBhY2N1bXVsYXRvcjogZHJvcCB0aGVcbiAgICAvLyBvbGQgc3Ryb2tlIHNvIGEgYnJhbmQtbmV3IHJlZ2lvbiBzdGFydHMgaGVyZSAobWlycm9ycyB0aGUgd2FuZCkuXG4gICAgaWYgKGlzU3RhcnQgJiYgIWVyYXNlICYmIHRoaXMuc3Ryb2tlICYmICF0aGlzLnBvaW50SW5TdHJva2UobWF0cml4WCwgbWF0cml4WSkpIHtcbiAgICAgIHRoaXMuc3Ryb2tlID0gbnVsbDtcbiAgICAgIHRoaXMuc3Ryb2tlUmVnaW9uSWQgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlJ3Mgbm8gYWN0aXZlIHJlZ2lvbiwgYWRvcHQgYW4gZXhpc3Rpbmcgc2hhcGUgdW5kZXIgdGhlIGN1cnNvciBzb1xuICAgIC8vIHRoZSBzdHJva2UgZXh0ZW5kcyAob3IgZXJhc2VzIGZyb20pIGl0IGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgcmVnaW9uLlxuICAgIGlmICghdGhpcy5zdHJva2UpIHtcbiAgICAgIHRoaXMudHJ5QWRvcHRTaGFwZUF0KHJlZ2lvbnMsIG1hdHJpeFgsIG1hdHJpeFksIHJ4LCByeSwgY2FjaGVkKTtcbiAgICB9XG5cbiAgICAvLyBFcmFzaW5nIHJlcXVpcmVzIGFuIGV4aXN0aW5nIHJlZ2lvbiDigJQgc2hpZnQgb24gZW1wdHkgc3BhY2UgaXMgYSBuby1vcC5cbiAgICBpZiAoZXJhc2UgJiYgIXRoaXMuc3Ryb2tlKSB7XG4gICAgICB0aGlzLmxhc3RNYXRyaXggPSB7IHg6IG1hdHJpeFgsIHk6IG1hdHJpeFkgfTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTdGFtcCB0aGUgZGlzYywgc3dlZXBpbmcgZnJvbSB0aGUgcHJldmlvdXMgcG9pbnQgZm9yIGEgY29udGludW91cyBzdHJva2UuXG4gICAgaWYgKGlzU3RhcnQgfHwgIXRoaXMubGFzdE1hdHJpeCkge1xuICAgICAgdGhpcy5zdGFtcERpc2MobWF0cml4WCwgbWF0cml4WSwgcmFkaXVzLCBlcmFzZSwgY2FjaGVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZHggPSBtYXRyaXhYIC0gdGhpcy5sYXN0TWF0cml4Lng7XG4gICAgICBjb25zdCBkeSA9IG1hdHJpeFkgLSB0aGlzLmxhc3RNYXRyaXgueTtcbiAgICAgIGNvbnN0IGRpc3QgPSBNYXRoLmh5cG90KGR4LCBkeSk7XG4gICAgICBjb25zdCBzdGVwID0gTWF0aC5tYXgoMSwgcmFkaXVzIC8gMik7XG4gICAgICBjb25zdCBuID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGRpc3QgLyBzdGVwKSk7XG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBuOyBpKyspIHtcbiAgICAgICAgY29uc3QgdCA9IGkgLyBuO1xuICAgICAgICB0aGlzLnN0YW1wRGlzYyh0aGlzLmxhc3RNYXRyaXgueCArIGR4ICogdCwgdGhpcy5sYXN0TWF0cml4LnkgKyBkeSAqIHQsIHJhZGl1cywgZXJhc2UsIGNhY2hlZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubGFzdE1hdHJpeCA9IHsgeDogbWF0cml4WCwgeTogbWF0cml4WSB9O1xuXG4gICAgaWYgKCF0aGlzLnN0cm9rZSkgcmV0dXJuO1xuXG4gICAgaWYgKCFlcmFzZSkge1xuICAgICAgLy8gR3Jvd2luZyBpbnRvIGFub3RoZXIgc2hhcGUgZm9sZHMgaXQgaW50byB0aGlzIHN0cm9rZSAobWVyZ2Utb24tdG91Y2gpLlxuICAgICAgdGhpcy5tZXJnZU92ZXJsYXBwaW5nU2hhcGVzKHJlZ2lvbnMsIHJ4LCByeSwgY2FjaGVkKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdHJva2UgPSB0aGlzLnN0cm9rZTtcbiAgICAvLyBUcmFjZSBldmVyeSBjb25uZWN0ZWQgcGllY2U6IGFuIGVyYXNlIHRoYXQgY3V0cyB0aHJvdWdoIHRoZSByZWdpb24gc3BsaXRzXG4gICAgLy8gaXQgaW50byB0d28sIGFuZCBib3RoIG11c3Qgc3Vydml2ZSAodGhlIGxhcmdlciBrZWVwcyB0aGUgcmVnaW9uIGlkZW50aXR5KS5cbiAgICBjb25zdCBwb2x5cyA9IHRoaXMud2FuZFNlcnZpY2UubWFza1RvUG9seWdvbnMoXG4gICAgICBzdHJva2UubWFzaywgc3Ryb2tlLmJ3LCBzdHJva2UuYmgsIGNhY2hlZC53aWR0aCwgY2FjaGVkLmhlaWdodCwgc3Ryb2tlLmJ4LCBzdHJva2UuYnksXG4gICAgKTtcbiAgICBpZiAocG9seXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBFcmFzZWQgdG8gbm90aGluZyDigJQgcmVtb3ZlIHRoZSBzaGFwZShzKSBlbnRpcmVseS5cbiAgICAgIGlmIChlcmFzZSkgdGhpcy5kcm9wQWN0aXZlU2hhcGUocmVnaW9ucyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29tcG9uZW50cyA9IHBvbHlzLm1hcCgocG9seSkgPT4gKHtcbiAgICAgIHhQbG90OiBwb2x5Lnhwb2ludHMubWFwKCh4KSA9PiBveCArIHggKiByeCksXG4gICAgICB5UGxvdDogcG9seS55cG9pbnRzLm1hcCgoeSkgPT4gb3kgKyB5ICogcnkpLFxuICAgICAgLy8gQ2FycnkgdHJhY2VkIGludGVyaW9yIHJpbmdzIChob2xlcykgYmFjayB0byBwbG90IGNvb3JkcyBzbyB0aGUgZG9udXRcbiAgICAgIC8vIHN1cnZpdmVzIHRoZSBjb21taXQgKGppdC11aSM4NSkuXG4gICAgICBob2xlczogcG9seS5ob2xlcz8ubWFwKChyaW5nKSA9PiByaW5nLm1hcCgoW3gsIHldKSA9PiBbb3ggKyB4ICogcngsIG95ICsgeSAqIHJ5XSkpLFxuICAgIH0pKTtcbiAgICB0aGlzLmNvbW1pdENvbXBvbmVudHMocmVnaW9ucywgY29tcG9uZW50cyk7XG4gIH1cblxuICAvKipcbiAgICogT1IgKGFkZCkgb3IgQU5ELU5PVCAoZXJhc2UpIGEgZmlsbGVkIGRpc2Mgb2YgYHJhZGl1c2AgbWF0cml4LXBpeGVscyBjZW50cmVkXG4gICAqIGF0IChjeCwgY3kpIGludG8gdGhlIGFjY3VtdWxhdG9yLCBncm93aW5nIGl0cyBiYm94IHRvIGZpdCB3aGVuIGFkZGluZy5cbiAgICovXG4gIHByaXZhdGUgc3RhbXBEaXNjKGN4OiBudW1iZXIsIGN5OiBudW1iZXIsIHJhZGl1czogbnVtYmVyLCBlcmFzZTogYm9vbGVhbiwgY2FjaGVkOiBDYWNoZWRJbWFnZURhdGEpIHtcbiAgICBjb25zdCBweDAgPSBNYXRoLmZsb29yKGN4IC0gcmFkaXVzKTtcbiAgICBjb25zdCBweTAgPSBNYXRoLmZsb29yKGN5IC0gcmFkaXVzKTtcbiAgICBjb25zdCBweDEgPSBNYXRoLmNlaWwoY3ggKyByYWRpdXMpICsgMTtcbiAgICBjb25zdCBweTEgPSBNYXRoLmNlaWwoY3kgKyByYWRpdXMpICsgMTtcblxuICAgIGlmICghZXJhc2UpIHtcbiAgICAgIGlmICghdGhpcy5lbnN1cmVTdHJva2VDb3ZlcnMocHgwLCBweTAsIHB4MSwgcHkxLCBjYWNoZWQpKSByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHMgPSB0aGlzLnN0cm9rZTtcbiAgICBpZiAoIXMpIHJldHVybjsgLy8gZXJhc2luZyB3aXRoIG5vIGFjdGl2ZSByZWdpb25cblxuICAgIGNvbnN0IHIyID0gcmFkaXVzICogcmFkaXVzO1xuICAgIGNvbnN0IGl5MCA9IE1hdGgubWF4KHMuYnksIHB5MCk7XG4gICAgY29uc3QgaXkxID0gTWF0aC5taW4ocy5ieSArIHMuYmgsIHB5MSk7XG4gICAgY29uc3QgaXgwID0gTWF0aC5tYXgocy5ieCwgcHgwKTtcbiAgICBjb25zdCBpeDEgPSBNYXRoLm1pbihzLmJ4ICsgcy5idywgcHgxKTtcbiAgICBmb3IgKGxldCBpeSA9IGl5MDsgaXkgPCBpeTE7IGl5KyspIHtcbiAgICAgIGNvbnN0IGR5ID0gaXkgKyAwLjUgLSBjeTtcbiAgICAgIGNvbnN0IHJvdyA9IChpeSAtIHMuYnkpICogcy5idztcbiAgICAgIGZvciAobGV0IGl4ID0gaXgwOyBpeCA8IGl4MTsgaXgrKykge1xuICAgICAgICBjb25zdCBkeCA9IGl4ICsgMC41IC0gY3g7XG4gICAgICAgIGlmIChkeCAqIGR4ICsgZHkgKiBkeSA+IHIyKSBjb250aW51ZTtcbiAgICAgICAgcy5tYXNrW3JvdyArIChpeCAtIHMuYngpXSA9IGVyYXNlID8gMCA6IDE7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZSB0aGUgYWNjdW11bGF0b3IncyBiYm94IGNvdmVycyBbcHgwLHB5MCxweDEscHkxKSAoY2xhbXBlZCB0byB0aGVcbiAgICogaW1hZ2UpLCBhbGxvY2F0aW5nL2NvcHlpbmcgYSBsYXJnZXIgbWFzayB3aGVuIGl0IG11c3QgZ3Jvdy4gUmV0dXJucyBmYWxzZSBpZlxuICAgKiB0aGUgcmVxdWVzdGVkIGJveCBpcyBlbXB0eSBhZnRlciBjbGFtcGluZy5cbiAgICovXG4gIHByaXZhdGUgZW5zdXJlU3Ryb2tlQ292ZXJzKFxuICAgIHB4MDogbnVtYmVyLCBweTA6IG51bWJlciwgcHgxOiBudW1iZXIsIHB5MTogbnVtYmVyLCBjYWNoZWQ6IENhY2hlZEltYWdlRGF0YSxcbiAgKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYnggPSBNYXRoLm1heCgwLCBweDApO1xuICAgIGNvbnN0IGJ5ID0gTWF0aC5tYXgoMCwgcHkwKTtcbiAgICBjb25zdCBieDEgPSBNYXRoLm1pbihjYWNoZWQud2lkdGgsIHB4MSk7XG4gICAgY29uc3QgYnkxID0gTWF0aC5taW4oY2FjaGVkLmhlaWdodCwgcHkxKTtcbiAgICBjb25zdCBidyA9IGJ4MSAtIGJ4O1xuICAgIGNvbnN0IGJoID0gYnkxIC0gYnk7XG4gICAgaWYgKGJ3IDw9IDAgfHwgYmggPD0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKCF0aGlzLnN0cm9rZSkge1xuICAgICAgdGhpcy5zdHJva2UgPSB7IGJ4LCBieSwgYncsIGJoLCBtYXNrOiBuZXcgVWludDhBcnJheShidyAqIGJoKSB9O1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHMgPSB0aGlzLnN0cm9rZTtcbiAgICBjb25zdCBuYnggPSBNYXRoLm1pbihzLmJ4LCBieCk7XG4gICAgY29uc3QgbmJ5ID0gTWF0aC5taW4ocy5ieSwgYnkpO1xuICAgIGNvbnN0IG5ieDEgPSBNYXRoLm1heChzLmJ4ICsgcy5idywgYngxKTtcbiAgICBjb25zdCBuYnkxID0gTWF0aC5tYXgocy5ieSArIHMuYmgsIGJ5MSk7XG4gICAgY29uc3QgbmJ3ID0gbmJ4MSAtIG5ieDtcbiAgICBjb25zdCBuYmggPSBuYnkxIC0gbmJ5O1xuICAgIGlmIChuYncgPT09IHMuYncgJiYgbmJoID09PSBzLmJoICYmIG5ieCA9PT0gcy5ieCAmJiBuYnkgPT09IHMuYnkpIHJldHVybiB0cnVlO1xuXG4gICAgY29uc3QgbmV4dCA9IG5ldyBVaW50OEFycmF5KG5idyAqIG5iaCk7XG4gICAgY29uc3QgZHggPSBzLmJ4IC0gbmJ4O1xuICAgIGNvbnN0IGR5ID0gcy5ieSAtIG5ieTtcbiAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBzLmJoOyByb3crKykge1xuICAgICAgY29uc3Qgc3JjT2ZmID0gcm93ICogcy5idztcbiAgICAgIGNvbnN0IGRzdE9mZiA9IChyb3cgKyBkeSkgKiBuYncgKyBkeDtcbiAgICAgIG5leHQuc2V0KHMubWFzay5zdWJhcnJheShzcmNPZmYsIHNyY09mZiArIHMuYncpLCBkc3RPZmYpO1xuICAgIH1cbiAgICB0aGlzLnN0cm9rZSA9IHsgYng6IG5ieCwgYnk6IG5ieSwgYnc6IG5idywgYmg6IG5iaCwgbWFzazogbmV4dCB9O1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIFRydWUgaWYgKG1hdHJpeFgsIG1hdHJpeFkpIGxpZXMgaW5zaWRlIHRoZSBjdXJyZW50IHN0cm9rZSBhY2N1bXVsYXRvci4gKi9cbiAgcHJpdmF0ZSBwb2ludEluU3Ryb2tlKG1hdHJpeFg6IG51bWJlciwgbWF0cml4WTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcyA9IHRoaXMuc3Ryb2tlO1xuICAgIGlmICghcykgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IG14ID0gTWF0aC5mbG9vcihtYXRyaXhYKSAtIHMuYng7XG4gICAgY29uc3QgbXkgPSBNYXRoLmZsb29yKG1hdHJpeFkpIC0gcy5ieTtcbiAgICBpZiAobXggPCAwIHx8IG15IDwgMCB8fCBteCA+PSBzLmJ3IHx8IG15ID49IHMuYmgpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gcy5tYXNrW215ICogcy5idyArIG14XSA9PT0gMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhlIHJlZ2lvbihzKSByZWZlcmVuY2VkIGJ5IHRoZSBzdHJva2UgYW5kIHJlc2V0IGl0IOKAlCB1c2VkIHdoZW4gYW5cbiAgICogZXJhc2Ugc3Ryb2tlIGRlbGV0ZXMgZXZlcnkgcGl4ZWwuXG4gICAqL1xuICBwcml2YXRlIGRyb3BBY3RpdmVTaGFwZShyZWdpb25zOiBSZWdpb25bXSkge1xuICAgIGNvbnN0IGlkcyA9IFt0aGlzLnN0cm9rZVJlZ2lvbklkLCAuLi50aGlzLnN0cm9rZUV4dHJhSWRzXS5maWx0ZXIoKGlkKTogaWQgaXMgbnVtYmVyID0+IGlkICE9IG51bGwpO1xuICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAgIGNvbnN0IGlkeCA9IHJlZ2lvbnMuZmluZEluZGV4KChyKSA9PiByLmlkID09PSBpZCk7XG4gICAgICBpZiAoaWR4ID49IDApIHsgcmVnaW9ucy5zcGxpY2UoaWR4LCAxKTsgY2hhbmdlZCA9IHRydWU7IH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZWQpIHRoaXMuaG9zdC5zZXRSZWdpb25zKHJlZ2lvbnMpO1xuICAgIHRoaXMuc3Ryb2tlID0gbnVsbDtcbiAgICB0aGlzLnN0cm9rZVJlZ2lvbklkID0gbnVsbDtcbiAgICB0aGlzLnN0cm9rZUV4dHJhSWRzID0gW107XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgc3Ryb2tlIG1heSBhZG9wdCBvciBtZXJnZSBgcmVnaW9uYDogYWx3YXlzIGZvciB0aGUgcGxhaW4gYnJ1c2gsXG4gICAqICBvdGhlcndpc2Ugb25seSBhIHJlZ2lvbiBvZiB0aGUgY2xhc3MgYmVpbmcgcGFpbnRlZC4gKi9cbiAgcHJpdmF0ZSBwYWludHNJbnRvKHJlZ2lvbjogUmVnaW9uKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbGFiZWwgPSB0aGlzLnBhaW50Q2xhc3M/LmxhYmVsO1xuICAgIHJldHVybiBsYWJlbCA9PSBudWxsIHx8IHJlZ2lvbj8ubGFiZWwgPT09IGxhYmVsO1xuICB9XG5cbiAgLyoqIEEgcmVnaW9uJ3MgY2xvc2VkLXBvbHlnb24gdmVydGljZXMgKGltYWdlL2RhdGEgY29vcmRzKSwgb3IgbnVsbCB3aGVuIGl0XG4gICAqICBpc24ndCBhIGZpbGxhYmxlIGNsb3NlZCBwb2x5Z29uIChyZWN0YW5nbGVzLCBvcGVuIHBvbHlsaW5lcykuICovXG4gIHByaXZhdGUgcmVnaW9uVmVydHMoXG4gICAgcmVnaW9uOiBSZWdpb24sXG4gICk6IHsgeHBvaW50czogbnVtYmVyW107IHlwb2ludHM6IG51bWJlcltdOyBob2xlcz86IG51bWJlcltdW11bXSB9IHwgbnVsbCB7XG4gICAgY29uc3QgYiA9IHJlZ2lvbj8uYm91bmRzO1xuICAgIGlmIChiIGluc3RhbmNlb2YgUG9seWdvbiAmJiBiLmNsb3NlZCAhPT0gZmFsc2UgJiYgYi54cG9pbnRzLmxlbmd0aCA+PSAzKSB7XG4gICAgICByZXR1cm4geyB4cG9pbnRzOiBiLnhwb2ludHMsIHlwb2ludHM6IGIueXBvaW50cywgaG9sZXM6IGIuaG9sZXMgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogV2hldGhlciBhIHJlZ2lvbiBjYW4gYmUgZmFpdGhmdWxseSByYXN0ZXJpemVkIGF0IHRoaXMgem9vbSAocngvcnkgPSBkYXRhIHVuaXRzIHBlciBtYXRyaXggcHgpLlxuICAgKiAgRWRpdGluZyByYXN0ZXJpemVzICsgcmUtdHJhY2VzIHRoZSByZWdpb24sIHNvIG9uZSB3aG9zZSBtYXRyaXgtc3BhY2UgYmJveCBleGNlZWRzIHRoZVxuICAgKiAgcmFzdGVyaXplciBjYXAgd291bGQgY29tZSBiYWNrIHJlc2NhbGVkL2NvcnJ1cHRlZCAoZS5nLiBhIHdob2xlLXNsaWRlIGFubm90YXRpb24gd2hpbGUgem9vbWVkXG4gICAqICBvdXQpIOKAlCBza2lwIGFkb3B0L21lcmdlIGZvciB0aG9zZSBhbmQgb25seSBlZGl0IHRoZW0gbmVhciBuYXRpdmUgem9vbSAoaml0LXVpIzEwMikuICovXG4gIHByaXZhdGUgZml0c0ZvckVkaXQodmVydHM6IHsgeHBvaW50czogbnVtYmVyW107IHlwb2ludHM6IG51bWJlcltdIH0sIHJ4OiBudW1iZXIsIHJ5OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCB4cyA9IHZlcnRzLnhwb2ludHM7XG4gICAgY29uc3QgeXMgPSB2ZXJ0cy55cG9pbnRzO1xuICAgIGxldCBtaW5YID0gSW5maW5pdHksIG1heFggPSAtSW5maW5pdHksIG1pblkgPSBJbmZpbml0eSwgbWF4WSA9IC1JbmZpbml0eTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoeHNbaV0gPCBtaW5YKSBtaW5YID0geHNbaV07XG4gICAgICBpZiAoeHNbaV0gPiBtYXhYKSBtYXhYID0geHNbaV07XG4gICAgICBpZiAoeXNbaV0gPCBtaW5ZKSBtaW5ZID0geXNbaV07XG4gICAgICBpZiAoeXNbaV0gPiBtYXhZKSBtYXhZID0geXNbaV07XG4gICAgfVxuICAgIGNvbnN0IHcgPSAobWF4WCAtIG1pblgpIC8gKHJ4IHx8IDEpO1xuICAgIGNvbnN0IGggPSAobWF4WSAtIG1pblkpIC8gKHJ5IHx8IDEpO1xuICAgIHJldHVybiB3ID4gMCAmJiBoID4gMCAmJiB3ICogaCA8PSA0MDk2ICogNDA5NjtcbiAgfVxuXG4gIC8qKiBDb252ZXJ0IGEgcmVnaW9uJ3MgaG9sZSByaW5ncyBmcm9tIGltYWdlL2RhdGEgY29vcmRzIGludG8gbWF0cml4IGNvb3JkcyBzb1xuICAgKiAgdGhleSBsaW5lIHVwIHdpdGggdGhlIHN0cm9rZSBhY2N1bXVsYXRvciAoaml0LXVpIzg1KS4gKi9cbiAgcHJpdmF0ZSBob2xlc1RvTWF0cml4KFxuICAgIGhvbGVzOiBudW1iZXJbXVtdW10gfCB1bmRlZmluZWQsIG94OiBudW1iZXIsIG95OiBudW1iZXIsIHJ4OiBudW1iZXIsIHJ5OiBudW1iZXIsXG4gICk6IG51bWJlcltdW11bXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGhvbGVzPy5tYXAoKHJpbmcpID0+IHJpbmcubWFwKChbeCwgeV0pID0+IFsoeCAtIG94KSAvIHJ4LCAoeSAtIG95KSAvIHJ5XSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIChtYXRyaXhYLCBtYXRyaXhZKSBmYWxscyBpbnNpZGUgYW4gZXhpc3RpbmcgcmVnaW9uLCByYXN0ZXJpemUgaXQgaW50byB0aGVcbiAgICogc3Ryb2tlIGFjY3VtdWxhdG9yIHNvIHN1YnNlcXVlbnQgYnJ1c2ggaW5wdXQgZXh0ZW5kcyBpdCByYXRoZXIgdGhhbiBzdGFydGluZ1xuICAgKiBhIG5ldyByZWdpb24uXG4gICAqL1xuICBwcml2YXRlIHRyeUFkb3B0U2hhcGVBdChcbiAgICByZWdpb25zOiBSZWdpb25bXSxcbiAgICBtYXRyaXhYOiBudW1iZXIsXG4gICAgbWF0cml4WTogbnVtYmVyLFxuICAgIHJ4OiBudW1iZXIsXG4gICAgcnk6IG51bWJlcixcbiAgICBjYWNoZWQ6IENhY2hlZEltYWdlRGF0YSxcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCFyZWdpb25zIHx8IHJlZ2lvbnMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gTW9zdC1yZWNlbnRseS1hZGRlZCByZWdpb25zIGFyZSBvbiB0b3Ag4oCUIGNoZWNrIHRoZW0gZmlyc3QuXG4gICAgZm9yIChsZXQgaSA9IHJlZ2lvbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGlmICghdGhpcy5wYWludHNJbnRvKHJlZ2lvbnNbaV0pKSBjb250aW51ZTsgLy8gYW5vdGhlciBjbGFzcydzIHJlZ2lvblxuICAgICAgY29uc3QgdmVydHMgPSB0aGlzLnJlZ2lvblZlcnRzKHJlZ2lvbnNbaV0pO1xuICAgICAgaWYgKCF2ZXJ0cykgY29udGludWU7XG4gICAgICBpZiAoIXRoaXMuZml0c0ZvckVkaXQodmVydHMsIHJ4LCByeSkpIGNvbnRpbnVlOyAvLyB0b28gbGFyZ2UgYXQgdGhpcyB6b29tIOKGkiBkb24ndCBhZG9wdFxuXG4gICAgICBjb25zdCBveCA9IGNhY2hlZC5vcmlnaW5YID8/IDA7XG4gICAgICBjb25zdCBveSA9IGNhY2hlZC5vcmlnaW5ZID8/IDA7XG4gICAgICBjb25zdCB4cyA9IHZlcnRzLnhwb2ludHMubWFwKCh4KSA9PiAoeCAtIG94KSAvIHJ4KTtcbiAgICAgIGNvbnN0IHlzID0gdmVydHMueXBvaW50cy5tYXAoKHkpID0+ICh5IC0gb3kpIC8gcnkpO1xuICAgICAgY29uc3QgaG9sZXMgPSB0aGlzLmhvbGVzVG9NYXRyaXgodmVydHMuaG9sZXMsIG94LCBveSwgcngsIHJ5KTtcblxuICAgICAgLy8gQ2xpY2tpbmcgaW5zaWRlIGEgaG9sZSBtdXN0IE5PVCBhZG9wdCB0aGUgZG9udXQgKGl0J3MgZW1wdHkgdGhlcmUpLlxuICAgICAgaWYgKCF0aGlzLndhbmRTZXJ2aWNlLnBvaW50SW5Qb2x5Z29uV2l0aEhvbGVzKG1hdHJpeFgsIG1hdHJpeFksIHhzLCB5cywgaG9sZXMpKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgcmFzdGVyID0gdGhpcy53YW5kU2VydmljZS5yYXN0ZXJpemVQb2x5Z29uKHhzLCB5cywgY2FjaGVkLndpZHRoLCBjYWNoZWQuaGVpZ2h0LCBob2xlcyk7XG4gICAgICBpZiAoIXJhc3RlcikgY29udGludWU7XG5cbiAgICAgIHRoaXMuc3Ryb2tlID0gcmFzdGVyO1xuICAgICAgdGhpcy5zdHJva2VSZWdpb25JZCA9IHJlZ2lvbnNbaV0uaWQgPz8gbnVsbDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogRm9sZCBldmVyeSByZWdpb24gd2hvc2UgcmFzdGVyaXplZCBtYXNrIG92ZXJsYXBzIHRoZSBzdHJva2UgbWFzayBpbnRvIHRoZVxuICAgKiBzdHJva2UgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0LCBzbyBicnVzaGluZyBhY3Jvc3MgcmVnaW9ucyBtZXJnZXMgdGhlbS5cbiAgICovXG4gIHByaXZhdGUgbWVyZ2VPdmVybGFwcGluZ1NoYXBlcyhyZWdpb25zOiBSZWdpb25bXSwgcng6IG51bWJlciwgcnk6IG51bWJlciwgY2FjaGVkOiBDYWNoZWRJbWFnZURhdGEpIHtcbiAgICBpZiAoIXRoaXMuc3Ryb2tlKSByZXR1cm47XG4gICAgbGV0IGRpZE1lcmdlID0gdHJ1ZTtcbiAgICB3aGlsZSAoZGlkTWVyZ2UpIHtcbiAgICAgIGRpZE1lcmdlID0gZmFsc2U7XG4gICAgICBmb3IgKGxldCBpID0gcmVnaW9ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBjb25zdCByZWdpb24gPSByZWdpb25zW2ldO1xuICAgICAgICBpZiAocmVnaW9uLmlkICE9IG51bGwgJiYgcmVnaW9uLmlkID09PSB0aGlzLnN0cm9rZVJlZ2lvbklkKSBjb250aW51ZTtcbiAgICAgICAgaWYgKCF0aGlzLnBhaW50c0ludG8ocmVnaW9uKSkgY29udGludWU7IC8vIG5ldmVyIGZvbGQgYW5vdGhlciBjbGFzcyBpblxuXG4gICAgICAgIGNvbnN0IHZlcnRzID0gdGhpcy5yZWdpb25WZXJ0cyhyZWdpb24pO1xuICAgICAgICBpZiAoIXZlcnRzKSBjb250aW51ZTtcbiAgICAgICAgaWYgKCF0aGlzLmZpdHNGb3JFZGl0KHZlcnRzLCByeCwgcnkpKSBjb250aW51ZTsgLy8gdG9vIGxhcmdlIGF0IHRoaXMgem9vbSDihpIgZG9uJ3QgbWVyZ2VcblxuICAgICAgICBjb25zdCBveCA9IGNhY2hlZC5vcmlnaW5YID8/IDA7XG4gICAgICAgIGNvbnN0IG95ID0gY2FjaGVkLm9yaWdpblkgPz8gMDtcbiAgICAgICAgY29uc3QgeHMgPSB2ZXJ0cy54cG9pbnRzLm1hcCgoeCkgPT4gKHggLSBveCkgLyByeCk7XG4gICAgICAgIGNvbnN0IHlzID0gdmVydHMueXBvaW50cy5tYXAoKHkpID0+ICh5IC0gb3kpIC8gcnkpO1xuXG4gICAgICAgIC8vIFF1aWNrIGJib3ggcmVqZWN0IGJlZm9yZSByYXN0ZXJpemluZy5cbiAgICAgICAgbGV0IG1pblggPSBJbmZpbml0eSwgbWF4WCA9IC1JbmZpbml0eSwgbWluWSA9IEluZmluaXR5LCBtYXhZID0gLUluZmluaXR5O1xuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHhzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgaWYgKHhzW2tdIDwgbWluWCkgbWluWCA9IHhzW2tdO1xuICAgICAgICAgIGlmICh4c1trXSA+IG1heFgpIG1heFggPSB4c1trXTtcbiAgICAgICAgICBpZiAoeXNba10gPCBtaW5ZKSBtaW5ZID0geXNba107XG4gICAgICAgICAgaWYgKHlzW2tdID4gbWF4WSkgbWF4WSA9IHlzW2tdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHd4MCA9IHRoaXMuc3Ryb2tlLmJ4LCB3eTAgPSB0aGlzLnN0cm9rZS5ieTtcbiAgICAgICAgY29uc3Qgd3gxID0gd3gwICsgdGhpcy5zdHJva2UuYncsIHd5MSA9IHd5MCArIHRoaXMuc3Ryb2tlLmJoO1xuICAgICAgICBpZiAobWF4WCA8IHd4MCB8fCBtaW5YID4gd3gxIHx8IG1heFkgPCB3eTAgfHwgbWluWSA+IHd5MSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgaG9sZXMgPSB0aGlzLmhvbGVzVG9NYXRyaXgodmVydHMuaG9sZXMsIG94LCBveSwgcngsIHJ5KTtcbiAgICAgICAgY29uc3QgcmFzdGVyID0gdGhpcy53YW5kU2VydmljZS5yYXN0ZXJpemVQb2x5Z29uKHhzLCB5cywgY2FjaGVkLndpZHRoLCBjYWNoZWQuaGVpZ2h0LCBob2xlcyk7XG4gICAgICAgIGlmICghcmFzdGVyKSBjb250aW51ZTtcbiAgICAgICAgaWYgKCFtYXNrc092ZXJsYXAodGhpcy5zdHJva2UsIHJhc3RlcikpIGNvbnRpbnVlO1xuXG4gICAgICAgIHRoaXMuc3Ryb2tlID0gdW5pb25NYXNrcyh0aGlzLnN0cm9rZSwgcmFzdGVyKTtcbiAgICAgICAgaWYgKHRoaXMuc3Ryb2tlUmVnaW9uSWQgPT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuc3Ryb2tlUmVnaW9uSWQgPSByZWdpb24uaWQgPz8gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZWdpb25zLnNwbGljZShpLCAxKTtcbiAgICAgICAgZGlkTWVyZ2UgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29tbWl0IHRoZSBzdHJva2UncyBjb25uZWN0ZWQgcGllY2VzIGFzIHJlZ2lvbnMg4oCUIHRoZSBsYXJnZXN0IGtlZXBzIHRoZVxuICAgKiBzdHJva2UncyByZWdpb24gaWRlbnRpdHksIGFkZGl0aW9uYWwgcGllY2VzIChmcm9tIGFuIGVyYXNlIHRoYXQgc3BsaXQgdGhlXG4gICAqIHJlZ2lvbikgYmVjb21lIHRoZWlyIG93biByZWdpb25zIHRyYWNrZWQgaW4gYHN0cm9rZUV4dHJhSWRzYCBzbyB0aGV5IGtlZXBcbiAgICogc3RhYmxlIGlkZW50aXRpZXMgYWNyb3NzIGRyYWcgdGlja3MuIFRoZSBzdG9yZSBtaW50cyBpZHMgb24gY29tbWl0LCB3aGljaFxuICAgKiB3ZSByZWFkIGJhY2sgc28gc3Vic2VxdWVudCB0aWNrcyByZXBsYWNlIHRoZSBzYW1lIHJlZ2lvbnMuXG4gICAqL1xuICBwcml2YXRlIGNvbW1pdENvbXBvbmVudHMoXG4gICAgcmVnaW9uczogUmVnaW9uW10sXG4gICAgY29tcG9uZW50czogeyB4UGxvdDogbnVtYmVyW107IHlQbG90OiBudW1iZXJbXTsgaG9sZXM/OiBudW1iZXJbXVtdW10gfVtdLFxuICApIHtcbiAgICBjb25zdCB2YWxpZCA9IGNvbXBvbmVudHMuZmlsdGVyKChjKSA9PiBjLnhQbG90Lmxlbmd0aCA+PSAzKTtcbiAgICBpZiAodmFsaWQubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBwcmV2RXh0cmFJZHMgPSB0aGlzLnN0cm9rZUV4dHJhSWRzO1xuICAgIC8vIERyb3AgcHJldmlvdXNseS10cmFja2VkIGV4dHJhcyB0aGF0IG5vIGxvbmdlciBoYXZlIGEgbWF0Y2hpbmcgcGllY2UgKHRoZVxuICAgIC8vIGNvbXBvbmVudCBjb3VudCBzaHJhbmssIGUuZy4gYW4gYWRkIHN0cm9rZSBicmlkZ2VkIGEgZ2FwKS5cbiAgICBjb25zdCByZXVzZUNvdW50ID0gTWF0aC5tYXgoMCwgdmFsaWQubGVuZ3RoIC0gMSk7XG4gICAgZm9yIChsZXQgayA9IHJldXNlQ291bnQ7IGsgPCBwcmV2RXh0cmFJZHMubGVuZ3RoOyBrKyspIHtcbiAgICAgIGNvbnN0IGlkeCA9IHJlZ2lvbnMuZmluZEluZGV4KChyKSA9PiByLmlkID09PSBwcmV2RXh0cmFJZHNba10pO1xuICAgICAgaWYgKGlkeCA+PSAwKSByZWdpb25zLnNwbGljZShpZHgsIDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHByaW1hcnkgPSB0aGlzLnVwc2VydENvbXBvbmVudChyZWdpb25zLCB0aGlzLnN0cm9rZVJlZ2lvbklkLCB2YWxpZFswXSk7XG4gICAgY29uc3QgZXh0cmFzOiBSZWdpb25bXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdmFsaWQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGV4dHJhcy5wdXNoKHRoaXMudXBzZXJ0Q29tcG9uZW50KHJlZ2lvbnMsIHByZXZFeHRyYUlkc1tpIC0gMV0gPz8gbnVsbCwgdmFsaWRbaV0pKTtcbiAgICB9XG5cbiAgICB0aGlzLmhvc3Quc2V0UmVnaW9ucyhyZWdpb25zKTtcbiAgICAvLyBJZHMgYXJlIG1pbnRlZCBkdXJpbmcgc2V0UmVnaW9ucyDigJQgcmVhZCB0aGVtIGJhY2sgZm9yIHRoZSBuZXh0IHRpY2suXG4gICAgdGhpcy5zdHJva2VSZWdpb25JZCA9IHByaW1hcnkuaWQgPz8gdGhpcy5zdHJva2VSZWdpb25JZDtcbiAgICB0aGlzLnN0cm9rZUV4dHJhSWRzID0gZXh0cmFzXG4gICAgICAubWFwKChyKSA9PiByLmlkKVxuICAgICAgLmZpbHRlcigoaWQpOiBpZCBpcyBudW1iZXIgPT4gaWQgIT0gbnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBSZWdpb24gZm9yIG9uZSBjb21wb25lbnQgYW5kIGluc2VydCBpdCBpbnRvIGByZWdpb25zYDogcmVwbGFjZSB0aGVcbiAgICogcmVnaW9uIHdpdGggYGlkYCBpbiBwbGFjZSBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSBhcHBlbmQgYSBuZXcgb25lLiBSZXR1cm5zXG4gICAqIHRoZSBSZWdpb24gaW5zdGFuY2UgKGl0cyBpZCBpcyBtaW50ZWQgbGF0ZXIgYnkgdGhlIHN0b3JlIHdoZW4gbmV3KS5cbiAgICovXG4gIHByaXZhdGUgdXBzZXJ0Q29tcG9uZW50KFxuICAgIHJlZ2lvbnM6IFJlZ2lvbltdLCBpZDogbnVtYmVyIHwgbnVsbCxcbiAgICBjOiB7IHhQbG90OiBudW1iZXJbXTsgeVBsb3Q6IG51bWJlcltdOyBob2xlcz86IG51bWJlcltdW11bXSB9LFxuICApOiBSZWdpb24ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gaWQgIT0gbnVsbCA/IHJlZ2lvbnMuZmluZCgocikgPT4gci5pZCA9PT0gaWQpIDogbnVsbDtcblxuICAgIGNvbnN0IHBvbHkgPSBuZXcgUG9seWdvbigpO1xuICAgIHBvbHkubnBvaW50cyA9IGMueFBsb3QubGVuZ3RoO1xuICAgIHBvbHkueHBvaW50cyA9IGMueFBsb3Q7XG4gICAgcG9seS55cG9pbnRzID0gYy55UGxvdDtcbiAgICBwb2x5LmNvb3JkaW5hdGVzID0gYy54UGxvdC5tYXAoKHgsIGkpID0+IFt4LCBjLnlQbG90W2ldXSk7XG4gICAgcG9seS5jbG9zZWQgPSB0cnVlO1xuICAgIGlmIChjLmhvbGVzICYmIGMuaG9sZXMubGVuZ3RoKSBwb2x5LmhvbGVzID0gYy5ob2xlcztcblxuICAgIGNvbnN0IHJlZ2lvbiA9IG5ldyBSZWdpb24oKTtcbiAgICByZWdpb24uYm91bmRzID0gcG9seTtcbiAgICBjb25zdCBwYWludCA9IHRoaXMucGFpbnRDbGFzcztcbiAgICByZWdpb24uY29sb3IgPSBwYWludD8uY29sb3IgPz8gdGhpcy5ob3N0LmdldFNoYXBlQ29sb3IoKTtcbiAgICAvLyBBbiBleHBsaWNpdCBjbGFzcyBjb2xvdXIgbXVzdCBzdXJ2aXZlIGEgcHJlc2V0IChyZSlhcHBseSwgbGlrZSBhIGNvbG91clxuICAgIC8vIHBpY2tlZCBpbiB0aGUgcmVnaW9uIGVkaXRvciAoaml0LXVpIzcwKS5cbiAgICBpZiAocGFpbnQ/LmNvbG9yICE9IG51bGwpIHJlZ2lvbi5jb2xvck92ZXJyaWRkZW4gPSB0cnVlO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgcmVnaW9uLmlkID0gZXhpc3RpbmcuaWQ7XG4gICAgICByZWdpb24ubmFtZSA9IGV4aXN0aW5nLm5hbWU7XG4gICAgfVxuICAgIC8vIERlZmF1bHQgY2xhc3MvYW5ub3RhdGlvbiBuYW1lLCBtYXRjaGluZyB0aGUgb3ZlcmxheS1kcmF3biByZWdpb25zIGFuZCB0aGVcbiAgICAvLyB3YW5kIHNvIGEgYnJ1c2ggcmVnaW9uIGlzbid0IGxlZnQgdW5sYWJlbGVkLlxuICAgIHJlZ2lvbi5sYWJlbCA9IGV4aXN0aW5nPy5sYWJlbCA/PyBwYWludD8ubGFiZWwgPz8gJ1JlZ2lvbic7XG5cbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIGNvbnN0IGlkeCA9IHJlZ2lvbnMuZmluZEluZGV4KChyKSA9PiByLmlkID09PSBpZCk7XG4gICAgICBpZiAoaWR4ID49IDApIHJlZ2lvbnNbaWR4XSA9IHJlZ2lvbjtcbiAgICAgIGVsc2UgcmVnaW9ucy5wdXNoKHJlZ2lvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlZ2lvbnMucHVzaChyZWdpb24pO1xuICAgIH1cbiAgICByZXR1cm4gcmVnaW9uO1xuICB9XG59XG4iXX0=
|