@jax-data-science/sci-image-visualizer 0.5.0 → 0.7.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 +28 -1
- package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
- package/esm2022/lib/contracts/ports/spatial-data.port.mjs +3 -1
- package/esm2022/lib/contracts/spatial-dataset.contract.mjs +3 -1
- package/esm2022/lib/contracts/toolbar-tool.contract.mjs +46 -4
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +195 -0
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +10 -2
- package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +1098 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +6 -3
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +186 -10
- package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +2 -2
- package/esm2022/lib/implementations/plotly/plotly.service.mjs +2 -3
- package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +120 -2
- package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +76 -1
- package/esm2022/lib/routing-visualizer.service.mjs +10 -1
- package/esm2022/lib/spatial/spatial-tiles.mjs +506 -0
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +659 -19
- 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 +3238 -84
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
- package/lib/contracts/display-types.d.ts +104 -1
- package/lib/contracts/plot-type-contribution.contract.d.ts +27 -0
- package/lib/contracts/ports/spatial-data.port.d.ts +59 -1
- package/lib/contracts/spatial-dataset.contract.d.ts +167 -0
- package/lib/contracts/toolbar-tool.contract.d.ts +84 -5
- package/lib/contracts/visualizer.contract.d.ts +22 -1
- package/lib/implementations/napari-js/napari-navigator.d.ts +72 -0
- package/lib/implementations/napari-js/napari-region-overlay.d.ts +3 -0
- package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +240 -0
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +42 -2
- package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +26 -2
- package/lib/implementations/spatial-data-http/spatial-wire.d.ts +34 -1
- package/lib/spatial/spatial-tiles.d.ts +222 -0
- package/lib/spatial-controls/spatial-controls.component.d.ts +234 -3
- 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
|
@@ -16,6 +16,9 @@ import { defaultSigma, densityGrid, rasterizeDensity } from '../../spatial/spati
|
|
|
16
16
|
import { observationsInSection, sectionsOf } from '../../spatial/spatial-sections';
|
|
17
17
|
import { hoverText, nearestObservation } from '../../spatial/spatial-hover';
|
|
18
18
|
import { NapariSpatialTooltip } from './napari-spatial-tooltip';
|
|
19
|
+
import { NapariSpatialTileLayers } from './napari-spatial-tiles';
|
|
20
|
+
import { NapariNavigator } from './napari-navigator';
|
|
21
|
+
import { cellTypeColumnFor } from '../../spatial/spatial-tiles';
|
|
19
22
|
import { NAPARI_WHEEL_ZOOM_SPEED } from './napari-zoom';
|
|
20
23
|
import { colorExpressionField, encodeExpressionVolume, expressionField, expressionVolume, } from '../../spatial/spatial-expression';
|
|
21
24
|
import { PlotType, PLOT_TYPE_DESCRIPTORS, isNapari3d, isNapariIsosurface, isNapariSurface, isNapariScatter, isNapariScatter3d, isSpatialOmics, isSpatialOmics3d, NAPARI_DEFAULT_DECIMATE, } from '../../contracts/plot-type';
|
|
@@ -295,6 +298,12 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
295
298
|
/** Dataset the 3D scale bar was built for. */
|
|
296
299
|
this.spatialScaleBarKey = null;
|
|
297
300
|
this.spatialSub = null;
|
|
301
|
+
/** Level-of-detail cell outlines, transcripts and density over the 2D view — created on
|
|
302
|
+
* first use, and only when a spatial port is bound. */
|
|
303
|
+
this.spatialTilesMgr = null;
|
|
304
|
+
/** For the panel: the transcripts-in-view estimate and the density window in use. */
|
|
305
|
+
this.transcriptEstimate$ = new BehaviorSubject(null);
|
|
306
|
+
this.densityStats$ = new BehaviorSubject(null);
|
|
298
307
|
/** Latest (dataset, view, selection) the spatial subscription saw, so a slice
|
|
299
308
|
* change can rebuild the markers for the new plane. */
|
|
300
309
|
this.spatialLatest = null;
|
|
@@ -352,6 +361,12 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
352
361
|
this.invertEnabled = false;
|
|
353
362
|
/** Physical scale bar overlay for the 2D image (null when 3D or the image has no µm/pixel). */
|
|
354
363
|
this.scaleBar = null;
|
|
364
|
+
/** Overview minimap (bottom-right), as OSD's navigator. */
|
|
365
|
+
this.navigator = null;
|
|
366
|
+
/** Whether the navigator is shown — the same host setting OSD's navigator honours. */
|
|
367
|
+
this.navigatorVisible = true;
|
|
368
|
+
/** Bumped per thumbnail request, so a slow one cannot overwrite a newer slice's. */
|
|
369
|
+
this.navigatorToken = 0;
|
|
355
370
|
/** SVG region-drawing overlay for the 2D image (null until a 2D image is plotted). */
|
|
356
371
|
this.regionOverlay = null;
|
|
357
372
|
/** Pixel-tool plumbing: the plot div id, coord transform, and bound tool hosts. */
|
|
@@ -681,6 +696,7 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
681
696
|
this.fitCameraSoon();
|
|
682
697
|
this.subscribeDisplayState();
|
|
683
698
|
this.installScaleBar();
|
|
699
|
+
this.installNavigator(z);
|
|
684
700
|
this.install2dInteraction(viewer, host);
|
|
685
701
|
}
|
|
686
702
|
this.scheduleReadback();
|
|
@@ -1090,6 +1106,52 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
1090
1106
|
this.scaleBar = new NapariScaleBar(this.host, this.viewer.camera, mppX);
|
|
1091
1107
|
}
|
|
1092
1108
|
}
|
|
1109
|
+
/**
|
|
1110
|
+
* The overview navigator for a 2D view with an image: a coarse thumbnail of the whole
|
|
1111
|
+
* image with the viewport on it; click or drag to pan at the current zoom (as OSD).
|
|
1112
|
+
*/
|
|
1113
|
+
installNavigator(z) {
|
|
1114
|
+
this.navigator?.destroy();
|
|
1115
|
+
this.navigator = null;
|
|
1116
|
+
if (!this.viewer || !this.host || !this.imageW || !this.imageH)
|
|
1117
|
+
return;
|
|
1118
|
+
this.navigator = new NapariNavigator(this.host, this.viewer.camera, this.imageW, this.imageH, () => this.spatialTooltip?.hide());
|
|
1119
|
+
this.navigator.setVisible(this.navigatorVisible);
|
|
1120
|
+
void this.refreshNavigatorImage(z);
|
|
1121
|
+
}
|
|
1122
|
+
/**
|
|
1123
|
+
* Draw the navigator's thumbnail from the coarsest pyramid level. A multichannel image
|
|
1124
|
+
* is composited from its channels in their display colours, so the overview looks like
|
|
1125
|
+
* the view rather than like channel 0 in grey.
|
|
1126
|
+
*/
|
|
1127
|
+
async refreshNavigatorImage(z) {
|
|
1128
|
+
const nav = this.navigator;
|
|
1129
|
+
if (!nav)
|
|
1130
|
+
return;
|
|
1131
|
+
const token = ++this.navigatorToken;
|
|
1132
|
+
try {
|
|
1133
|
+
const desc = await this.ensureDescriptor();
|
|
1134
|
+
const channels = desc?.multichannel ? desc.channelInfo ?? [] : [];
|
|
1135
|
+
let image;
|
|
1136
|
+
if (channels.length > 1) {
|
|
1137
|
+
const bitmaps = await Promise.all(channels.map((_c, c) => this.fetchSlice(z, c, 1)));
|
|
1138
|
+
image = tintedComposite(bitmaps, channels.map((c) => c.color ?? '#ffffff'));
|
|
1139
|
+
}
|
|
1140
|
+
else {
|
|
1141
|
+
image = await this.fetchSlice(z, undefined, 1);
|
|
1142
|
+
}
|
|
1143
|
+
if (token === this.navigatorToken && this.navigator === nav)
|
|
1144
|
+
nav.setImage(image);
|
|
1145
|
+
}
|
|
1146
|
+
catch (err) {
|
|
1147
|
+
console.warn('[napari-js] navigator thumbnail unavailable', err);
|
|
1148
|
+
}
|
|
1149
|
+
}
|
|
1150
|
+
/** Show/hide the overview navigator (same setting as OSD's). */
|
|
1151
|
+
setNavigatorVisible(visible) {
|
|
1152
|
+
this.navigatorVisible = visible;
|
|
1153
|
+
this.navigator?.setVisible(visible);
|
|
1154
|
+
}
|
|
1093
1155
|
/** Convert a napari-js `Histogram` (bin count + min/max) to the pane's `IHistogram` (bin edges). */
|
|
1094
1156
|
toIHistogram(h) {
|
|
1095
1157
|
const span = h.max - h.min || 1;
|
|
@@ -1411,6 +1473,7 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
1411
1473
|
this.fitCameraSoon();
|
|
1412
1474
|
this.subscribeDisplayState();
|
|
1413
1475
|
this.installScaleBar();
|
|
1476
|
+
this.installNavigator(z);
|
|
1414
1477
|
// This mode plots REGION centroids, so without the region tools there is no
|
|
1415
1478
|
// way to produce a point — drawing a region now adds one immediately.
|
|
1416
1479
|
this.install2dInteraction(viewer, host);
|
|
@@ -1530,11 +1593,47 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
1530
1593
|
this.fitCameraSoon();
|
|
1531
1594
|
this.subscribeDisplayState();
|
|
1532
1595
|
this.installScaleBar();
|
|
1596
|
+
this.installNavigator(z);
|
|
1533
1597
|
this.install2dInteraction(viewer, host);
|
|
1534
1598
|
this.installSpatialHover(host);
|
|
1599
|
+
this.spatialTiles()?.attach(viewer);
|
|
1535
1600
|
this.subscribeSpatial();
|
|
1536
1601
|
this.scheduleReadback();
|
|
1537
1602
|
}
|
|
1603
|
+
/**
|
|
1604
|
+
* Whether the 2D observation markers are drawn: when the user wants them, and not while
|
|
1605
|
+
* cell outlines are on screen — then a cell IS its outline, and a circle on top of it is
|
|
1606
|
+
* noise. Zoomed out past the outline threshold, the circles stand in for the cells.
|
|
1607
|
+
*/
|
|
1608
|
+
spatialPointsVisible() {
|
|
1609
|
+
const view = this.spatialLatest?.[1];
|
|
1610
|
+
return (view?.showPoints ?? true) && !this.spatialTilesMgr?.outlinesShown;
|
|
1611
|
+
}
|
|
1612
|
+
/**
|
|
1613
|
+
* The tiled-geometry manager, built on first use. Its host callbacks read this
|
|
1614
|
+
* service's live state, so it never holds a stale dataset or colormap.
|
|
1615
|
+
*/
|
|
1616
|
+
spatialTiles() {
|
|
1617
|
+
const port = this.spatialData;
|
|
1618
|
+
if (!port)
|
|
1619
|
+
return null;
|
|
1620
|
+
this.spatialTilesMgr ??= new NapariSpatialTileLayers(port, {
|
|
1621
|
+
latest: () => this.spatialLatest,
|
|
1622
|
+
canvasSize: () => [this.canvas?.clientWidth ?? 0, this.canvas?.clientHeight ?? 0],
|
|
1623
|
+
continuousLut: (view) => {
|
|
1624
|
+
const node = this.currentColormap;
|
|
1625
|
+
return spatialContinuousLut(node?.data?.value, this.currentReverse, view.continuousColormap);
|
|
1626
|
+
},
|
|
1627
|
+
estimateChanged: (e) => this.transcriptEstimate$.next(e),
|
|
1628
|
+
densityChanged: (d) => this.densityStats$.next(d),
|
|
1629
|
+
polygonsShownChanged: () => {
|
|
1630
|
+
if (this.spatialPoints)
|
|
1631
|
+
this.spatialPoints.visible = this.spatialPointsVisible();
|
|
1632
|
+
this.viewer?.requestRender();
|
|
1633
|
+
},
|
|
1634
|
+
});
|
|
1635
|
+
return this.spatialTilesMgr;
|
|
1636
|
+
}
|
|
1538
1637
|
/**
|
|
1539
1638
|
* Region drawing for the 3D cloud.
|
|
1540
1639
|
*
|
|
@@ -1680,12 +1779,30 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
1680
1779
|
const dataset = this.spatialLatest?.[0];
|
|
1681
1780
|
if (!tip || !pointer || !dataset)
|
|
1682
1781
|
return;
|
|
1782
|
+
const is3d = isSpatialOmics3d(this.currentPlotType);
|
|
1783
|
+
// Transcript markers sit on top of everything, so they are asked first.
|
|
1784
|
+
if (!is3d && this.spatialTilesMgr && this.viewer) {
|
|
1785
|
+
const world = this.viewer.canvasToWorld(pointer.clientX, pointer.clientY);
|
|
1786
|
+
const zoom = this.viewer.camera.zoom;
|
|
1787
|
+
const radius = NapariVisualizerService.HOVER_RADIUS_PX / (zoom > 0 ? zoom : 1);
|
|
1788
|
+
const lines = world ? this.spatialTilesMgr.hoverAt(world[0], world[1], radius, (details) => {
|
|
1789
|
+
const p = this.hoverPointer;
|
|
1790
|
+
if (!p || !this.spatialTooltip)
|
|
1791
|
+
return;
|
|
1792
|
+
const r = host.getBoundingClientRect();
|
|
1793
|
+
this.spatialTooltip.show(details, p.clientX - r.left, p.clientY - r.top);
|
|
1794
|
+
}) : null;
|
|
1795
|
+
if (lines) {
|
|
1796
|
+
const rect = host.getBoundingClientRect();
|
|
1797
|
+
tip.show(lines, pointer.clientX - rect.left, pointer.clientY - rect.top);
|
|
1798
|
+
return;
|
|
1799
|
+
}
|
|
1800
|
+
}
|
|
1683
1801
|
const positions = this.hoverPositionsFor(dataset.observations);
|
|
1684
1802
|
if (!positions) {
|
|
1685
1803
|
tip.hide();
|
|
1686
1804
|
return;
|
|
1687
1805
|
}
|
|
1688
|
-
const is3d = isSpatialOmics3d(this.currentPlotType);
|
|
1689
1806
|
// 3D compares screen pixels directly; 2D holds world positions, so the radius
|
|
1690
1807
|
// is converted once instead of projecting the whole cloud.
|
|
1691
1808
|
const zoom = is3d ? 1 : (this.viewer?.camera.zoom ?? 1);
|
|
@@ -1991,6 +2108,8 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
1991
2108
|
void (isSpatialOmics3d(this.currentPlotType)
|
|
1992
2109
|
? this.rebuildSpatialPoints3d(dataset, view, selection)
|
|
1993
2110
|
: this.rebuildSpatialPoints(dataset, view, selection));
|
|
2111
|
+
if (!isSpatialOmics3d(this.currentPlotType))
|
|
2112
|
+
this.spatialTilesMgr?.refresh();
|
|
1994
2113
|
});
|
|
1995
2114
|
}
|
|
1996
2115
|
/** (Re)build the observation marker layer for the current dataset + view state. */
|
|
@@ -2063,7 +2182,10 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
2063
2182
|
const key = `${dataset.id}:${obs.count}:${slab?.slice ?? ''}`;
|
|
2064
2183
|
if (this.spatialPoints && key === this.spatialLayerKey) {
|
|
2065
2184
|
this.spatialPoints.size = size;
|
|
2185
|
+
this.spatialPoints.visible = this.spatialPointsVisible();
|
|
2066
2186
|
this.spatialPoints.faceColor = this.gatherColors(faceColor, slab?.indices);
|
|
2187
|
+
this.hideForeignImage(viewer, (!!ref || !!dataset.volume) && view.showImage !== false);
|
|
2188
|
+
this.regionOverlay?.setRegionsVisible(view.showAnnotations !== false);
|
|
2067
2189
|
viewer.requestRender();
|
|
2068
2190
|
return;
|
|
2069
2191
|
}
|
|
@@ -2094,9 +2216,13 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
2094
2216
|
// the coordinates are already in the image's pixel space.
|
|
2095
2217
|
scale: ref?.scale ?? [1, 1],
|
|
2096
2218
|
translate: ref?.translate ?? [0, 0],
|
|
2219
|
+
visible: this.spatialPointsVisible(),
|
|
2097
2220
|
});
|
|
2221
|
+
// Outlines, density and transcripts go back over the markers just added.
|
|
2222
|
+
this.spatialTilesMgr?.afterObservations();
|
|
2098
2223
|
this.frameSpatialPointsOnce(viewer, dataset.id, positions, !!ref);
|
|
2099
|
-
this.hideForeignImage(viewer, !!ref || !!dataset.volume);
|
|
2224
|
+
this.hideForeignImage(viewer, (!!ref || !!dataset.volume) && view.showImage !== false);
|
|
2225
|
+
this.regionOverlay?.setRegionsVisible(view.showAnnotations !== false);
|
|
2100
2226
|
this.setRegionGridFor(dataset, positions);
|
|
2101
2227
|
}
|
|
2102
2228
|
/**
|
|
@@ -2175,9 +2301,15 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
2175
2301
|
* and nothing else.
|
|
2176
2302
|
*/
|
|
2177
2303
|
hideForeignImage(viewer, datasetHasPixels) {
|
|
2304
|
+
// No image of its own → nothing for an overview to show either.
|
|
2305
|
+
this.navigator?.setVisible(datasetHasPixels && this.navigatorVisible);
|
|
2178
2306
|
for (const layer of viewer.layers.items) {
|
|
2179
2307
|
if (layer.kind !== 'image')
|
|
2180
2308
|
continue;
|
|
2309
|
+
// The transcript-density raster is an image layer too, but it is data, not the
|
|
2310
|
+
// tissue: the Images toggle must not take it down with the slide.
|
|
2311
|
+
if (this.spatialTilesMgr?.owns(layer))
|
|
2312
|
+
continue;
|
|
2181
2313
|
// Re-shown when a dataset that owns an image comes back, so switching between
|
|
2182
2314
|
// datasets does not leave the tissue permanently hidden.
|
|
2183
2315
|
layer.visible = datasetHasPixels;
|
|
@@ -2394,6 +2526,8 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
2394
2526
|
installSpatial3dScaleBar(viewer, dataset) {
|
|
2395
2527
|
this.scaleBar?.destroy();
|
|
2396
2528
|
this.scaleBar = null;
|
|
2529
|
+
this.navigator?.destroy();
|
|
2530
|
+
this.navigator = null;
|
|
2397
2531
|
const micronsPerUnit = dataset?.micronsPerUnit;
|
|
2398
2532
|
if (!this.host || !micronsPerUnit || micronsPerUnit <= 0)
|
|
2399
2533
|
return;
|
|
@@ -3085,11 +3219,24 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
3085
3219
|
if (colorBy.kind === 'column') {
|
|
3086
3220
|
const column = await port.getColumn(colorBy.name);
|
|
3087
3221
|
if (isCategoricalColumn(column)) {
|
|
3088
|
-
|
|
3222
|
+
const rgba = encodeCategorical(column.codes, {
|
|
3089
3223
|
colors: resolveCategoryColors(column.meta),
|
|
3090
3224
|
opacity: view.opacity,
|
|
3091
3225
|
muted,
|
|
3092
|
-
})
|
|
3226
|
+
});
|
|
3227
|
+
// Groups switched off in the Cells panel hide their dots too, when the dots are
|
|
3228
|
+
// coloured by that same grouping.
|
|
3229
|
+
const groupColumn = cellTypeColumnFor(dataset, view);
|
|
3230
|
+
if (view.hiddenGroups?.length && groupColumn === colorBy.name) {
|
|
3231
|
+
const off = new Set(view.hiddenGroups);
|
|
3232
|
+
const hide = column.meta.categories.map((c) => off.has(c));
|
|
3233
|
+
for (let i = 0; i < column.codes.length; i++) {
|
|
3234
|
+
const c = column.codes[i];
|
|
3235
|
+
if (c !== NO_CATEGORY && hide[c])
|
|
3236
|
+
rgba[4 * i + 3] = 0;
|
|
3237
|
+
}
|
|
3238
|
+
}
|
|
3239
|
+
return toRgbaTuples(rgba);
|
|
3093
3240
|
}
|
|
3094
3241
|
// A continuous column may carry its own log hint (counts); the view's
|
|
3095
3242
|
// toggle wins once the user has set it.
|
|
@@ -3480,6 +3627,8 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
3480
3627
|
this.displaySub = null;
|
|
3481
3628
|
this.scaleBar?.destroy();
|
|
3482
3629
|
this.scaleBar = null;
|
|
3630
|
+
this.navigator?.destroy();
|
|
3631
|
+
this.navigator = null;
|
|
3483
3632
|
this.regionOverlay?.destroy();
|
|
3484
3633
|
this.regionOverlay = null;
|
|
3485
3634
|
this.axesLabels?.destroy();
|
|
@@ -3500,6 +3649,7 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
3500
3649
|
this.cameraReadbackOff?.();
|
|
3501
3650
|
this.cameraReadbackOff = null;
|
|
3502
3651
|
this.channelView = null;
|
|
3652
|
+
this.spatialTilesMgr?.detach();
|
|
3503
3653
|
this.viewer?.dispose();
|
|
3504
3654
|
this.viewer = null;
|
|
3505
3655
|
if (this.canvas && this.host?.contains(this.canvas))
|
|
@@ -3564,9 +3714,6 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
3564
3714
|
// drawing is owned by the region overlay's setMode (setControlsEnabled). Toggling controls here
|
|
3565
3715
|
// would fight that — the host calls setDragMode(false) alongside overlay.setMode(<tool>).
|
|
3566
3716
|
}
|
|
3567
|
-
setNavigatorVisible(_visible) {
|
|
3568
|
-
/* napari-js has no minimap; no-op */
|
|
3569
|
-
}
|
|
3570
3717
|
setImageSmoothingEnabled(enabled) {
|
|
3571
3718
|
this.imageSmoothing = enabled;
|
|
3572
3719
|
// Apply live to the rendered image layers; baked into the next render too.
|
|
@@ -3581,6 +3728,8 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
3581
3728
|
const v = this.viewer;
|
|
3582
3729
|
if (!v)
|
|
3583
3730
|
return;
|
|
3731
|
+
if (this.navigator)
|
|
3732
|
+
void this.refreshNavigatorImage(zIndex);
|
|
3584
3733
|
// Surface: one slice → one mesh, so re-build the height field for the new slice.
|
|
3585
3734
|
if (this.surfaceLayer) {
|
|
3586
3735
|
void this.buildSurface(v, zIndex).catch((err) => console.error('[napari-js] setZIndex surface failed:', err));
|
|
@@ -3902,8 +4051,7 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
3902
4051
|
this.brushTool.setMode(true, (options ?? {}));
|
|
3903
4052
|
}
|
|
3904
4053
|
setBrushOptions(options) {
|
|
3905
|
-
|
|
3906
|
-
this.brushTool.setSize(options.size);
|
|
4054
|
+
this.brushTool.setOptions(options ?? {});
|
|
3907
4055
|
}
|
|
3908
4056
|
setVertexEraserMode(active) {
|
|
3909
4057
|
if (!this.viewer)
|
|
@@ -4190,4 +4338,32 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
|
|
|
4190
4338
|
type: Inject,
|
|
4191
4339
|
args: [SPATIAL_DATA_PORT]
|
|
4192
4340
|
}] }, { type: i11.SpatialSelectionStore }] });
|
|
4193
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXZpc3VhbGl6ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL25hcGFyaS1qcy9uYXBhcmktdmlzdWFsaXplci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQ08sZUFBZSxFQUFFLE9BQU8sRUFBZ0IsYUFBYSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQzVFLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEVBQ0wsTUFBTSxFQUNOLGVBQWUsRUFDZixlQUFlLEVBQ2YsWUFBWSxFQUNaLGVBQWUsRUFDZixXQUFXLEVBQ1gsUUFBUSxFQUNSLHFCQUFxQixFQUNyQixzQkFBc0IsR0FDdkIsTUFBTSxXQUFXLENBQUM7QUFnQm5CLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxXQUFXLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFJeEYsT0FBTyxFQUFFLGdCQUFnQixFQUFPLE1BQU0sOEJBQThCLENBQUM7QUFDckUsT0FBTyxFQUFFLGlCQUFpQixFQUFtQixNQUFNLHlDQUF5QyxDQUFDO0FBQzdGLE9BQU8sRUFDMkMsY0FBYyxFQUFFLG1CQUFtQixHQUNwRixNQUFNLDBDQUEwQyxDQUFDO0FBRWxELE9BQU8sRUFDTCxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUNwRSxxQkFBcUIsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxxQkFBcUIsRUFDbkYseUJBQXlCLEVBQUUsb0JBQW9CLEdBQ2hELE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBDQUEw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QUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5RCxNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQztRQUNyQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDeEMsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBQUUsU0FBUyxDQUFDLDJCQUEyQjtZQUM1RCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdkQsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNyRixDQUFDO0lBQ0Qs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QWhwSVUsdUJBQXVCLGtCQXFPeEIsZ0JBQWdCLHdUQVVKLGNBQWMsc0VBRTFCLFVBQVUsYUFHRSxpQkFBaUI7a0hBcFA1Qix1QkFBdUIsY0FEVixNQUFNOzsyRkFDbkIsdUJBQXVCO2tCQURuQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTs7MEJBc083QixNQUFNOzJCQUFDLGdCQUFnQjs7MEJBVXZCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsY0FBYzs7MEJBRWpDLE1BQU07MkJBQUMsVUFBVTs7MEJBR2pCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgT2JzZXJ2YWJsZSwgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGNvbWJpbmVMYXRlc3QsIGZyb20sIG9mLCBmaXJzdFZhbHVlRnJvbSxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJ2ltYWdlLWpzJztcbmltcG9ydCB7IHNhdmVBcyB9IGZyb20gJ2ZpbGUtc2F2ZXInO1xuaW1wb3J0IHtcbiAgVmlld2VyLFxuICBoaXN0b2dyYW1TY2FsYXIsXG4gIGNvbG9ybWFwRnJvbUx1dCxcbiAgdGludENvbG9ybWFwLFxuICByZXZlcnNlQ29sb3JtYXAsXG4gIGhlaWdodEZpZWxkLFxuICBMVVRfU0laRSxcbiAgTXVsdGlDaGFubmVsSW1hZ2VWaWV3LFxuICBNdWx0aUNoYW5uZWxWb2x1bWVWaWV3LFxufSBmcm9tICduYXBhcmktanMnO1xuaW1wb3J0IHR5cGUge1xuICBBeGVzTGF5ZXIsXG4gIEltYWdlTGF5ZXIsXG4gIFN1cmZhY2VMYXllcixcbiAgVm9sdW1lTGF5ZXIsXG4gIFBvaW50c0xheWVyLFxuICBQb2ludHMzRExheWVyLFxuICBUaWxlZFNvdXJjZSxcbiAgVGlsZUtleSxcbiAgUGl4ZWxDaHVuayxcbiAgQ2hhbm5lbFZpZXcsXG4gIFZvbHVtZUNoYW5uZWwsXG4gIENvbG9ybWFwLFxuICBQcm9qZWN0ZWRQb2ludHMsXG59IGZyb20gJ25hcGFyaS1qcyc7XG5pbXBvcnQgeyBuZWFyZXN0UHJvamVjdGVkSW5kZXgsIFNjcmVlbkluZGV4LCBTQ1JFRU5fSU5ERVhfTUlOX1BPSU5UUyB9IGZyb20gJ25hcGFyaS1qcyc7XG5cbmltcG9ydCB7IElJbWFnZUluZm8gfSBmcm9tICcuLi8uLi9jb250cmFjdHMvaW1hZ2UuY29udHJhY3QnO1xuaW1wb3J0IHsgSUNoYW5uZWxTdGF0ZSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jaGFubmVsLWhpc3RvZ3JhbS1hcGkuY29udHJhY3QnO1xuaW1wb3J0IHsgYnVpbGRDb2xvcm1hcEx1dCwgUmdiIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NvbG9ybWFwLWx1dCc7XG5pbXBvcnQgeyBTUEFUSUFMX0RBVEFfUE9SVCwgU3BhdGlhbERhdGFQb3J0IH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3BvcnRzL3NwYXRpYWwtZGF0YS5wb3J0JztcbmltcG9ydCB7XG4gIFNwYXRpYWxDb2x1bW4sIFNwYXRpYWxEYXRhc2V0LCBTcGF0aWFsSW1hZ2VSZWYsIGZpbmRDb2x1bW5NZXRhLCBpc0NhdGVnb3JpY2FsQ29sdW1uLFxufSBmcm9tICcuLi8uLi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0JztcbmltcG9ydCB7IFNwYXRpYWxWaWV3U3RhdGUgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQge1xuICBjb250cmFzdFdpbmRvdywgZW5jb2RlQ2F0ZWdvcmljYWwsIGVuY29kZUNvbnRpbnVvdXMsIG1hcmtlckRpYW1ldGVycyxcbiAgcmVzb2x2ZUNhdGVnb3J5Q29sb3JzLCB0b1JnYmFUdXBsZXMsIHBhcnNlSGV4LCBNSVNTSU5HX0NPTE9SLCBERUZBVUxUX01VVEVEX09QQUNJVFksXG4gIFNQQVRJQUxfM0RfTUFYX0NBVEVHT1JJRVMsIHNwYXRpYWxDb250aW51b3VzTHV0LFxufSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtZW5jb2RpbmcnO1xuaW1wb3J0IHsgTk9fQ0FURUdPUlkgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0JztcbmltcG9ydCB7IFNwYXRpYWxPYnNlcnZhdGlvbnMgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0JztcbmltcG9ydCB7XG4gIFNwYXRpYWxTZWxlY3Rpb25NYXNrLCBlbXB0eVNlbGVjdGlvbiwgbWFza1RvSW5kaWNlcywgbXV0ZWRGcm9tU2VsZWN0aW9uLCBzYW1lU2VsZWN0aW9uLFxuICBzZWxlY3RCeUNhdGVnb3J5LFxufSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtc2VsZWN0aW9uJztcbmltcG9ydCB7IGZyYW1lUG9zaXRpb25zIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLWZyYW1pbmcnO1xuaW1wb3J0IHsgUElYRUxfV09STERfUVVBTlRVTSwgd29ybGRRdWFudHVtRm9yRXh0ZW50IH0gZnJvbSAnLi4vLi4vc3BhdGlhbC93b3JsZC1ncmlkJztcbmltcG9ydCB7IG9ic2VydmF0aW9uc0luU2xpY2UsIHZvbHVtZUltYWdlUmVmIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLXZvbHVtZS1pbWFnZSc7XG5pbXBvcnQgeyBkZWZhdWx0U2lnbWEsIGRlbnNpdHlHcmlkLCByYXN0ZXJpemVEZW5zaXR5IH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLWRlbnNpdHknO1xuaW1wb3J0IHsgb2JzZXJ2YXRpb25zSW5TZWN0aW9uLCBzZWN0aW9uc09mIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLXNlY3Rpb25zJztcbmltcG9ydCB7IHR5cGUgSG92ZXJTb3VyY2UsIGhvdmVyVGV4dCwgbmVhcmVzdE9ic2VydmF0aW9uIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLWhvdmVyJztcbmltcG9ydCB7IE5hcGFyaVNwYXRpYWxUb29sdGlwIH0gZnJvbSAnLi9uYXBhcmktc3BhdGlhbC10b29sdGlwJztcbmltcG9ydCB7IE5BUEFSSV9XSEVFTF9aT09NX1NQRUVEIH0gZnJvbSAnLi9uYXBhcmktem9vbSc7XG5cbi8qKlxuICogQSBzaG9ydCwgc3RhYmxlIGlkIGZvciBhIGNvbG9ybWFwIHZhbHVlLCBmb3IgY2FjaGUga2V5cy5cbiAqXG4gKiBIYWxmIHRoZSBsaWJyYXJ5J3MgY29sb3JtYXBzIGFyZSBOQU1FUyBhbmQgaGFsZiBhcmUgaW5saW5lIGBbc3RvcCwgY29sb3VyXWBcbiAqIGFycmF5cyBvZiAyNTYgZW50cmllcy4gU3RyaW5naWZ5aW5nIHRoZSBhcnJheSBraW5kIHdvdWxkIHB1dCA2IEtCIGluIGEga2V5IHRoYXRcbiAqIGlzIHJlYnVpbHQgYW5kIGNvbXBhcmVkIG9uIGV2ZXJ5IHZpZXcgY2hhbmdlOyBoYXNoaW5nIGl0IGtlZXBzIHRoZSBrZXkgc21hbGwsXG4gKiBhbmQgaXQgb25seSBoYXMgdG8gZGlzdGluZ3Vpc2ggb25lIGNvbG9ybWFwIGZyb20gYW5vdGhlci5cbiAqL1xuZnVuY3Rpb24gY29sb3JtYXBJZCh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gJyc7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gdmFsdWU7XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiAnPyc7XG4gIC8vIEZOVi0xYSBvdmVyIHRoZSBzdG9wcy4gQSBjb2xsaXNpb24gd291bGQgbGVhdmUgYSBzdGFsZSBjb2xvdXJpbmcgb24gc2NyZWVuLFxuICAvLyBub3QgY29ycnVwdCBhbnl0aGluZywgYW5kIDMyIGJpdHMgb3ZlciBhIGZldyBodW5kcmVkIGNvbG9ybWFwcyB3aWxsIG5vdC5cbiAgbGV0IGhhc2ggPSAweDgxMWM5ZGM1O1xuICBjb25zdCB0ZXh0ID0gdmFsdWUubWFwKChzdG9wKSA9PiBTdHJpbmcoc3RvcCkpLmpvaW4oJywnKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgaGFzaCBePSB0ZXh0LmNoYXJDb2RlQXQoaSk7XG4gICAgaGFzaCA9IE1hdGguaW11bChoYXNoLCAweDAxMDAwMTkzKTtcbiAgfVxuICByZXR1cm4gYCMkeyhoYXNoID4+PiAwKS50b1N0cmluZygzNil9YDtcbn1cblxuLyoqXG4gKiBJbi1wbGFuZSBjb2Fyc2VuaW5nIG9mIHRoZSAzRCBnZW5lIG1hcCdzIGxhdHRpY2UsIHJlbGF0aXZlIHRvIHRoZSByZWZlcmVuY2VcbiAqIHZvbHVtZS4gVGhlIGZpZWxkIGlzIHNtb290aCwgc28gaXRzIGRldGFpbCBpcyBzZXQgYnkgdGhlIGtlcm5lbCByYXRoZXIgdGhhbiB0aGVcbiAqIHJhc3RlciDigJQgYW5kIHRoZSBlc3RpbWF0ZSBpcyBhIHBhaXIgb2Ygc2VwYXJhYmxlIGJsdXJzIG9uIHRoZSBtYWluIHRocmVhZCwgd2hpY2hcbiAqIGF0IHRoZSB0ZW1wbGF0ZSdzIGZ1bGwgcmVzb2x1dGlvbiBtZWFucyBzZWNvbmRzIG9mIGZyb3plbiBVSSBwZXIgdG9nZ2xlLlxuICovXG5jb25zdCBHRU5FX01BUF9WT0xVTUVfU1RSSURFID0gMjtcbmltcG9ydCB7XG4gIHR5cGUgRXhwcmVzc2lvbkZpZWxkLCB0eXBlIEV4cHJlc3Npb25Wb2x1bWVGaWVsZCwgY29sb3JFeHByZXNzaW9uRmllbGQsXG4gIGVuY29kZUV4cHJlc3Npb25Wb2x1bWUsIGV4cHJlc3Npb25GaWVsZCwgZXhwcmVzc2lvblZvbHVtZSxcbn0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLWV4cHJlc3Npb24nO1xuaW1wb3J0IHsgU3BhdGlhbFNlbGVjdGlvblN0b3JlIH0gZnJvbSAnLi4vLi4vc3RvcmUvc3BhdGlhbC1zZWxlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQge1xuICBQbG90VHlwZSxcbiAgUGxvdFR5cGVEZXNjcmlwdG9yLFxuICBQTE9UX1RZUEVfREVTQ1JJUFRPUlMsXG4gIGlzTmFwYXJpM2QsXG4gIGlzTmFwYXJpSXNvc3VyZmFjZSxcbiAgaXNOYXBhcmlTdXJmYWNlLFxuICBpc05hcGFyaVNjYXR0ZXIsXG4gIGlzTmFwYXJpU2NhdHRlcjNkLFxuICBpc1NwYXRpYWxPbWljcyxcbiAgaXNTcGF0aWFsT21pY3MzZCxcbiAgTkFQQVJJX0RFRkFVTFRfREVDSU1BVEUsXG59IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9wbG90LXR5cGUnO1xuaW1wb3J0IHtcbiAgSVZpc3VhbGl6ZXIsXG4gIFBpeGVsRGF0YSxcbiAgSW50ZW5zaXR5UHJvZmlsZSxcbiAgSUlzb3N1cmZhY2VDb250cm9scyxcbiAgSUludGVuc2l0eUNvbnRyb2xzLFxuICBJU3VyZmFjZTNkQ29udHJvbHMsXG59IGZyb20gJy4uLy4uL2NvbnRyYWN0cy92aXN1YWxpemVyLmNvbnRyYWN0JztcbmltcG9ydCB7XG4gIFZpZXdlckNhcGFiaWxpdGllcyxcbiAgVmlld2VyRmVhdHVyZSxcbiAgY2FwYWJpbGl0aWVzT2YsXG59IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jYXBhYmlsaXRpZXMuY29udHJhY3QnO1xuaW1wb3J0IHsgSVJlZ2lvbk92ZXJsYXkgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvcmVnaW9uLW92ZXJsYXkuY29udHJhY3QnO1xuaW1wb3J0IHsgSUhpc3RvZ3JhbSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jaGFubmVsLWhpc3RvZ3JhbS1hcGkuY29udHJhY3QnO1xuaW1wb3J0IHsgQ29sb3JtYXBOb2RlLCBJV2FuZE9wdGlvbnMsIElCcnVzaE9wdGlvbnMgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgeyBWSVpfQ09ORklHLCBWaXpDb25maWcgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvdml6LWNvbmZpZyc7XG5pbXBvcnQgeyBUSUxFX0FDQ0VTU19QT1JULCBUaWxlQWNjZXNzUG9ydCB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9wb3J0cy90aWxlLWFjY2Vzcy5wb3J0JztcbmltcG9ydCB7IEJhc2VTdG9yZVZpc3VhbGl6ZXIgfSBmcm9tICcuLi9iYXNlLXN0b3JlLXZpc3VhbGl6ZXInO1xuaW1wb3J0IHsgU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlIH0gZnJvbSAnLi4vc2ltcGxlLXNsaWNlLWFjY2Vzcy5zZXJ2aWNlJztcbmltcG9ydCB7IFZpc3VhbGl6ZXJTdG9yZSB9IGZyb20gJy4uLy4uL3N0b3JlL3Zpc3VhbGl6ZXItc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBSZWdpb25TdG9yZSB9IGZyb20gJy4uLy4uL3N0b3JlL3JlZ2lvbi1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IE5hcGFyaVNjYWxlQmFyLCBTY2FsZUJhckNhbWVyYSwgZm9ybWF0VW0gfSBmcm9tICcuL25hcGFyaS1zY2FsZS1iYXInO1xuaW1wb3J0IHsgTmFwYXJpUmVnaW9uT3ZlcmxheSwgT3ZlcmxheVZpZXdlciB9IGZyb20gJy4vbmFwYXJpLXJlZ2lvbi1vdmVybGF5JztcbmltcG9ydCB7IE5hcGFyaUF4ZXNMYWJlbHMsIEF4aXNMYWJlbFNwZWMgfSBmcm9tICcuL25hcGFyaS1heGVzLWxhYmVscyc7XG5pbXBvcnQgeyBOYXBhcmlWb2x1bWVaSGFuZGxlIH0gZnJvbSAnLi9uYXBhcmktdm9sdW1lLXotaGFuZGxlJztcbmltcG9ydCB7XG4gIElDb29yZGluYXRlVHJhbnNmb3JtLFxufSBmcm9tICcuLi8uLi9jb250cmFjdHMvY29vcmRpbmF0ZS10cmFuc2Zvcm0uY29udHJhY3QnO1xuaW1wb3J0IHsgV2FuZFRvb2xTZXJ2aWNlLCBXYW5kVG9vbEhvc3QsIENhY2hlZEltYWdlRGF0YSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvd2FuZC93YW5kLXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBXYW5kT3B0aW9ucyB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvd2FuZC93YW5kLnNlcnZpY2UnO1xuaW1wb3J0IHsgQnJ1c2hUb29sU2VydmljZSwgQnJ1c2hPcHRpb25zIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9icnVzaC9icnVzaC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgVmVydGV4RXJhc2VyVG9vbFNlcnZpY2UsXG4gIFZlcnRleEVyYXNlclRvb2xIb3N0LFxufSBmcm9tICcuLi8uLi90b29sYmFyL3ZlcnRleC1lcmFzZXIvdmVydGV4LWVyYXNlci10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgWm9vbVRvQm94VG9vbFNlcnZpY2UsXG4gIFpvb21Ub0JveFRvb2xIb3N0LFxufSBmcm9tICcuLi8uLi90b29sYmFyL3pvb20tdG8tYm94L3pvb20tdG8tYm94LXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBTYW1Ub29sU2VydmljZSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3NhbS10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2FtUG9pbnRUb29sU2VydmljZSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3NhbS1wb2ludC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2VsbFNlZ21lbnRUb29sU2VydmljZSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvc2VnbWVudGF0aW9uL2NlbGwtc2VnbWVudC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgSUNlbGxTZWdtZW50ZXIsIENFTExfU0VHTUVOVEVSIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NlbGwtc2VnbWVudGVyLmNvbnRyYWN0JztcblxuLyoqIElDb29yZGluYXRlVHJhbnNmb3JtIG92ZXIgdGhlIG5hcGFyaSBjYW1lcmE6IHBvaW50ZXIgY2xpZW50IGNvb3JkcyDihpQgaW1hZ2Uvd29ybGQgY29vcmRzLiAqL1xuY2xhc3MgTmFwYXJpQ29vcmRpbmF0ZVRyYW5zZm9ybSBpbXBsZW1lbnRzIElDb29yZGluYXRlVHJhbnNmb3JtIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSB2aWV3ZXI6IHtcbiAgICAgIGNhbnZhc1RvV29ybGQoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdO1xuICAgICAgcmVhZG9ubHkgY2FtZXJhOiB7IHpvb206IG51bWJlciB9O1xuICAgIH0sXG4gICAgcHJpdmF0ZSByZWFkb25seSByZWFkeTogKCkgPT4gYm9vbGVhbixcbiAgKSB7fVxuICBjbGllbnRUb0RhdGEoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0ge1xuICAgIGNvbnN0IFt4LCB5XSA9IHRoaXMudmlld2VyLmNhbnZhc1RvV29ybGQoY2xpZW50WCwgY2xpZW50WSk7XG4gICAgcmV0dXJuIHsgeCwgeSB9O1xuICB9XG4gIGRhdGFMZW5ndGhUb1NjcmVlbihkYXRhTGVuZ3RoOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBkYXRhTGVuZ3RoICogdGhpcy52aWV3ZXIuY2FtZXJhLnpvb207IC8vIENTUyBweCBwZXIgd29ybGQgdW5pdFxuICB9XG4gIGlzUmVhZHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxufVxuXG4vKiogT3BhcXVlIGhhbmRsZSBmcm9tIHtAbGluayBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5sb2FkfSwgcGFzc2VkIGJhY2sgdG8gcGxvdCgpLiAqL1xuaW50ZXJmYWNlIE5hcGFyaUxvYWRlZCB7XG4gIGltYWdlSW5mbzogSUltYWdlSW5mbztcbiAgejogbnVtYmVyO1xuICAvKiogTXVzdCBtYXRjaCBgSUltYWdlSW5mby5maWxlTmFtZWAg4oCUIHRoZSByZW5kZXIgb3JjaGVzdHJhdG9yIGRyb3BzIHRoZSByZXN1bHQgaWYgdGhlXG4gICAqICBoYW5kbGUncyBgZmlsZW5hbWVgIGRvZXNuJ3QgbWF0Y2ggdGhlIHJlcXVlc3RlZCBpbWFnZSAoZ3VhcmRzIGFnYWluc3Qgc3RhbGUgY2xpY2tzKS4gKi9cbiAgZmlsZW5hbWU6IHN0cmluZztcbn1cblxuY29uc3QgVk9MVU1FX01BWF9TTElDRSA9IDEwMjQ7IC8vIFwiRnVsbFwiIGluLXBsYW5lIGNhcDsgdGhlIGRlZmF1bHQgwrwgbG9hZCB1c2VzIDI1NlxuLyoqIFJlZmVyZW5jZSBpbi1wbGFuZSB3b3JsZCBzaXplIChsb25nIHNpZGUpIGZvciB0aGUgdm9sdW1lL2F4ZXMgYm94LCBpbiBhcmJpdHJhcnkgd29ybGQgdW5pdHMuXG4gKiAgVGhlIGJveCBpcyBhbmNob3JlZCB0byB0aGlzIHJlZmVyZW5jZSByZWdhcmRsZXNzIG9mIHRoZSBjaG9zZW4gZGVjaW1hdGUgZmFjdG9yLCBzbyBjaGFuZ2luZyB0aGVcbiAqICByZXNvbHV0aW9uIGNoYW5nZXMgREVUQUlMLCBub3QgdGhlIHZvbHVtZSdzIHByb3BvcnRpb25zIChaIG5vIGxvbmdlciBhcHBlYXJzIHRvIHNocmluayB3aGVuIHRoZVxuICogIGluLXBsYW5lIHNhbXBsaW5nIGdyb3dzKS4gU2V0IHRvIHRoZSBERUZBVUxUIGRlY2ltYXRlJ3MgaW4tcGxhbmUgY2FwIHNvIHRoZSBkZWZhdWx0IHZpZXcgaXNcbiAqICB1bmNoYW5nZWQ7IGhpZ2hlci9sb3dlciByZXNvbHV0aW9ucyBrZWVwIHRoYXQgc2FtZSBzaGFwZS4gU2VlIHtAbGluayBtb3VudFZvbHVtZX0uICovXG5jb25zdCBWT0xVTUVfV09STERfSU5QTEFORV9SRUYgPSBWT0xVTUVfTUFYX1NMSUNFIC8gTkFQQVJJX0RFRkFVTFRfREVDSU1BVEU7XG4vKiogTWF4IGNvbmN1cnJlbnQgc2xpY2UgZmV0Y2hlcyB3aGVuIGFzc2VtYmxpbmcgYSB2b2x1bWUg4oCUIGtlZXBzIHRoZSBjb25uZWN0aW9uIHBvb2wgYnVzeVxuICogIHdpdGhvdXQgZmxvb2RpbmcgaXQgKGJyb3dzZXJzIGNhcCB+Ni9ob3N0KSBvbiBhIGRlZXAgc3RhY2suICovXG5jb25zdCBWT0xVTUVfRkVUQ0hfQ09OQ1VSUkVOQ1kgPSA4O1xuXG4vKiogVm9sdW1lL2lzb3N1cmZhY2Ugc2FtcGxpbmcgZm9yIGEgZGVjaW1hdGUgZmFjdG9yIGBzY2FsZWAgKDEgPSBGdWxsIDEwMjQsIDIgPSDCvSA1MTIsIDQgPSDCvCAyNTZcbiAqICBkZWZhdWx0LCA4ID0g4oWbIDEyOCk6IHRoZSBpbi1wbGFuZSBjYXAgaGFsdmVzIGVhY2ggc3RlcDsgc2xpY2VzIHN0YXkgdW4tc3Vic2FtcGxlZCB1bnRpbCDihZssIHRoZW5cbiAqICBzdWJzYW1wbGUuICovXG5mdW5jdGlvbiB2b2x1bWVSZXNvbHV0aW9uRm9yKHNjYWxlOiBudW1iZXIpOiB7IG1heFNsaWNlOiBudW1iZXI7IHNsaWNlU3RlcDogbnVtYmVyIH0ge1xuICBjb25zdCBzID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChzY2FsZSkpO1xuICByZXR1cm4ge1xuICAgIG1heFNsaWNlOiBNYXRoLm1heCg4LCBNYXRoLnJvdW5kKFZPTFVNRV9NQVhfU0xJQ0UgLyBzKSksXG4gICAgc2xpY2VTdGVwOiBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHMgLyA0KSksXG4gIH07XG59XG4vKiogRnVsbHktbm9ybWFsaXplZCBpbnRlbnNpdHkgaGVpZ2h0IGFzIGEgZnJhY3Rpb24gb2YgdGhlIGluLXBsYW5lIGV4dGVudCDigJQgbWF0Y2hlcyB0aGUgUGxvdGx5XG4gKiAgU1VSRkFDRSB6LWFzcGVjdCAofjAuNCkgc28gdGhlIHJlbGllZiBpc24ndCBleGFnZ2VyYXRlZC4gKi9cbmNvbnN0IFNVUkZBQ0VfWl9BU1BFQ1QgPSAwLjQ7XG4vKiogXCJGdWxsXCIgbWVzaCBncmlkIGNhcDsgdGhlIGRlY2ltYXRlIGZhY3RvciBkaXZpZGVzIGl0IChkZWZhdWx0IMK8IOKGkiAyMjAsIMK9IOKGkiA0NDAsIEZ1bGwg4oaSIDg4MCkuICovXG5jb25zdCBTVVJGQUNFX01BWF9HUklEID0gODgwO1xuLyoqIENvZWZmaWNpZW50IHNjYWxpbmcgdGhlIHB5cmFtaWQgdGlsZSBidWRnZXQgd2l0aCB0aGUgdGFyZ2V0IHJlc29sdXRpb24g4oCUIGEgaGlnaGVyIHRhcmdldCBwdWxscyBhXG4gKiAgZmluZXIgcHlyYW1pZCBsZXZlbCAobW9yZSByZWFsIGRldGFpbCkuIFNoYXJlZCBieSB0aGUgc3VyZmFjZSBwbGFuZSBmZXRjaCArIHZvbHVtZSBhc3NlbWJseS4gKi9cbmNvbnN0IFNUSVRDSF9CVURHRVRfQ09FRkYgPSAxNjtcbi8qKiBTdXJmYWNlIG1lc2ggdGFyZ2V0IGdyaWQgZm9yIGEgZGVjaW1hdGUgZmFjdG9yIGBzY2FsZWA6IHRoZSBncmlkIGNhcCBzaHJpbmtzIGJ5IGBzY2FsZWAgKGV2ZXJ5XG4gKiAgc2xpY2UgaXMga2VwdCDigJQgdGhlIHotc2xpZGVyIG5lZWRzIHRoZW0gYWxsKS4gVGhlIHNvdXJjZSBpcyBmZXRjaGVkIGF0IGEgbWF0Y2hpbmcgcmVzb2x1dGlvbi4gKi9cbmZ1bmN0aW9uIHN1cmZhY2VSZXNvbHV0aW9uRm9yKHNjYWxlOiBudW1iZXIpOiB7IG1heEdyaWQ6IG51bWJlciB9IHtcbiAgY29uc3QgcyA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoc2NhbGUpKTtcbiAgcmV0dXJuIHsgbWF4R3JpZDogTWF0aC5tYXgoMTYsIE1hdGgucm91bmQoU1VSRkFDRV9NQVhfR1JJRCAvIHMpKSB9O1xufVxuXG4vKiogM0Qgc2NhdHRlcjogaW4tcGxhbmUgY2FwIGZvciB0aGUgYXNzZW1ibGVkIHZveGVsIGdyaWQsIGFuZCB0aGUgbWF4IG51bWJlciBvZiBwb2ludHMgZW1pdHRlZFxuICogICh0aGUgZ3JpZCBpcyBmbGF0LXN0cmlkZWQgZG93biB0byB0aGlzKSDigJQga2VlcHMgdGhlIGJpbGxib2FyZCBjb3VudCBpbnRlcmFjdGl2ZS4gKi9cbmNvbnN0IFNDQVRURVIzRF9NQVhfWFkgPSA2NDtcbmNvbnN0IFNDQVRURVIzRF9NQVhfUE9JTlRTID0gMTUwMDAwO1xuXG5jb25zdCBUSUxFX1NJWkUgPSA1MTI7IC8vIHNlcnZlciB0aWxlIGVkZ2UgKG1hdGNoZXMgdGhlIE9TRCBiYWNrZW5kKVxuLyoqIE1heCB0aWxlcyBzdGl0Y2hlZCBmb3Igb25lIGRpc3BsYXllZCBzbGljZSAoNTEycHggdGlsZXMg4oaSIHVwIHRvIH42MTQ0wrIgYXQgZnVsbCByZXMpLiBCZXlvbmRcbiAqICB0aGlzIHdlIHN0ZXAgdG8gYSBjb2Fyc2VyIHB5cmFtaWQgbGV2ZWwgc28gYSBsYXJnZSBpbWFnZSBzdGF5cyB0cmFjdGFibGUuICovXG5jb25zdCBNQVhfU1RJVENIX1RJTEVTID0gMTQ0O1xuLyoqIFdlYkdQVSBkZWZhdWx0IGBtYXhUZXh0dXJlRGltZW5zaW9uMkRgIOKAlCBhIHN0aXRjaGVkIHNsaWNlJ3MgbG9uZ2VzdCBzaWRlIG11c3QgZml0IGEgdGV4dHVyZS4gKi9cbmNvbnN0IE1BWF9URVhUVVJFX0RJTSA9IDgxOTI7XG4vKiogQ29uY3VycmVudCB0aWxlIHJlcXVlc3RzIHBlciBzdGl0Y2hlZCBzbGljZS4gRmlyaW5nIGEgd2hvbGUgZ3JpZCBhdCBvbmNlIChodW5kcmVkcyBvZiByZXF1ZXN0c1xuICogIGZvciBhIGxhcmdlIGxldmVsKSBvdmVyd2hlbG1lZCB0aGUgdGlsZSBzZXJ2ZXIgKDUwNHMpOyBhIHNtYWxsIHBvb2wga2VlcHMgdGhlIHBpcGUgZnVsbCB3aXRob3V0XG4gKiAgZmxvb2RpbmcgaXQg4oCUIGFuZCBzbGljZS1sZXZlbCB3b3JrZXJzIGFscmVhZHkgcnVuIHNldmVyYWwgc3RpdGNoZXMgaW4gcGFyYWxsZWwgb24gdG9wIG9mIHRoaXMuICovXG5jb25zdCBUSUxFX0ZFVENIX0NPTkNVUlJFTkNZID0gNjtcbi8qKiBIb3cgbG9uZyB0byBwb2xsIGAvdGlsZXMvaW5mb2AgKDIwMiB3aGlsZSB0aGUgc2VydmVyIGNhY2hlcyB0aGUgc291cmNlKSBiZWZvcmUgZmFsbGluZyBiYWNrIHRvXG4gKiAgYSBzaW5nbGUgdGlsZS4gR2VuZXJvdXMgbGlrZSB0aGUgT1NEIGJhY2tlbmQg4oCUIGEgY29sZCB3aG9sZS1zbGlkZSBjYW4gdGFrZSBtaW51dGVzIHRvIGNhY2hlLiAqL1xuY29uc3QgREVTQ1JJUFRPUl9USU1FT1VUX01TID0gMTIwMDAwO1xuXG4vKiogRGVmYXVsdCBwZXItY2hhbm5lbCB0aW50cyAoRmlqaS1zdHlsZSkgd2hlbiB0aGUgc3RvcmUvZGVzY3JpcHRvciBvZmZlcnMgbm8gY29sb3VyLiAqL1xuY29uc3QgREVGQVVMVF9USU5UUyA9IFsnI2ZmMDAwMCcsICcjMDBmZjAwJywgJyMwMDAwZmYnLCAnI2ZmZmYwMCcsICcjZmYwMGZmJywgJyMwMGZmZmYnLCAnI2ZmZmZmZiddO1xuXG4vKiogRGVmYXVsdCB0aW50IGZvciBhIGNoYW5uZWwgaW5kZXgsIGN5Y2xpbmcgdGhlIEZpamkgcGFsZXR0ZS4gKi9cbmZ1bmN0aW9uIHRpbnRGb3IoY2hhbm5lbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIERFRkFVTFRfVElOVFNbY2hhbm5lbCAlIERFRkFVTFRfVElOVFMubGVuZ3RoXTtcbn1cblxuLyoqIE9uZSBweXJhbWlkIGxldmVsIGZyb20gYEdFVCAvdGlsZXMvaW5mb2AgKHJlcyAwID0gZnVsbCByZXNvbHV0aW9uKS4gKi9cbmludGVyZmFjZSBUaWxlTGV2ZWwge1xuICByZXM6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbi8qKiBTdWJzZXQgb2YgdGhlIGAvdGlsZXMvaW5mb2AgZGVzY3JpcHRvciB0aGlzIGJhY2tlbmQgcmVhZHMgKHRpbGUgZ3JpZCwgY2hhbm5lbHMsIHNjYWxlKS4gKi9cbmludGVyZmFjZSBUaWxlRGVzY3JpcHRvciB7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICB0aWxlU2l6ZTogbnVtYmVyO1xuICB6OiBudW1iZXI7XG4gIGNoYW5uZWxzOiBudW1iZXI7XG4gIG11bHRpY2hhbm5lbD86IGJvb2xlYW47XG4gIC8qKiBSZWFsIEJpby1Gb3JtYXRzIGxldmVscyBhdCB0aGUgZnJvbnQgb2YgYGxldmVsc2A7IHBlci1jaGFubmVsIHRpbGVzIGV4aXN0IG9ubHkgdGhlcmUuICovXG4gIHJlYWxMZXZlbHM/OiBudW1iZXI7XG4gIGNoYW5uZWxJbmZvPzogQXJyYXk8e1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgY29sb3I/OiBzdHJpbmc7XG4gICAgYml0RGVwdGg/OiBudW1iZXI7XG4gICAgbWluQWxsb3dlZD86IG51bWJlcjtcbiAgICBtYXhBbGxvd2VkPzogbnVtYmVyO1xuICB9PiB8IG51bGw7XG4gIGxldmVsczogVGlsZUxldmVsW107XG4gIG1wcFg/OiBudW1iZXI7XG4gIG1wcFk/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQSBXZWJHUFUgaW1hZ2UgYmFja2VuZCBidWlsdCBvbiB0aGUgcHVibGlzaGVkIGBuYXBhcmktanNgIGxpYnJhcnkg4oCUIHRoZSBQT0MgZW5naW5lIGZvclxuICogaml0LXVpIzEwMiAoYSBicm93c2VyLWJhc2VkIG5hcGFyaSBzaGlwcGVkIGFzIGEgSlMgbGlicmFyeSwgc3dhcHBpbmcgaW1hZ2UgcGxvdHRpbmcgd2l0aFxuICogT3BlblNlYWRyYWdvbiBhbmQgM0Qgc2xpY2luZy9pc29zdXJmYWNlcyB3aXRoIFBsb3RseSkuXG4gKlxuICogUmVuZGVyIHN0cmF0ZWd5OiByYXRoZXIgdGhhbiByZS1pbXBsZW1lbnQgdGhlIHNlcnZlcidzIHRpbGUvcHlyYW1pZCBwcm90b2NvbCAod2hpY2ggT1NEXG4gKiBhbHJlYWR5IGhhbmRsZXMpLCB0aGlzIGJhY2tlbmQgcmVuZGVycyB0aGUgKipjb21wbGV0ZSBwZXItc2xpY2UgaW1hZ2UgVVJMcyB0aGUgYXBwIGFscmVhZHlcbiAqIHByb2R1Y2VzKiogKGBJSW1hZ2VJbmZvLnVybHNgKSDigJQgYHVybHNbel1gIGZvciB0aGUgMkQgaW1hZ2UsIGFuZCB0aGUgZnVsbCBgdXJsc2Agc3RhY2tcbiAqIGFzc2VtYmxlZCBpbnRvIGEgZG93bnNhbXBsZWQgdm9sdW1lIGZvciB0aGUgM0QgdHlwZXMuIFJlZ2lvbiBzdGF0ZSBhbmQgZGlzcGxheSBvcHRpb25zXG4gKiBkZWxlZ2F0ZSB0byB0aGUgc2hhcmVkIHtAbGluayBSZWdpb25TdG9yZX0gLyB7QGxpbmsgVmlzdWFsaXplclN0b3JlfSwgZXhhY3RseSBhcyBPU0QgZG9lcy5cbiAqXG4gKiBGb2xsb3ctdXBzIChqaXQtdWkjMTAyKTogbmF0aXZlLXJlc29sdXRpb24gcHlyYW1pZGFsIHRpbGluZywgb24tY2FudmFzIHRvb2xzLCByZWdpb25cbiAqIG92ZXJsYXkgcmVuZGVyaW5nLCBwZXItY2hhbm5lbCBoaXN0b2dyYW1zLCBUSUZGIGV4cG9ydC5cbiAqL1xuLyoqXG4gKiBXaGF0IHRoZSAzRCBwb2ludHMgbGF5ZXIgbmVlZHMgdG8gY29sb3VyIGEgY2xvdWQ6IG9uZSBzY2FsYXIgcGVyIHBvaW50LCBhIGNvbG9ybWFwLCBhbmQgdGhlXG4gKiB3aW5kb3cgdGhhdCBtYXBzIHNjYWxhcnMgb250byBpdC4gQ2F0ZWdvcmljYWwgYW5kIGNvbnRpbnVvdXMgY29sb3VyaW5ncyBib3RoIHJlZHVjZSB0byB0aGlzLFxuICogYmVjYXVzZSB0aGUgbGF5ZXIgb2ZmZXJzIG5vIHBlci1wb2ludCBjb2xvdXIgY2hhbm5lbC5cbiAqL1xuaW50ZXJmYWNlIFNwYXRpYWwzZEVuY29kaW5nIHtcbiAgdmFsdWVzOiBGbG9hdDMyQXJyYXk7XG4gIGNvbG9ybWFwOiBDb2xvcm1hcDtcbiAgY29udHJhc3RMaW1pdHM6IFtudW1iZXIsIG51bWJlcl07XG59XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgTmFwYXJpVmlzdWFsaXplclNlcnZpY2UgZXh0ZW5kcyBCYXNlU3RvcmVWaXN1YWxpemVyIGltcGxlbWVudHMgSVZpc3VhbGl6ZXIge1xuICByZWFkb25seSBjYXBhYmlsaXRpZXM6IFZpZXdlckNhcGFiaWxpdGllcyA9IGNhcGFiaWxpdGllc09mKFtcbiAgICBWaWV3ZXJGZWF0dXJlLkltYWdlRGlzcGxheSxcbiAgICBWaWV3ZXJGZWF0dXJlLlN0YWNrU2xpZGVyLFxuICAgIFZpZXdlckZlYXR1cmUuUGl4ZWxSZWFkYmFjayxcbiAgICBWaWV3ZXJGZWF0dXJlLlN1cmZhY2UzRCxcbiAgICBWaWV3ZXJGZWF0dXJlLklzb3N1cmZhY2UsXG4gIF0pO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYXBpOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSB2aWV3ZXI6IFZpZXdlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBob3N0OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxvYWRlZDogTmFwYXJpTG9hZGVkIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbGFzdFBpeGVsczogUGl4ZWxEYXRhIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY3VycmVudFBsb3RUeXBlOiBQbG90VHlwZSA9IFBsb3RUeXBlLk5BUEFSSV9JTUFHRTtcbiAgLyoqIG5hcGFyaS1qcyBoaWdoLWxldmVsIHZpZXcgb3duaW5nIHRoZSAzRCB2b2x1bWUgbGF5ZXJzIChvbmUgYWRkaXRpdmUgdGludGVkIGxheWVyIHBlciBjaGFubmVsXG4gICAqICBmb3IgbXVsdGljaGFubmVsLCBvciBhIHNpbmdsZSBncmF5c2NhbGUgdm9sdW1lKS4gTnVsbCBpbiAyRC4gKi9cbiAgcHJpdmF0ZSB2b2x1bWVWaWV3OiBNdWx0aUNoYW5uZWxWb2x1bWVWaWV3IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUcnVlIHdoZW4gdGhlIHZvbHVtZSBpcyBjb21wb3NpdGVkIGZyb20gcGVyLWNoYW5uZWwgbGF5ZXJzICh2cyBhIHNpbmdsZSBncmF5c2NhbGUgdm9sdW1lKS4gKi9cbiAgcHJpdmF0ZSB2b2x1bWVNdWx0aWNoYW5uZWwgPSBmYWxzZTtcbiAgLyoqIG5hcGFyaS1qcyBoZWlnaHQtZmllbGQgc3VyZmFjZSBtZXNoIChOQVBBUklfU1VSRkFDRSBwbG90IHR5cGU7IG51bGwgb3RoZXJ3aXNlKS4gQnVpbHQgZnJvbSBhXG4gICAqICBzaW5nbGUgZ3JheXNjYWxlIHNsaWNlIGJ5IHtAbGluayBidWlsZFN1cmZhY2V9IHZpYSBuYXBhcmktanMncyBgaGVpZ2h0RmllbGRgICsgYGFkZFN1cmZhY2VgLiAqL1xuICBwcml2YXRlIHN1cmZhY2VMYXllcjogU3VyZmFjZUxheWVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBXaGljaCBiYW5kIHRoZSBzdXJmYWNlIHNhbXBsZXMgKGEgY2hhbm5lbCBpbmRleCBmb3IgbXVsdGljaGFubmVsLCBlbHNlIHRoZSBjb21wb3NpdGUpLiAqL1xuICBwcml2YXRlIHN1cmZhY2VDaGFubmVsOiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gIC8qKiBUcnVlIHdoZW4gdGhlIG1vdW50ZWQgU3VyZmFjZSBmb2xsb3dzIG9uZSBiYW5kIG9mIGEgbXVsdGljaGFubmVsIGltYWdlLiAqL1xuICBwcml2YXRlIHN1cmZhY2VNdWx0aWNoYW5uZWwgPSBmYWxzZTtcbiAgLyoqIFByZS1sb2FkZWQgcGVyLXNsaWNlIGx1bWluYW5jZSBwbGFuZXMgKGFscmVhZHkgZGVjaW1hdGVkIHRvIHRoZSBzdXJmYWNlIGdyaWQpLCBrZXllZCBieSB6LFxuICAgKiAgc28gdGhlIHN0YWNrIHNsaWRlciByZWJ1aWxkcyB0aGUgc3VyZmFjZSBpbnN0YW50bHkuIEZpbGxlZCBieSB7QGxpbmsgcHJlbG9hZFN1cmZhY2VQbGFuZXN9LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHN1cmZhY2VQbGFuZXMgPSBuZXcgTWFwPFxuICAgIG51bWJlcixcbiAgICB7IGRhdGE6IFVpbnQ4QXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH1cbiAgPigpO1xuICAvKiogSW4tcGxhbmUgZ3JpZCBjYXAgZm9yIHRoZSBhY3RpdmUgc3VyZmFjZSBsb2FkIChmdWxsIGdyaWQgw7cgdGhlIGRlY2ltYXRlIGZhY3RvcikuICovXG4gIHByaXZhdGUgc3VyZmFjZU1heEdyaWQgPSBTVVJGQUNFX01BWF9HUklEO1xuICAvKiogQ29udHJhc3Qgd2luZG93IFttaW4sbWF4XSB0aGUgY3VycmVudCBzdXJmYWNlIG1lc2ggd2FzIGJ1aWx0IHdpdGguIEEgY2hhbmdlIHJlc2hhcGVzIHRoZVxuICAgKiAgbWVzaCAocGl4ZWwgaGVpZ2h0ID0gaW50ZW5zaXR5IHdpdGhpbiBbbWluLG1heF0pLCBzbyBpdCB0cmlnZ2VycyBhIGdlb21ldHJ5IHJlYnVpbGQuICovXG4gIHByaXZhdGUgc3VyZmFjZVdpbmRvdzogW251bWJlciwgbnVtYmVyXSB8IG51bGwgPSBudWxsO1xuICAvKiogUGVyc2lzdGVkIHdpcmVmcmFtZSBjaG9pY2UgZm9yIHRoZSBzdXJmYWNlIChyZS1hcHBsaWVkIHdoZW4gYSBuZXcgc3VyZmFjZSBtb3VudHMpLiAqL1xuICBwcml2YXRlIHN1cmZhY2VXaXJlZnJhbWUgPSBmYWxzZTtcbiAgLyoqIG5hcGFyaS1qcyAyRCBzY2F0dGVyIHBvaW50cyAocmVnaW9uIGNlbnRyb2lkcykgKyBpdHMgcmVnaW9uLWNoYW5nZSBzdWJzY3JpcHRpb24uICovXG4gIHByaXZhdGUgc2NhdHRlcjJkUG9pbnRzOiBQb2ludHNMYXllciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNjYXR0ZXJSZWdpb25TdWI6IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xuICAvKiogbmFwYXJpLWpzIDNEIHNjYXR0ZXIgKHZveGVsIHBvaW50IGNsb3VkKS4gKi9cbiAgcHJpdmF0ZSBzY2F0dGVyM2RMYXllcjogUG9pbnRzM0RMYXllciB8IG51bGwgPSBudWxsO1xuICAvKiogU3BhdGlhbC1vbWljcyBvYnNlcnZhdGlvbiBtYXJrZXJzICsgdGhlIGRhdGFzZXQvdmlldyBzdWJzY3JpcHRpb24gZHJpdmluZyB0aGVtLiAqL1xuICBwcml2YXRlIHNwYXRpYWxQb2ludHM6IFBvaW50c0xheWVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgM0QgcG9pbnQgY2xvdWQuIE9uZSBsYXllcjogc2VsZWN0aW9uIGlzIGEgcGVyLXBvaW50IGFscGhhIG9uIGl0LCBub3QgYSBzZWNvbmQuICovXG4gIHByaXZhdGUgc3BhdGlhbFBvaW50czNkOiBQb2ludHMzRExheWVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3BhdGlhbExheWVyS2V5M2Q6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogSW50ZXJsZWF2ZWQgeCx5LHosIGNhY2hlZCBzbyBhIGNvbG91ciBjaGFuZ2UgZG9lcyBub3QgcmUtd2FsayAzLjdNIG9ic2VydmF0aW9ucy4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsUG9zaXRpb25zM2Q6IEZsb2F0MzJBcnJheSB8IG51bGwgPSBudWxsO1xuICAvKiogSWRlbnRpdHkgb2YgdGhlIHNjYWxhcnMgY3VycmVudGx5IHVwbG9hZGVkIOKAlCBzZWUge0BsaW5rIHJlYnVpbGRTcGF0aWFsUG9pbnRzM2R9LiAqL1xuICBwcml2YXRlIHNwYXRpYWxTY2FsYXJLZXkzZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgYW5hdG9taWNhbCB2b2x1bWUgdGhlIGNsb3VkIHNpdHMgaW5zaWRlLCB3aGVuIHRoZSBkYXRhc2V0IGhhcyBvbmUuICovXG4gIHByaXZhdGUgc3BhdGlhbFZvbHVtZTogVm9sdW1lTGF5ZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzcGF0aWFsVm9sdW1lS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFBlci1jbHVzdGVyIGRlbnNpdHkgdm9sdW1lcyBkcmF3biBhbG9uZ3NpZGUgdGhlIGNsb3VkLCBhbmQgd2hhdCB0aGV5IHdlcmVcbiAgICogIGJ1aWx0IGZyb20g4oCUIHJhc3RlcmlzaW5nIGlzIHNlY29uZHMgb2Ygd29yaywgc28gaXQgbXVzdCBub3QgcmVwZWF0IGZvciBhXG4gICAqICBjaGFuZ2UgdGhhdCBjYW5ub3QgYWZmZWN0IHRoZSBmaWVsZC4gKi9cbiAgcHJpdmF0ZSBkZW5zaXR5TGF5ZXJzOiBWb2x1bWVMYXllcltdID0gW107XG4gIHByaXZhdGUgZGVuc2l0eUtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBTZWxlY3Rpb24gaWRlbnRpdHksIGFzIGEgbnVtYmVyIHRoZSBkZW5zaXR5IGtleSBjYW4gY2FycnkuICovXG4gIHByaXZhdGUgbGFzdFNlbGVjdGlvblNlZW46IFNwYXRpYWxTZWxlY3Rpb25NYXNrIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc2VsZWN0aW9uUmV2aXNpb24gPSAwO1xuICAvKiogVGhlIGdlbmUgbWFwOiBpdHMgbGF5ZXIsIHRoZSBmaWVsZCBpdCB3YXMgZXN0aW1hdGVkIGZyb20sIGFuZCB0aGUgaW5wdXRzIGVhY2hcbiAgICogIHdhcyBidWlsdCBmb3Ig4oCUIHRoZSBmaWVsZCBpcyB0aGUgZXhwZW5zaXZlIGhhbGYgYW5kIHN1cnZpdmVzIGEgcmVjb2xvdXIuICovXG4gIHByaXZhdGUgZ2VuZU1hcExheWVyOiBJbWFnZUxheWVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZ2VuZU1hcEtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZ2VuZU1hcEZpZWxkOiBFeHByZXNzaW9uRmllbGQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBnZW5lTWFwRmllbGRLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIDNEIGdlbmUgbWFwOiBpdHMgdm9sdW1lIGxheWVyLCB0aGUgZmllbGQgYmVoaW5kIGl0LCBhbmQgdGhlIGlucHV0cyBlYWNoXG4gICAqICB3YXMgYnVpbHQgZm9yIOKAlCBzYW1lIHR3byBjbG9ja3MgYXMgdGhlIDJEIG1hcC4gKi9cbiAgcHJpdmF0ZSBnZW5lTWFwVm9sdW1lTGF5ZXI6IFZvbHVtZUxheWVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZ2VuZU1hcFZvbHVtZUtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZ2VuZU1hcFZvbHVtZUZpZWxkOiBFeHByZXNzaW9uVm9sdW1lRmllbGQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBnZW5lTWFwVm9sdW1lRmllbGRLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogT2Zmc2V0IGFwcGxpZWQgdG8gb2JzZXJ2YXRpb24gY29vcmRpbmF0ZXMgdG8gc2l0IHRoZW0gaW4gdGhlIHZvbHVtZSdzIGJveC4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsT3JpZ2luM2Q6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFswLCAwLCAwXTtcbiAgLyoqIEN1cnNvciB0b29sdGlwIGZvciB0aGUgc3BhdGlhbCB2aWV3cywgYW5kIGV2ZXJ5dGhpbmcgaXQgbmVlZHM6IHdoYXQgdGhlXG4gICAqICBjbG91ZCBpcyBjb2xvdXJlZCBieSwgYW5kIHdoZXJlIGVhY2ggZHJhd24gb2JzZXJ2YXRpb24gaXMuICovXG4gIHByaXZhdGUgc3BhdGlhbFRvb2x0aXA6IE5hcGFyaVNwYXRpYWxUb29sdGlwIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaG92ZXJTb3VyY2U6IEhvdmVyU291cmNlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaG92ZXJTb3VyY2VLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogU2VxdWVuY2VzIHRoZSBhc3luYyByZXNvbHV0aW9ucy4gVGhlIEtFWSBpcyBvbmx5IGNvbW1pdHRlZCBvbmNlIG9uZSBsYW5kcyxcbiAgICogIHNvIGEgc3VwZXJzZWRlZCBmZXRjaCBjYW5ub3QgbGVhdmUgdGhlIGNhY2hlIGNsYWltaW5nIHRvIGhvbGQgYSBzb3VyY2UgaXRcbiAgICogIG5ldmVyIHN0b3JlZC4gKi9cbiAgcHJpdmF0ZSBob3ZlclNvdXJjZVRva2VuID0gMDtcbiAgLyoqIERyYXduIG9ic2VydmF0aW9ucycgcG9zaXRpb25zIGZvciBoaXQtdGVzdGluZywgaW5kZXhlZCBCWSBPQlNFUlZBVElPTiB3aXRoXG4gICAqICBOYU4gZm9yIGFueXRoaW5nIG5vdCBkcmF3bi4gU2NyZWVuIHBpeGVscyBpbiAzRCAodGhlIGNhbWVyYSBtb3ZlcyB0aGVtLCBzb1xuICAgKiAgdGhleSBhcmUgcmVidWlsdCB3aGVuIGl0IGRvZXMpIGFuZCBXT1JMRCB1bml0cyBpbiAyRCAod2hlcmUgdGhlIGNhbWVyYSBvbmx5XG4gICAqICBzY2FsZXMsIHNvIHRoZSBwb2ludGVyIGlzIGNvbnZlcnRlZCBpbnN0ZWFkIG9mIDM3NGsgcG9pbnRzKS4gKi9cbiAgcHJpdmF0ZSBob3ZlclBvc2l0aW9uczogRmxvYXQzMkFycmF5IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaG92ZXJQb3NpdGlvbnNSZXYgPSAtMTtcblxuICAvKipcbiAgICogU2NyZWVuLXNwYWNlIGJ1Y2tldCBpbmRleCBvdmVyIHRoZSAzRCBwcm9qZWN0aW9uLCBidWlsdCBvbiB0aGUgZmlyc3QgaG92ZXIgYWZ0ZXIgdGhlXG4gICAqIHNjZW5lIG1vdmVkIHJhdGhlciB0aGFuIHdoZW4gaXQgbW92ZXMuXG4gICAqXG4gICAqIExhemlseSwgYW5kIHRoYXQgaXMgdGhlIHdob2xlIGRlc2lnbjogYW4gb3JiaXQgZHJhZyBjaGFuZ2VzIHRoZSBjYW1lcmEgZXZlcnkgZnJhbWUsIHNvXG4gICAqIGJ1aWxkaW5nIGVhZ2VybHkgd291bGQgc3BlbmQgdGVucyBvZiBtaWxsaXNlY29uZHMgYSBmcmFtZSBpbmRleGluZyBmb3IgcGlja3Mgbm9ib2R5IGlzXG4gICAqIG1ha2luZy4gRGVmZXJyZWQsIGl0IGlzIGJ1aWx0IG9uY2Ugd2hlbiB0aGUgZHJhZyBzdG9wcyBhbmQgdGhlIHBvaW50ZXIgbmV4dCBtb3ZlcyDigJRcbiAgICogbWVhc3VyZWQgdXBzdHJlYW0gYXQgMy43TSBwb2ludHMsIHRoYXQgdHVybnMgYSAxMi42IG1zIHNjYW4gcGVyIHBvaW50ZXJtb3ZlIGludG9cbiAgICogMC4wNjYgbXMuXG4gICAqL1xuICBwcml2YXRlIGhvdmVySW5kZXg6IFNjcmVlbkluZGV4IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBCdW1wZWQgd2hlbmV2ZXIgdGhlIGNhY2hlZCBwb3NpdGlvbnMgZ28gc3RhbGU6IGEgbWFya2VyIHJlYnVpbGQsIG9yIOKAlCBpbiAzRFxuICAgKiAgb25seSwgd2hlcmUgdGhlIHByb2plY3Rpb24gZGVwZW5kcyBvbiBpdCDigJQgYSBjYW1lcmEgbW92ZS4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsU2NlbmVSZXYgPSAwO1xuICBwcml2YXRlIGhvdmVyUG9pbnRlcjogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgY2xpZW50WDogbnVtYmVyOyBjbGllbnRZOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGhvdmVyRnJhbWUgPSAwO1xuICBwcml2YXRlIGhvdmVyT2ZmOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuICAvKiogT2JzZXJ2YXRpb24gaW5kaWNlcyB0aGUgY2FjaGVkIDNEIHBvc2l0aW9ucyBiZWxvbmcgdG8sIGluIHRoZSBzYW1lIG9yZGVyO1xuICAgKiAgbnVsbCB3aGVuIGV2ZXJ5IG9ic2VydmF0aW9uIGlzIGRyYXduLiBXaXRob3V0IGl0IGEgcHJvamVjdGlvbiBidWlsdCBmcm9tIHRoZVxuICAgKiAgcG9zaXRpb25zIGlzIGluZGV4ZWQgYnkgRFJBV04gb3JkZXIgYW5kIHNpbGVudGx5IGF0dHJpYnV0ZXMgZWFjaCBwb2ludCB0b1xuICAgKiAgdGhlIHdyb25nIG9ic2VydmF0aW9uIGFzIHNvb24gYXMgYSBzZWN0aW9uIGlzIGlzb2xhdGVkLiAqL1xuICBwcml2YXRlIHNwYXRpYWxEcmF3bjNkOiBVaW50MzJBcnJheSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBSZXVzZWQgcHJvamVjdGlvbiBidWZmZXJzIOKAlCBzZWUge0BsaW5rIGdldFNwYXRpYWxTY3JlZW5Qcm9qZWN0aW9ufS4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsUHJvamVjdGlvbjNkOiBQcm9qZWN0ZWRQb2ludHMgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgLyoqIFBlci1vYnNlcnZhdGlvbiBkZXB0aCBmcm9tIHRoZSBsYXN0IHByb2plY3Rpb24sIGZvciB0aGUgZGVwdGgtYXdhcmUgaG92ZXIgcGljay4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsRGVwdGhzM2Q6IEZsb2F0MzJBcnJheSB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlICh2aWV3ZXIsIGRhdGFzZXQpIHdob3NlIDNEIHNjZW5lIGhhcyBhbHJlYWR5IGhhZCBpdHMgb3BlbmluZyBmcmFtaW5nLiAqL1xuICAvKiogV2hvc2UgMkQgb2JzZXJ2YXRpb25zIHRoZSBjYW1lcmEgaGFzIGJlZW4gZnJhbWVkIG9uIOKAlCBzZWUge0BsaW5rIGZyYW1lU3BhdGlhbFBvaW50c09uY2V9LiAqL1xuICBwcml2YXRlIHNwYXRpYWwyZEZyYW1lZDogeyB2aWV3ZXI6IFZpZXdlcjsgZGF0YXNldElkOiBzdHJpbmcgfSB8IG51bGwgPSBudWxsO1xuICAvKiogRGF0YXNldCB0aGUgM0Qgc2NhbGUgYmFyIHdhcyBidWlsdCBmb3IuICovXG4gIHByaXZhdGUgc3BhdGlhbFNjYWxlQmFyS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzcGF0aWFsU3ViOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgLyoqIExhdGVzdCAoZGF0YXNldCwgdmlldywgc2VsZWN0aW9uKSB0aGUgc3BhdGlhbCBzdWJzY3JpcHRpb24gc2F3LCBzbyBhIHNsaWNlXG4gICAqICBjaGFuZ2UgY2FuIHJlYnVpbGQgdGhlIG1hcmtlcnMgZm9yIHRoZSBuZXcgcGxhbmUuICovXG4gIHByaXZhdGUgc3BhdGlhbExhdGVzdDogW1NwYXRpYWxEYXRhc2V0IHwgbnVsbCwgU3BhdGlhbFZpZXdTdGF0ZSwgU3BhdGlhbFNlbGVjdGlvbk1hc2tdIHwgbnVsbCA9XG4gICAgbnVsbDtcbiAgLyoqIFdoaWNoIGRhdGFzZXQgdGhlIGN1cnJlbnQgbWFya2VyIGxheWVyIHdhcyBidWlsdCBmb3IsIHNvIGEgZGlzcGxheS1vbmx5XG4gICAqICBjaGFuZ2UgKHNpemUsIGNvbG91ciwgb3BhY2l0eSwgc2VsZWN0aW9uKSBjYW4gdXBkYXRlIGl0IGluIHBsYWNlLiAqL1xuICBwcml2YXRlIHNwYXRpYWxMYXllcktleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBNb25vdG9uaWMgZ3VhcmQgZm9yIHRoZSBhc3luYyBjb2xvdXIgcmVidWlsZDogZmV0Y2hpbmcgYSBnZW5lIHZlY3RvciBpcyBhXG4gICAqICByb3VuZC10cmlwLCBzbyBhIGZhc3Qgc2VxdWVuY2Ugb2YgY29sb3VyLWJ5IGNoYW5nZXMgY2FuIHJlc29sdmUgb3V0IG9mXG4gICAqICBvcmRlci4gT25seSB0aGUgbmV3ZXN0IHJlYnVpbGQgaXMgYWxsb3dlZCB0byB0b3VjaCB0aGUgbGF5ZXIuICovXG4gIHByaXZhdGUgc3BhdGlhbFJlYnVpbGRUb2tlbiA9IDA7XG4gIC8qKiBNb25vdG9uaWMgbG9hZCBnZW5lcmF0aW9uLiBCdW1wZWQgYnkge0BsaW5rIHJlc2V0fSBhbmQge0BsaW5rIGNhbmNlbExvYWRpbmd9OyB0aGUgZnJhbWUtbG9hZGluZ1xuICAgKiAgbG9vcHMgKHZvbHVtZSBhc3NlbWJseSwgc3VyZmFjZSBwcmVsb2FkKSBjYXB0dXJlIGl0IGFuZCBiYWlsIHdoZW4gaXQgY2hhbmdlcywgc28gYSBDYW5jZWwgKG9yIGFcbiAgICogIG5ldyBwbG90KSBhY3R1YWxseSBzdG9wcyBmZXRjaGluZyBmcmFtZXMgaW5zdGVhZCBvZiBydW5uaW5nIHRvIGNvbXBsZXRpb24gaW4gdGhlIGJhY2tncm91bmQuICovXG4gIHByaXZhdGUgbG9hZFRva2VuID0gMDtcbiAgLyoqIERlY2ltYXRlIGZhY3RvciBmb3IgdGhlIG5hcGFyaSAzRCB0eXBlcyAoMSA9IEZ1bGwsIDIgPSDCvSBkZWZhdWx0LCA0ID0gwrwsIDggPSDihZspLiBBcHBsaWVkIHdoZW4gYVxuICAgKiAgdm9sdW1lL2lzb3N1cmZhY2Uvc3VyZmFjZSAocmUpbG9hZHM7IGNoYW5naW5nIGl0IG5lZWRzIGEgcmUtcGxvdCAoaXQgY2hhbmdlcyBmZXRjaGVkIGRhdGEpLiAqL1xuICBwcml2YXRlIHJlc29sdXRpb25TY2FsZSA9IE5BUEFSSV9ERUZBVUxUX0RFQ0lNQVRFO1xuICAvKiogM0QgY29vcmRpbmF0ZS1heGVzIC8gc2NhbGUgZ2l6bW8gZm9yIHRoZSB2b2x1bWUvaXNvc3VyZmFjZSB2aWV3IChudWxsIGluIDJEKS4gKi9cbiAgcHJpdmF0ZSBheGVzTGF5ZXI6IEF4ZXNMYXllciB8IG51bGwgPSBudWxsO1xuICAvKiogRE9NIFgvWS9aICsgc2NhbGUgbGFiZWxzIHRyYWNraW5nIHRoZSAzRCBheGVzIGdpem1vIChudWxsIGluIDJEKS4gKi9cbiAgcHJpdmF0ZSBheGVzTGFiZWxzOiBOYXBhcmlBeGVzTGFiZWxzIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBEcmFnZ2FibGUgWi1oZWlnaHQgZ3JpcCBvdmVyIHRoZSB2b2x1bWUgKG51bGwgdW5sZXNzIGEgdm9sdW1lL2lzb3N1cmZhY2UgaXMgbW91bnRlZCkuICovXG4gIHByaXZhdGUgekhhbmRsZTogTmFwYXJpVm9sdW1lWkhhbmRsZSB8IG51bGwgPSBudWxsO1xuICAvKiogVXNlciBaLWhlaWdodCBmYWN0b3IgZm9yIHRoZSB2b2x1bWUgKDEgPSB0aGUgdm9sdW1lJ3MgbmF0dXJhbCBwcm9wb3J0aW9ucyk7IGRyaXZlbiBieSB0aGVcbiAgICogIGluLXZpZXcgZHJhZyBoYW5kbGUuIFJlc2V0IHBlciBtb3VudC4gKi9cbiAgcHJpdmF0ZSB2b2x1bWVaU2NhbGUgPSAxO1xuICAvKiogVm9sdW1lIHdvcmxkIGJveCBhdCBgdm9sdW1lWlNjYWxlID0gMWAgKGJhc2UpICsgdGhlIHNhbXBsZWQgdm94ZWwgZGVwdGgg4oCUIGVub3VnaCB0byByZWNvbXB1dGVcbiAgICogIHRoZSBaLWF4aXMgdm94ZWwgc2NhbGUsIGF4ZXMgZGVwdGgsIGFuZCBvdmVybGF5IGFuY2hvcnMgYXMgdGhlIGhhbmRsZSBzdHJldGNoZXMgWi4gKi9cbiAgcHJpdmF0ZSB2b2x1bWVXb3JsZEJhc2U6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXI7IGRlcHRoOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHZvbHVtZVNhbXBsZWREZXB0aCA9IDE7XG4gIC8qKiBQZXJzaXN0ZWQgYXhlcyBvbi9vZmYgY2hvaWNlLCByZS1hcHBsaWVkIHdoZW4gYSBuZXcgdm9sdW1lIG1vdW50cy4gRGVmYXVsdHMgb24uICovXG4gIHByaXZhdGUgYXhlc1Zpc2libGUgPSB0cnVlO1xuICBwcml2YXRlIHZvbHVtZURpbXM6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXI7IGRlcHRoOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICAvKiogQXNzZW1ibGVkIHVpbnQ4IHZvbHVtZSBkYXRhIHBlciBjaGFubmVsIChrZXkgPSBjaGFubmVsIGluZGV4KSwga2VwdCBmb3IgdGhlIHZvbHVtZSBpbnRlbnNpdHlcbiAgICogIGhpc3RvZ3JhbS4gS2V5IDAgaG9sZHMgdGhlIGdyYXlzY2FsZS9jb21wb3NpdGUgdm9sdW1lIGluIHRoZSBzaW5nbGUtY2hhbm5lbCBjYXNlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHZvbHVtZUNoYW5uZWxEYXRhID0gbmV3IE1hcDxudW1iZXIsIFVpbnQ4QXJyYXk+KCk7XG4gIHByaXZhdGUgaW1hZ2VXID0gMDtcbiAgcHJpdmF0ZSBpbWFnZUggPSAwO1xuICAvKiogTW9ub3RvbmljIHNsaWNlLXJlcXVlc3QgaWQgc28gYSBzbG93IG91dC1vZi1vcmRlciBzbGljZSBmZXRjaCBjYW4ndCBjbG9iYmVyIGEgbmV3ZXIgb25lLiAqL1xuICBwcml2YXRlIHNsaWNlUmVxID0gMDtcbiAgLyoqIENhY2hlZCBgL3RpbGVzL2luZm9gIHB5cmFtaWQgZGVzY3JpcHRvciArIHRoZSBpbmZvQjY0IGl0IHdhcyBmZXRjaGVkIGZvci4gKi9cbiAgcHJpdmF0ZSBkZXNjcmlwdG9yOiBUaWxlRGVzY3JpcHRvciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGRlc2NyaXB0b3JLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBIb3cgdGhlIGN1cnJlbnQgMkQgaW1hZ2UgaXMgY29tcG9zaXRlZCAoZHJpdmVzIGhpc3RvZ3JhbSArIHN0YXRlIGFwcGxpY2F0aW9uKS4gKi9cbiAgcHJpdmF0ZSBpbWFnZU1vZGU6ICdncmF5c2NhbGUnIHwgJ211bHRpY2hhbm5lbCcgfCAncmdiJyA9ICdyZ2InO1xuICAvKiogbmFwYXJpLWpzIGhpZ2gtbGV2ZWwgdmlldyB0aGF0IG93bnMgdGhlIHBlci1jaGFubmVsIGxheWVyIHNldCAoYnVpbGQgKyBsaXZlIGRpc3BsYXlcbiAgICogIHVwZGF0ZXMpIGZvciB0aGUgY3VycmVudCB7QGxpbmsgaW1hZ2VNb2RlfS4gUmVidWlsdCBvbiBlYWNoIChyZSlyZW5kZXIuICovXG4gIHByaXZhdGUgY2hhbm5lbFZpZXc6IE11bHRpQ2hhbm5lbEltYWdlVmlldyB8IG51bGwgPSBudWxsO1xuICAvKiogTGl2ZSBzdWJzY3JpcHRpb24gYXBwbHlpbmcgY2hhbm5lbC1zdGF0ZSAvIGNvbG9ybWFwIGNoYW5nZXMgdG8gdGhlIGxheWVycy4gKi9cbiAgcHJpdmF0ZSBkaXNwbGF5U3ViOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgLyoqIExhdGVzdCBncmF5c2NhbGUgY29sb3JtYXAgc2VsZWN0aW9uIGZyb20gdGhlIHN0b3JlIChhcHBsaWVkIHRvIHRoZSBzaW5nbGUgZ3JheSBsYXllcikuICovXG4gIHByaXZhdGUgY3VycmVudENvbG9ybWFwOiBDb2xvcm1hcE5vZGUgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjdXJyZW50UmV2ZXJzZSA9IGZhbHNlO1xuICAvKiogTGF0ZXN0IGludmVydCB0b2dnbGUgZnJvbSB0aGUgc3RvcmUgKGZsaXBzIGludGVuc2l0eSBiZWZvcmUgdGhlIGNvbG9ybWFwLCBsaWtlIE9TRCkuICovXG4gIHByaXZhdGUgaW52ZXJ0RW5hYmxlZCA9IGZhbHNlO1xuICAvKiogUGh5c2ljYWwgc2NhbGUgYmFyIG92ZXJsYXkgZm9yIHRoZSAyRCBpbWFnZSAobnVsbCB3aGVuIDNEIG9yIHRoZSBpbWFnZSBoYXMgbm8gwrVtL3BpeGVsKS4gKi9cbiAgcHJpdmF0ZSBzY2FsZUJhcjogTmFwYXJpU2NhbGVCYXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIFNWRyByZWdpb24tZHJhd2luZyBvdmVybGF5IGZvciB0aGUgMkQgaW1hZ2UgKG51bGwgdW50aWwgYSAyRCBpbWFnZSBpcyBwbG90dGVkKS4gKi9cbiAgcHJpdmF0ZSByZWdpb25PdmVybGF5OiBOYXBhcmlSZWdpb25PdmVybGF5IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBQaXhlbC10b29sIHBsdW1iaW5nOiB0aGUgcGxvdCBkaXYgaWQsIGNvb3JkIHRyYW5zZm9ybSwgYW5kIGJvdW5kIHRvb2wgaG9zdHMuICovXG4gIHByaXZhdGUgcGxvdERpdklkID0gJyc7XG4gIHByaXZhdGUgY29vcmRUcmFuc2Zvcm06IElDb29yZGluYXRlVHJhbnNmb3JtIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgd2FuZEhvc3Q6IFdhbmRUb29sSG9zdCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGVyYXNlckhvc3Q6IFZlcnRleEVyYXNlclRvb2xIb3N0IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBDYWNoZWQgQ2FjaGVkSW1hZ2VEYXRhIGJ1aWx0IGZyb20gdGhlIGxhc3QgcmVhZGJhY2sgKHJlYnVpbHQgd2hlbiBsYXN0UGl4ZWxzIGNoYW5nZXMpLiAqL1xuICBwcml2YXRlIGNhY2hlZEltYWdlOiBDYWNoZWRJbWFnZURhdGEgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjYWNoZWRJbWFnZVNvdXJjZTogUGl4ZWxEYXRhIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBWaXNpYmxlIHdvcmxkIHJlY3QgY2FwdHVyZWQgQVQgdGhlIGxhc3QgcmVhZGJhY2sg4oCUIG11c3QgcGFpciB3aXRoIGBsYXN0UGl4ZWxzYCBzbyB0aGUgcGl4ZWxcbiAgICogIHRvb2xzJyByYXRpb3Mvb3JpZ2luIG1hdGNoIHRoZSBtYXRyaXgncyBjYW1lcmEgKHVzaW5nIHRoZSBsaXZlIHJlY3QgYWZ0ZXIgYSBwYW4vem9vbSB3b3VsZFxuICAgKiAgbWlzLXNjYWxlIHRoZSByZWdpb24pLiAqL1xuICBwcml2YXRlIGxhc3RQaXhlbHNSZWN0OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBJbWFnZSBzbW9vdGhpbmcgKGJpbGluZWFyKSB2cyBuZWFyZXN0LW5laWdoYm91ciAoY3Jpc3AgcGl4ZWxzLCB0aGUgZGVmYXVsdCkuICovXG4gIHByaXZhdGUgaW1hZ2VTbW9vdGhpbmcgPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hlbiB0aGUgMkQgaW1hZ2UgaXMgcmVuZGVyZWQgdmlhIHB5cmFtaWRhbCBUaWxlZFNvdXJjZXMgKGRlc2NyaXB0b3IgYXZhaWxhYmxlKS4gKi9cbiAgcHJpdmF0ZSB0aWxlZCA9IGZhbHNlO1xuICAvKiogRGVib3VuY2VkIHJlYWRiYWNrIHRpbWVyICsgY2FtZXJhLWNoYW5nZSB1bnN1YnNjcmliZSAoa2VlcCBsYXN0UGl4ZWxzIGN1cnJlbnQgZm9yIHRvb2xzKS4gKi9cbiAgcHJpdmF0ZSByZWFkYmFja1RpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNhbWVyYVJlYWRiYWNrT2ZmOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgLyoqIENvYXJzZSBwZXItY2hhbm5lbCBsdW1pbmFuY2Ugc2FtcGxlIChrZXllZCBieSBjaGFubmVsIGluZGV4KSBmb3IgdGhlIGhpc3RvZ3JhbSBpbiB0aWxlZCBtb2RlLFxuICAgKiAgd2hlcmUgdGhlIGxheWVycyBoYXZlIG5vIGZ1bGwgaW4tbWVtb3J5IHBpeGVscy4gUmVmcmVzaGVkIG9uIHBsb3QgKyBzbGljZSBjaGFuZ2UuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaGlzdFNhbXBsZXMgPSBuZXcgTWFwPG51bWJlciwgVWludDhBcnJheT4oKTtcbiAgLyoqIE5hdGl2ZS1iaXQtZGVwdGggaGlzdG9ncmFtcyBmcm9tIGAvaGlzdG9ncmFtYCwga2V5ZWQgYCR7en18JHtjaGFubmVsfWAgKD44LWJpdCBpbWFnZXMpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IG5hdGl2ZUhpc3RvZ3JhbXMgPSBuZXcgTWFwPHN0cmluZywgSUhpc3RvZ3JhbT4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHN0YWNrTG9hZGluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFja0xvYWRpbmdQcm9ncmVzcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXV0b3NjYWxlRXZlbnQkID0gbmV3IFN1YmplY3Q8dW5rbm93bj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlbnNpdHlQcm9maWxlJCA9IG5ldyBTdWJqZWN0PEludGVuc2l0eVByb2ZpbGVbXT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSB2aWV3cG9ydENoYW5nZSQgPSBuZXcgU3ViamVjdDx7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xuICB9PigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoVElMRV9BQ0NFU1NfUE9SVCkgcHJpdmF0ZSByZWFkb25seSB0aWxlczogVGlsZUFjY2Vzc1BvcnQsXG4gICAgc3RvcmU6IFZpc3VhbGl6ZXJTdG9yZSxcbiAgICByZWdpb25TdG9yZTogUmVnaW9uU3RvcmUsXG4gICAgcHJpdmF0ZSByZWFkb25seSB3YW5kVG9vbDogV2FuZFRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYnJ1c2hUb29sOiBCcnVzaFRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZXJhc2VyVG9vbDogVmVydGV4RXJhc2VyVG9vbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSB6b29tVG9Cb3hUb29sOiBab29tVG9Cb3hUb29sU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNhbVRvb2w6IFNhbVRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2FtUG9pbnRUb29sOiBTYW1Qb2ludFRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2VsbFNlZ21lbnRUb29sOiBDZWxsU2VnbWVudFRvb2xTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQ0VMTF9TRUdNRU5URVIpIHByaXZhdGUgcmVhZG9ubHkgY2VsbFNlZ21lbnRlcjogSUNlbGxTZWdtZW50ZXIgfCBudWxsLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2ltcGxlU3RhY2s6IFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZSxcbiAgICBASW5qZWN0KFZJWl9DT05GSUcpIGNvbmZpZzogVml6Q29uZmlnLFxuICAgIC8vIE9wdGlvbmFsOiBvbmx5IGEgaG9zdCB0aGF0IHNlcnZlcyBzcGF0aWFsLW9taWNzIGRhdGEgcHJvdmlkZXMgaXQsIGFuZFxuICAgIC8vIHdpdGhvdXQgaXQgdGhlIFNQQVRJQUxfT01JQ1MgcGxvdCB0eXBlIGlzIG5ldmVyIG9mZmVyZWQgYW55d2F5LlxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoU1BBVElBTF9EQVRBX1BPUlQpIHByaXZhdGUgcmVhZG9ubHkgc3BhdGlhbERhdGE6IFNwYXRpYWxEYXRhUG9ydCB8IG51bGwgPSBudWxsLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0aW9uU3RvcmU6IFNwYXRpYWxTZWxlY3Rpb25TdG9yZSB8IG51bGwgPSBudWxsLFxuICApIHtcbiAgICBzdXBlcihyZWdpb25TdG9yZSwgc3RvcmUpO1xuICAgIHRoaXMuYXBpID0gY29uZmlnLnNsaWRlQ3JvcFNlcnZlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCArIGNhY2hlIHRoZSBzZXJ2ZXIgcHlyYW1pZCBkZXNjcmlwdG9yIChgR0VUIC90aWxlcy9pbmZvYCk6IHRoZSBSRUFMIHBlci1sZXZlbCB0aWxlIGdyaWQsXG4gICAqIHRpbGUgc2l6ZSwgY2hhbm5lbCBtZXRhZGF0YSBhbmQgcGh5c2ljYWwgcGl4ZWwgc2l6ZS4gVGhlIGJhY2tlbmQgcmV0dXJucyAyMDIgd2hpbGUgdGhlIHNvdXJjZVxuICAgKiBpcyBzdGlsbCBjYWNoaW5nLCBzbyB3ZSBwb2xsIGJyaWVmbHkuIENhY2hlZCBwZXIgYGluZm9CNjRgOyByZXR1cm5zIG51bGwgaWYgaXQgbmV2ZXIgYmVjb21lc1xuICAgKiByZWFkeSAoY2FsbGVycyBmYWxsIGJhY2sgdG8gYSBzaW5nbGUtdGlsZSBmZXRjaCkuIFRoaXMgaXMgdGhlIGF1dGhvcml0YXRpdmUgZ3JpZCDigJQgZ3Vlc3NpbmdcbiAgICogbGV2ZWwgZGltcyBmcm9tIGB0cnVlSW1hZ2VTaXplYCBvdmVyc2hvb3RzIHRoZSByZWFsIGdyaWQgYW5kIHRoZSBzZXJ2ZXIgNDAwcyBvdXQtb2YtcmFuZ2UgdGlsZXMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZURlc2NyaXB0b3IoKTogUHJvbWlzZTxUaWxlRGVzY3JpcHRvciB8IG51bGw+IHtcbiAgICAvLyBTZWxmLWNvbnRhaW5lZCBtdWx0aS1zbGljZSBzdGFjayAobm8gdGlsZSBzZXJ2ZXIg4oCUIGUuZy4gYSBudW1iZXJlZCBpbWFnZVxuICAgIC8vIHNlcmllcyBhc3NlbWJsZWQgY2xpZW50LXNpZGUsIGVhY2ggc2xpY2UgYSBkaWZmZXJlbnQgZmlsZSk6IHRoZXJlIGlzIG5vXG4gICAgLy8gc2luZ2xlIHNlcnZlci10aWxlZCBweXJhbWlkIHRvIGRlc2NyaWJlLiBSZXR1cm5pbmcgbnVsbCByb3V0ZXMgZXZlcnlcbiAgICAvLyBjYWxsZXIgKDJEIGltYWdlLCB2b2x1bWUsIHN1cmZhY2UpIHRvIHRoZWlyIHN0aXRjaGVkL3NpbmdsZS1mZXRjaFxuICAgIC8vIGZhbGxiYWNrLCB3aGljaCDigJQgdmlhIGZldGNoU2xpY2UncyBvd24gU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlIGJyYW5jaCDigJRcbiAgICAvLyBjb3JyZWN0bHkgZmV0Y2hlcyBlYWNoIHNsaWNlJ3Mgb3duIFVSTCBpbnN0ZWFkIG9mIG9uZSBmaXhlZCBmaWxlJ3MgdGlsZVxuICAgIC8vIHB5cmFtaWQuXG4gICAgaWYgKHRoaXMuc2ltcGxlU3RhY2suaXNTaW1wbGUodGhpcy5sb2FkZWQ/LmltYWdlSW5mbykpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGluZm9CNjQgPSB0aGlzLnRpbGVzLmdldFNlbGVjdGVkSW5mb0I2NCgpO1xuICAgIGlmICghaW5mb0I2NCkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMuZGVzY3JpcHRvciAmJiB0aGlzLmRlc2NyaXB0b3JLZXkgPT09IGluZm9CNjQpIHJldHVybiB0aGlzLmRlc2NyaXB0b3I7XG4gICAgY29uc3QgaGVhZGVycyA9IGF3YWl0IHRoaXMudGlsZXNcbiAgICAgIC5nZXRBdXRoSGVhZGVycygpXG4gICAgICAuY2F0Y2goKCkgPT4gKHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmFwaX10aWxlcy9pbmZvP2luZm89JHtpbmZvQjY0fWA7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgREVTQ1JJUFRPUl9USU1FT1VUX01TO1xuICAgIGZvciAoOzspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVycyB9KTtcbiAgICAgICAgaWYgKHJlc3Auc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICBjb25zdCBib2R5ID0gKGF3YWl0IHJlc3AuanNvbigpKSBhcyBUaWxlRGVzY3JpcHRvcjtcbiAgICAgICAgICBpZiAoYm9keT8ubGV2ZWxzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRvciA9IGJvZHk7XG4gICAgICAgICAgICB0aGlzLmRlc2NyaXB0b3JLZXkgPSBpbmZvQjY0O1xuICAgICAgICAgICAgcmV0dXJuIGJvZHk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIDIwMiAoc3RpbGwgY2FjaGluZykgb3IgZW1wdHkgYm9keSDihpIgcmUtcG9sbCB1bnRpbCB0aGUgZGVhZGxpbmUuXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSB0aWxlcy9pbmZvIHBvbGwgcmV0cnknLCBlcnIpO1xuICAgICAgfVxuICAgICAgaWYgKERhdGUubm93KCkgPiBkZWFkbGluZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIHRpbGVzL2luZm8gbm90IHJlYWR5OyBmYWxsaW5nIGJhY2sgdG8gc2luZ2xlLXRpbGUgZmV0Y2gnKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCAxMjAwKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGEgQ09NUExFVEUgcmVuZGVyZWQgc2xpY2UgYXMgYW4gYEltYWdlQml0bWFwYCBieSBzdGl0Y2hpbmcgdGhlIHNlcnZlcidzIFJFQUwgdGlsZSBncmlkXG4gICAqIChmcm9tIGAvdGlsZXMvaW5mb2ApIOKAlCBub3QganVzdCB0aGUgdG9wLWxlZnQgdGlsZSwgd2hpY2ggb25seSBldmVyIHNob3dlZCBhIGxhcmdlIGltYWdlJ3NcbiAgICogY29ybmVyLiBQaWNrcyB0aGUgZmluZXN0IHB5cmFtaWQgbGV2ZWwgd2hvc2UgZ3JpZCBmaXRzIGBidWRnZXRUaWxlc2AgYW5kIHdob3NlIGxvbmdlc3Qgc2lkZSBpc1xuICAgKiB3aXRoaW4gdGhlIEdQVSB0ZXh0dXJlIGxpbWl0LCBmZXRjaGVzIHRoYXQgZ3JpZCBjb25jdXJyZW50bHksIGFuZCBzdGl0Y2hlcyBpdCBpbnRvIG9uZSBjYW52YXMuXG4gICAqXG4gICAqIGBjaGFubmVsYCBzZWxlY3RzIGEgc2luZ2xlIGJhbmQgYXMgZ3JheXNjYWxlIChyZWFsIGxldmVscyBvbmx5KTsgb21pdCBmb3IgdGhlIHNlcnZlciBjb21wb3NpdGUuXG4gICAqIGBidWRnZXRUaWxlc2AgY2FwcyB0aGUgZ3JpZDogdGhlIDJEIHZpZXcgdXNlcyB0aGUgZnVsbCBidWRnZXQgZm9yIGRldGFpbDsgdGhlIDNEIHZvbHVtZSBwYXNzZXNcbiAgICogMSBmb3IgYSBjaGVhcCBvdmVydmlldyB0aWxlIHBlciBzbGljZSAoaXQgZG93bnNhbXBsZXMgdG8ge0BsaW5rIFZPTFVNRV9NQVhfU0xJQ0V9KS4gRmFsbHMgYmFja1xuICAgKiB0byBhIHNpbmdsZSBgY29sPTAscm93PTBgIHRpbGUgd2hlbiBubyBkZXNjcmlwdG9yIGlzIGF2YWlsYWJsZSAoc21hbGwvc2ltcGxlIGltYWdlcywgdm9sdW1lcykuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoU2xpY2UoXG4gICAgejogbnVtYmVyLFxuICAgIGNoYW5uZWw/OiBudW1iZXIsXG4gICAgYnVkZ2V0VGlsZXM6IG51bWJlciA9IE1BWF9TVElUQ0hfVElMRVMsXG4gICAgLyoqIFdoZW4gYSBzcGVjaWZpYyBjaGFubmVsIGhhcyBubyBweXJhbWlkIGxldmVsIHdpdGhpbiBgYnVkZ2V0VGlsZXNgLCBkcm9wIHRvIHRoZSBzZXJ2ZXJcbiAgICAgKiAgQ09NUE9TSVRFIG92ZXJ2aWV3IGluc3RlYWQgb2Ygc3RpdGNoaW5nIHRoZSBodWdlIHBlci1jaGFubmVsIGxldmVsLiBPbmx5IHNhZmUgd2hlbiB0aGUgY2FsbGVyXG4gICAgICogIHdhbnRzIGEgc2luZ2xlIGRlY2ltYXRlZCBwbGFuZSAodGhlIHN1cmZhY2UgaGVpZ2h0KTogZm9yIGEgbXVsdGljaGFubmVsIFZPTFVNRSBldmVyeSBjaGFubmVsXG4gICAgICogIHdvdWxkIHRoZW4gZmV0Y2ggdGhlIHNhbWUgY29tcG9zaXRlIGFuZCB0aGUgY2hhbm5lbHMgd291bGQgY29sbGFwc2UgaW50byBvbmUsIHNvIHZvbHVtZVxuICAgICAqICBhc3NlbWJseSBsZWF2ZXMgdGhpcyBgZmFsc2VgIHRvIGtlZXAgZWFjaCBiYW5kIGRpc3RpbmN0LiAqL1xuICAgIGFsbG93Q29tcG9zaXRlRmFsbGJhY2sgPSBmYWxzZSxcbiAgKTogUHJvbWlzZTxJbWFnZUJpdG1hcD4ge1xuICAgIC8vIFNlbGYtY29udGFpbmVkIG11bHRpLXNsaWNlIHN0YWNrICh0aWxlZDpmYWxzZSk6IGB6YCBpbmRleGVzIGEgY29tcGxldGVseVxuICAgIC8vIGRpZmZlcmVudCBmaWxlJ3Mgb3duIHByZXZpZXcgVVJMLCBub3QgYW4gaW50ZXJuYWwgc2xpY2Ugb2Ygb25lIHNlcnZlci1cbiAgICAvLyB0aWxlZCBmaWxlIOKAlCByZXNvbHZlZCBhbmQgZmV0Y2hlZCB2aWEgU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlIChzaGFyZWRcbiAgICAvLyB3aXRoIE9TRDsgc2VlIGl0cyBkb2NzIGZvciB3aHkgdGhpcyBjYW4ndCBiZSBhIGJhcmUgZmV0Y2goKSkgaW5zdGVhZCBvZlxuICAgIC8vIGJ1aWxkaW5nIGEgL3RpbGU/aW5mbz0uLi4mej0gcmVxdWVzdCBhZ2FpbnN0IHdoaWNoZXZlciBzaW5nbGUgZmlsZVxuICAgIC8vIGdldFNlbGVjdGVkSW5mb0I2NCgpIHBvaW50cyBhdCAod2hpY2ggd291bGQgNDAwL21pc21hdGNoIGZvciBhbnkgelxuICAgIC8vIGJleW9uZCB0aGF0IG9uZSBmaWxlJ3Mgb3duIGV4dGVudCkuXG4gICAgY29uc3QgaW5mbyA9IHRoaXMubG9hZGVkPy5pbWFnZUluZm87XG4gICAgaWYgKHRoaXMuc2ltcGxlU3RhY2suaXNTaW1wbGUoaW5mbykpIHtcbiAgICAgIC8vIFNlcnZlcmxlc3MgbXVsdGljaGFubmVsIHZvbHVtZTogZmV0Y2ggdGhlIHJlcXVlc3RlZCBjaGFubmVsJ3MgT1dOIHBsYW5lXG4gICAgICAvLyAoY2hhbm5lbFVybHNbel1bY2hhbm5lbF0pIHNvIGVhY2ggYmFuZCBzdGF5cyBkaXN0aW5jdCDigJQgdGhlIGNsaWVudC1zaWRlXG4gICAgICAvLyBhbmFsb2cgb2YgdGhlIHNlcnZlcidzIHBlci1jaGFubmVsIC90aWxlP2NoYW5uZWw9Yy4gRWxzZSB0aGUgei1hbmNob3IgVVJMLlxuICAgICAgY29uc3QgY2hVcmxzID0gKGluZm8gYXMgSUltYWdlSW5mbykuY2hhbm5lbFVybHM7XG4gICAgICBjb25zdCB1cmwgPSBjaGFubmVsICE9IG51bGwgJiYgY2hVcmxzPy5bel0/LltjaGFubmVsXSAhPSBudWxsXG4gICAgICAgID8gY2hVcmxzW3pdW2NoYW5uZWxdXG4gICAgICAgIDogdGhpcy5zaW1wbGVTdGFjay51cmxGb3IoaW5mbyBhcyBJSW1hZ2VJbmZvLCB6KTtcbiAgICAgIGlmICghdXJsKSB0aHJvdyBuZXcgRXJyb3IoYFtuYXBhcmktanNdIG5vIFVSTCBmb3Igc2xpY2UgJHt6fWApO1xuICAgICAgcmV0dXJuIHRoaXMuc2ltcGxlU3RhY2suZmV0Y2hBc0JpdG1hcCh1cmwpO1xuICAgIH1cbiAgICBjb25zdCBpbmZvQjY0ID0gdGhpcy50aWxlcy5nZXRTZWxlY3RlZEluZm9CNjQoKTtcbiAgICBpZiAoIWluZm9CNjQpIHRocm93IG5ldyBFcnJvcignW25hcGFyaS1qc10gbm8gc2VsZWN0ZWQgaW1hZ2UgaW5mbyAoZ2V0U2VsZWN0ZWRJbmZvQjY0IG51bGwpJyk7XG4gICAgY29uc3QgaGVhZGVycyA9IGF3YWl0IHRoaXMudGlsZXNcbiAgICAgIC5nZXRBdXRoSGVhZGVycygpXG4gICAgICAuY2F0Y2goKCkgPT4gKHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTtcbiAgICBjb25zdCBkZXNjID0gYXdhaXQgdGhpcy5lbnN1cmVEZXNjcmlwdG9yKCk7XG5cbiAgICAvLyBUaGUgcmVxdWVzdGVkIGJhbmQ7IG1heSBiZSBkcm9wcGVkIHRvIHRoZSBjb21wb3NpdGUgKHVuZGVmaW5lZCkgYmVsb3cgd2hlbiB0aGUgY2hhbm5lbCBoYXMgbm9cbiAgICAvLyBweXJhbWlkIGxldmVsIHNtYWxsIGVub3VnaCB0byBzdGl0Y2ggd2l0aGluIGJ1ZGdldC5cbiAgICBsZXQgZWZmZWN0aXZlQ2hhbm5lbCA9IGNoYW5uZWw7XG4gICAgY29uc3QgZmV0Y2hUaWxlID0gYXN5bmMgKFxuICAgICAgcmVzOiBudW1iZXIsXG4gICAgICBjb2w6IG51bWJlcixcbiAgICAgIHJvdzogbnVtYmVyLFxuICAgICAgdDogbnVtYmVyLFxuICAgICk6IFByb21pc2U8SW1hZ2VCaXRtYXA+ID0+IHtcbiAgICAgIGNvbnN0IGNoID0gZWZmZWN0aXZlQ2hhbm5lbCA9PSBudWxsID8gJycgOiBgJmNoYW5uZWw9JHtlZmZlY3RpdmVDaGFubmVsfWA7XG4gICAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmFwaX10aWxlP2luZm89JHtpbmZvQjY0fSZyZXM9JHtyZXN9JmNvbD0ke2NvbH0mcm93PSR7cm93fSZ6PSR7en0mdGlsZVNpemU9JHt0fSR7Y2h9YDtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVycyB9KTtcbiAgICAgIGlmICghcmVzcC5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtuYXBhcmktanNdIHNsaWNlIGZldGNoIGZhaWxlZDogJHtyZXNwLnN0YXR1c30gKCR7Y29sfS8ke3Jvd30gcmVzICR7cmVzfSlgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVJbWFnZUJpdG1hcChhd2FpdCByZXNwLmJsb2IoKSk7XG4gICAgfTtcblxuICAgIC8vIE5vIGRlc2NyaXB0b3Ig4oaSIHNpbmdsZSB0b3AtbGVmdCB0aWxlIChsZWdhY3kgZmFsbGJhY2s7IGNvcnJlY3QgZm9yIHNtYWxsL3NpbXBsZSBpbWFnZXMpLlxuICAgIGlmICghZGVzYyB8fCAhZGVzYy5sZXZlbHM/Lmxlbmd0aCkgcmV0dXJuIGZldGNoVGlsZSgwLCAwLCAwLCBUSUxFX1NJWkUpO1xuXG4gICAgY29uc3QgdCA9IGRlc2MudGlsZVNpemUgfHwgVElMRV9TSVpFO1xuICAgIC8vIFBlci1jaGFubmVsIHRpbGVzIGV4aXN0IE9OTFkgYXQgUkVBTCBCaW8tRm9ybWF0cyBsZXZlbHMgKHRoZSBmcm9udCBvZiBgbGV2ZWxzYCk7IHRoZSBzZXJ2ZXJcbiAgICAvLyBjb21wb3NpdGUgZXhpc3RzIGF0IGV2ZXJ5IGxldmVsLCBpbmNsdWRpbmcgdGhlIHNtYWxsIG92ZXJ2aWV3cy5cbiAgICBjb25zdCBwZXJDaGFubmVsTGV2ZWxzID0gZGVzYy5yZWFsTGV2ZWxzID8/IGRlc2MubGV2ZWxzLmxlbmd0aDtcbiAgICBjb25zdCB1c2FibGUgPVxuICAgICAgY2hhbm5lbCA9PSBudWxsID8gZGVzYy5sZXZlbHMgOiBkZXNjLmxldmVscy5zbGljZSgwLCBNYXRoLm1heCgxLCBwZXJDaGFubmVsTGV2ZWxzKSk7XG5cbiAgICAvLyBGaW5lc3QgbGV2ZWwgd2hvc2Ugc3RpdGNoZWQgZ3JpZCBmaXRzIEJPVEggdGhlIHRpbGUgYnVkZ2V0IGFuZCB0aGUgR1BVIHRleHR1cmUgbGltaXQ7IGlmIG5vbmVcbiAgICAvLyBmaXRzLCB0aGUgY29hcnNlc3QgYXZhaWxhYmxlIChmaXRzPWZhbHNlKS5cbiAgICBjb25zdCB0aWxlc0ZvciA9IChsdmw6IFRpbGVMZXZlbCk6IG51bWJlciA9PlxuICAgICAgTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGx2bC53aWR0aCAvIHQpKSAqIE1hdGgubWF4KDEsIE1hdGguY2VpbChsdmwuaGVpZ2h0IC8gdCkpO1xuICAgIGNvbnN0IHBpY2sgPSAobGV2ZWxzOiBUaWxlTGV2ZWxbXSk6IHsgbHZsOiBUaWxlTGV2ZWw7IGZpdHM6IGJvb2xlYW4gfSA9PiB7XG4gICAgICBsZXQgYyA9IGxldmVsc1swXTtcbiAgICAgIGZvciAoY29uc3QgbHZsIG9mIGxldmVscykge1xuICAgICAgICBjID0gbHZsO1xuICAgICAgICBpZiAodGlsZXNGb3IobHZsKSA8PSBidWRnZXRUaWxlcyAmJiBNYXRoLm1heChsdmwud2lkdGgsIGx2bC5oZWlnaHQpIDw9IE1BWF9URVhUVVJFX0RJTSkge1xuICAgICAgICAgIHJldHVybiB7IGx2bCwgZml0czogdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4geyBsdmw6IGMsIGZpdHM6IGZhbHNlIH07XG4gICAgfTtcblxuICAgIGxldCBzZWwgPSBwaWNrKHVzYWJsZSk7XG4gICAgLy8gQSBzcGVjaWZpYyBjaGFubmVsIG9ubHkgaGFzIHRpbGVzIGF0IHRoZSAoZmV3LCBsYXJnZSkgcmVhbCBsZXZlbHMuIFdoZW4gbm9uZSBvZiB0aGVtIGZpdCB0aGVcbiAgICAvLyBidWRnZXQg4oCUIGUuZy4gdGhlIGNvYXJzZXN0IHJlYWwgbGV2ZWwgaXMgc3RpbGwgMTQ5ODLDlzE4NjcwIOKGkiB+MTEwMCBmdWxsLXJlcyB0aWxlcyDigJQgc3RpdGNoaW5nXG4gICAgLy8gaXQgcGVyIHNsaWNlIGZsb29kcyB0aGUgc2VydmVyICg1MDRzKSBhbmQgc3RhbGxzIHRoZSBsb2FkLiBUaGUgY29tcG9zaXRlIHB5cmFtaWQgaGFzIHNtYWxsXG4gICAgLy8gb3ZlcnZpZXcgbGV2ZWxzLCBzbyBmZXRjaCB0aGUgY29tcG9zaXRlIGluc3RlYWQgYW5kIGRlcml2ZSBsdW1pbmFuY2UgZnJvbSBpdC4gRXZlcnkgY2FsbGVyIGhlcmVcbiAgICAvLyAoc3VyZmFjZSBoZWlnaHQsIHZvbHVtZSBhc3NlbWJseSwgcmVhZGJhY2spIGRvd25zY2FsZXMgdGhlIHBsYW5lIGFueXdheSwgc28gYSBjb21wb3NpdGUtZGVyaXZlZFxuICAgIC8vIHBsYW5lIGlzIHRoZSByaWdodCB0cmFkZSBmb3Igb25lIHRoYXQgYWN0dWFsbHkgbG9hZHMuIE9ubHkga2lja3MgaW4gd2hlbiB0aGUgY2hhbm5lbCBjYW4ndCBmaXQuXG4gICAgaWYgKGFsbG93Q29tcG9zaXRlRmFsbGJhY2sgJiYgIXNlbC5maXRzICYmIGNoYW5uZWwgIT0gbnVsbCAmJiBkZXNjLmxldmVscy5sZW5ndGggPiBwZXJDaGFubmVsTGV2ZWxzKSB7XG4gICAgICBjb25zdCBjb21wb3NpdGUgPSBwaWNrKGRlc2MubGV2ZWxzKTtcbiAgICAgIGlmIChjb21wb3NpdGUuZml0cyB8fCB0aWxlc0Zvcihjb21wb3NpdGUubHZsKSA8IHRpbGVzRm9yKHNlbC5sdmwpKSB7XG4gICAgICAgIGVmZmVjdGl2ZUNoYW5uZWwgPSB1bmRlZmluZWQ7XG4gICAgICAgIHNlbCA9IGNvbXBvc2l0ZTtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbbmFwYXJpLWpzXSBjaGFubmVsICR7Y2hhbm5lbH0gaGFzIG5vIHB5cmFtaWQgbGV2ZWwgd2l0aGluIHRoZSAke2J1ZGdldFRpbGVzfS10aWxlIGAgK1xuICAgICAgICAgICAgYGJ1ZGdldDsgdXNpbmcgdGhlIGNvbXBvc2l0ZSBvdmVydmlldyAocmVzICR7c2VsLmx2bC5yZXN9LCAke3NlbC5sdmwud2lkdGh9w5dgICtcbiAgICAgICAgICAgIGAke3NlbC5sdmwuaGVpZ2h0fSkgZm9yIHRoaXMgcGxhbmUuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY2hvc2VuID0gc2VsLmx2bDtcbiAgICBjb25zdCBjb2xzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGNob3Nlbi53aWR0aCAvIHQpKTtcbiAgICBjb25zdCByb3dzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGNob3Nlbi5oZWlnaHQgLyB0KSk7XG4gICAgaWYgKCFzZWwuZml0cyAmJiBidWRnZXRUaWxlcyA9PT0gTUFYX1NUSVRDSF9USUxFUykge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW25hcGFyaS1qc10gZnVsbCByZXNvbHV0aW9uIGV4Y2VlZHMgdGhlICR7YnVkZ2V0VGlsZXN9LXRpbGUvJHtNQVhfVEVYVFVSRV9ESU19cHggYnVkZ2V0OyBgICtcbiAgICAgICAgICBgZGlzcGxheWluZyBvdmVydmlldyBsZXZlbCByZXMgJHtjaG9zZW4ucmVzfSAoJHtjaG9zZW4ud2lkdGh9w5cke2Nob3Nlbi5oZWlnaHR9KS5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoY29scyA9PT0gMSAmJiByb3dzID09PSAxKSByZXR1cm4gZmV0Y2hUaWxlKGNob3Nlbi5yZXMsIDAsIDAsIHQpO1xuXG4gICAgLy8gU3RpdGNoIGludG8gb25lIGxldmVsLXNpemVkIGNhbnZhcy4gRmV0Y2ggdGhlIGdyaWQgd2l0aCBCT1VOREVEIGNvbmN1cnJlbmN5OiBmaXJpbmcgZXZlcnkgdGlsZVxuICAgIC8vIGF0IG9uY2UgKGEgYmlnIGdyaWQgPSBodW5kcmVkcyBvZiByZXF1ZXN0cykgb3ZlcndoZWxtZWQgdGhlIHRpbGUgc2VydmVyICg1MDRzKS4gRWRnZSB0aWxlcyBhcmVcbiAgICAvLyBuYXJyb3dlci9zaG9ydGVyOyBkcmF3SW1hZ2UgcGxhY2VzIGVhY2ggYXQgaXRzIGdyaWQgb2Zmc2V0IHNvIHBhcnRpYWwgdGlsZXMgbGluZSB1cC5cbiAgICBjb25zdCBjb29yZHM6IEFycmF5PHsgY29sOiBudW1iZXI7IHJvdzogbnVtYmVyIH0+ID0gW107XG4gICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgcm93czsgcm93KyspIHtcbiAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IGNvbHM7IGNvbCsrKSBjb29yZHMucHVzaCh7IGNvbCwgcm93IH0pO1xuICAgIH1cbiAgICBjb25zdCB0aWxlczogQXJyYXk8eyBjb2w6IG51bWJlcjsgcm93OiBudW1iZXI7IGJtcDogSW1hZ2VCaXRtYXAgfT4gPSBbXTtcbiAgICBjb25zdCBzdGl0Y2hXb3JrZXIgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIGNvbnN0IGpvYiA9IGNvb3Jkcy5zaGlmdCgpO1xuICAgICAgICBpZiAoIWpvYikgcmV0dXJuO1xuICAgICAgICBjb25zdCBibXAgPSBhd2FpdCBmZXRjaFRpbGUoY2hvc2VuLnJlcywgam9iLmNvbCwgam9iLnJvdywgdCk7XG4gICAgICAgIHRpbGVzLnB1c2goeyBjb2w6IGpvYi5jb2wsIHJvdzogam9iLnJvdywgYm1wIH0pO1xuICAgICAgfVxuICAgIH07XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBBcnJheS5mcm9tKHsgbGVuZ3RoOiBNYXRoLm1pbihUSUxFX0ZFVENIX0NPTkNVUlJFTkNZLCBjb29yZHMubGVuZ3RoKSB9LCAoKSA9PiBzdGl0Y2hXb3JrZXIoKSksXG4gICAgKTtcblxuICAgIGxldCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgT2Zmc2NyZWVuQ2FudmFzO1xuICAgIGlmICh0eXBlb2YgT2Zmc2NyZWVuQ2FudmFzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyhjaG9zZW4ud2lkdGgsIGNob3Nlbi5oZWlnaHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgIGNhbnZhcy53aWR0aCA9IGNob3Nlbi53aWR0aDtcbiAgICAgIGNhbnZhcy5oZWlnaHQgPSBjaG9zZW4uaGVpZ2h0O1xuICAgIH1cbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKSBhc1xuICAgICAgfCBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRcbiAgICAgIHwgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICB8IG51bGw7XG4gICAgaWYgKCFjdHgpIHRocm93IG5ldyBFcnJvcignW25hcGFyaS1qc10gc2xpY2Ugc3RpdGNoOiAyRCBjb250ZXh0IHVuYXZhaWxhYmxlJyk7XG4gICAgZm9yIChjb25zdCB7IGNvbCwgcm93LCBibXAgfSBvZiB0aWxlcykge1xuICAgICAgY3R4LmRyYXdJbWFnZShibXAsIGNvbCAqIHQsIHJvdyAqIHQpO1xuICAgICAgYm1wLmNsb3NlPy4oKTtcbiAgICB9XG5cbiAgICAvLyBTYWZldHkgbmV0OiBpZiB0aGUgY2hvc2VuIGxldmVsIHN0aWxsIGV4Y2VlZHMgdGhlIEdQVSB0ZXh0dXJlIGxpbWl0IChlLmcuIGEgbXVsdGljaGFubmVsXG4gICAgLy8gaW1hZ2Ugd2hvc2UgY29hcnNlc3QgUkVBTCBsZXZlbCBpcyBodWdlIOKAlCBvdmVydmlldyBsZXZlbHMgYXJlIGNvbXBvc2l0ZS1vbmx5KSwgZG93bnNjYWxlIHRoZVxuICAgIC8vIHN0aXRjaGVkIGNhbnZhcyB0byBmaXQgc28gdGhlIFdlYkdQVSB0ZXh0dXJlIHVwbG9hZCBjYW4ndCBmYWlsLlxuICAgIGNvbnN0IGxvbmdlc3QgPSBNYXRoLm1heChjaG9zZW4ud2lkdGgsIGNob3Nlbi5oZWlnaHQpO1xuICAgIGlmIChsb25nZXN0ID4gTUFYX1RFWFRVUkVfRElNKSB7XG4gICAgICBjb25zdCBzY2FsZSA9IE1BWF9URVhUVVJFX0RJTSAvIGxvbmdlc3Q7XG4gICAgICBjb25zdCBvdXRXID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihjaG9zZW4ud2lkdGggKiBzY2FsZSkpO1xuICAgICAgY29uc3Qgb3V0SCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IoY2hvc2VuLmhlaWdodCAqIHNjYWxlKSk7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbbmFwYXJpLWpzXSBzdGl0Y2hlZCBsZXZlbCAke2Nob3Nlbi53aWR0aH3DlyR7Y2hvc2VuLmhlaWdodH0gZXhjZWVkcyB0aGUgYCArXG4gICAgICAgICAgYCR7TUFYX1RFWFRVUkVfRElNfXB4IHRleHR1cmUgbGltaXQ7IGRvd25zY2FsaW5nIHRvICR7b3V0V33DlyR7b3V0SH0uYCxcbiAgICAgICk7XG4gICAgICBsZXQgb3V0OiBIVE1MQ2FudmFzRWxlbWVudCB8IE9mZnNjcmVlbkNhbnZhcztcbiAgICAgIGlmICh0eXBlb2YgT2Zmc2NyZWVuQ2FudmFzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBvdXQgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKG91dFcsIG91dEgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIG91dC53aWR0aCA9IG91dFc7XG4gICAgICAgIG91dC5oZWlnaHQgPSBvdXRIO1xuICAgICAgfVxuICAgICAgY29uc3Qgb2N0eCA9IG91dC5nZXRDb250ZXh0KCcyZCcpIGFzXG4gICAgICAgIHwgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICAgIHwgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICAgIHwgbnVsbDtcbiAgICAgIGlmICghb2N0eCkgdGhyb3cgbmV3IEVycm9yKCdbbmFwYXJpLWpzXSBzbGljZSBkb3duc2NhbGU6IDJEIGNvbnRleHQgdW5hdmFpbGFibGUnKTtcbiAgICAgIG9jdHguZHJhd0ltYWdlKGNhbnZhcyBhcyB1bmtub3duIGFzIENhbnZhc0ltYWdlU291cmNlLCAwLCAwLCBvdXRXLCBvdXRIKTtcbiAgICAgIHJldHVybiBjcmVhdGVJbWFnZUJpdG1hcChvdXQgYXMgdW5rbm93biBhcyBJbWFnZUJpdG1hcFNvdXJjZSk7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVJbWFnZUJpdG1hcChjYW52YXMgYXMgdW5rbm93biBhcyBJbWFnZUJpdG1hcFNvdXJjZSk7XG4gIH1cblxuICAvLyDilIDilIAgSURhdGFSZW5kZXJlcjogbG9hZCAvIHJlbmRlciAvIHZpZXdwb3J0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBhc3luYyBsb2FkKGltYWdlSW5mbzogSUltYWdlSW5mbywgekluZGV4OiBudW1iZXIpOiBQcm9taXNlPE5hcGFyaUxvYWRlZD4ge1xuICAgIC8vIEtlZXBzIFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZSdzIGJsb2IgY2FjaGUgaW4gc3luYyBldmVuIHdoZW4gdGhlIHVzZXJcbiAgICAvLyBzd2l0Y2hlcyBiYWNrZW5kcyAoZS5nLiBPU0QgSW1hZ2Ug4oaSIG5hcGFyaSBWb2x1bWUpIG9uIHRoZSBzYW1lIGZpbGUg4oCUXG4gICAgLy8gd2hpY2hldmVyIGJhY2tlbmQgbG9hZHMgYSBnZW51aW5lbHkgZGlmZmVyZW50IGZpbGUgZmlyc3QgZXZpY3RzIGl0LlxuICAgIHRoaXMuc2ltcGxlU3RhY2subm90ZUFjdGl2ZUZpbGUoaW1hZ2VJbmZvLmZpbGVOYW1lKTtcbiAgICB0aGlzLmxvYWRlZCA9IHsgaW1hZ2VJbmZvLCB6OiB6SW5kZXgsIGZpbGVuYW1lOiBpbWFnZUluZm8uZmlsZU5hbWUgfTtcbiAgICByZXR1cm4gdGhpcy5sb2FkZWQ7XG4gIH1cblxuICBhc3luYyBwbG90KFxuICAgIHBsb3REaXY6IHN0cmluZyxcbiAgICBpbWFnZUxvYWRlZDogdW5rbm93bixcbiAgICBpbWFnZUluZm86IElJbWFnZUluZm8sXG4gICAgc2NyZWVuSGVpZ2h0OiBudW1iZXIsXG4gICAgcGxvdFR5cGU6IFBsb3RUeXBlLFxuICAgIF9pblBsYWNlPzogYm9vbGVhbixcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgaG9zdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHBsb3REaXYpO1xuICAgIGlmICghaG9zdCkge1xuICAgICAgY29uc29sZS5lcnJvcihgW25hcGFyaS1qc10gcGxvdCB0YXJnZXQgIyR7cGxvdERpdn0gbm90IGZvdW5kYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMucmVzZXQoKTtcbiAgICB0aGlzLmhvc3QgPSBob3N0O1xuICAgIHRoaXMucGxvdERpdklkID0gcGxvdERpdjtcbiAgICB0aGlzLmN1cnJlbnRQbG90VHlwZSA9IHBsb3RUeXBlO1xuXG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIGNhbnZhcy5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gc2NyZWVuSGVpZ2h0ID8gYCR7c2NyZWVuSGVpZ2h0fXB4YCA6ICcxMDAlJztcbiAgICBob3N0LmFwcGVuZENoaWxkKGNhbnZhcyk7XG4gICAgdGhpcy5jYW52YXMgPSBjYW52YXM7XG5cbiAgICBjb25zdCBpbmZvID0gKGltYWdlTG9hZGVkIGFzIE5hcGFyaUxvYWRlZCk/LmltYWdlSW5mbyA/PyBpbWFnZUluZm87XG4gICAgY29uc3QgeiA9IChpbWFnZUxvYWRlZCBhcyBOYXBhcmlMb2FkZWQpPy56ID8/IDA7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgdmlld2VyID0gbmV3IFZpZXdlcih7XG4gICAgICAgIGNhbnZhcyxcbiAgICAgICAgYmFja2dyb3VuZDogeyByOiAwLjA3LCBnOiAwLjA3LCBiOiAwLjA5LCBhOiAxIH0sXG4gICAgICAgIC8vIFNldCBoZXJlIHJhdGhlciB0aGFuIGxlZnQgdG8gbmFwYXJpLWpzJ3Mgb3duIGRlZmF1bHQgc28gdGhlIGdlbnRsZXJcbiAgICAgICAgLy8gc3RlcCBhcHBsaWVzIHdpdGggdGhlIHZlcnNpb24gY3VycmVudGx5IGluc3RhbGxlZC4gQ2hvc2VuIHRvIG1hdGNoIHRoZVxuICAgICAgICAvLyBPU0QgYmFja2VuZCdzIHN0ZXAgKHNlZSBPU0RfWk9PTV9QRVJfU0NST0xMKTogdGhlIHdoZWVsIHNob3VsZCBmZWVsIHRoZVxuICAgICAgICAvLyBzYW1lIG9uIGFuIGltYWdlIHdoaWNoZXZlciByZW5kZXJlciBpcyBkcmF3aW5nIGl0LiBUaGUgc3RlcCBhcHBsaWVzIHBlclxuICAgICAgICAvLyBzY3JvbGwgRVZFTlQsIGFuZCBhIHRyYWNrcGFkIHNlbmRzIGEgYnVyc3Qgb2YgdGhlbSBwZXIgc3dpcGUsIHNvIGEgc3RlcFxuICAgICAgICAvLyB0dW5lZCB0byBhIG1vdXNlIG5vdGNoIHJ1bnMgYXdheSB1bmRlciBhIHRyYWNrcGFkLlxuICAgICAgICB3aGVlbFpvb21TcGVlZDogTkFQQVJJX1dIRUVMX1pPT01fU1BFRUQsXG4gICAgICAgIC8vIFRoZSBGSVJTVCAzRCBsYXllciBvZiBhIHNjZW5lIGZyYW1lcyB0aGUgb3JiaXQgY2FtZXJhOyBldmVyeSBsYXRlciBvbmUgbGVhdmVzIHRoZVxuICAgICAgICAvLyBwb3NlIGFsb25lLiBBIHNwYXRpYWwgc2NlbmUgaXMgYnVpbHQgZnJvbSBzZXZlcmFsIGxheWVycyBhbmQgcmVidWlsdCBjb25zdGFudGx5IOKAlFxuICAgICAgICAvLyByZWNvbG91cmluZyBieSBhIGNsYXNzLCBwaWNraW5nIGEgZ2VuZSwgc3RlcHBpbmcgYSBzZWN0aW9uIOKAlCBhbmQgd2l0aCBuYXBhcmktanMnc1xuICAgICAgICAvLyBwcmV2aW91cyB1bmNvbmRpdGlvbmFsIGZyYW1pbmcgZWFjaCBvZiB0aG9zZSB0aHJldyBhd2F5IGFuIG9yYml0IHRoZSB1c2VyIGhhZCBzZXQuXG4gICAgICAgIC8vIFRoZSBwb3NlIGl0IHNuYXBwZWQgYmFjayB0byBkZXBlbmRlZCBvbiBXSElDSCBsYXllciB3YXMgcmVidWlsdCwgc28gaXNvbGF0aW5nIG9uZVxuICAgICAgICAvLyBzZWN0aW9uIHpvb21lZCB0byB0aGF0IHNlY3Rpb24ncyBib3VuZHMuIGByZXNldEZpdDNEKClgIG9uIGEgZGF0YXNldCBjaGFuZ2UgaXMgd2hhdFxuICAgICAgICAvLyBsZXRzIHRoZSBuZXh0IHNjZW5lIGZyYW1lIGl0c2VsZi5cbiAgICAgICAgZml0M2Q6ICdvbmNlJyxcbiAgICAgICAgLy8gSW4gdGhlIHNwYXRpYWwgbW9kZXMgYSBwbGFpbiBjbGljayBTRUxFQ1RTIHRoZSBjbGFzcyB1bmRlciB0aGUgY3Vyc29yLFxuICAgICAgICAvLyBzbyBuYXBhcmkncyBPU0Qtc3R5bGUgY2xpY2stdG8tem9vbSBpcyB0dXJuZWQgb2ZmIHRoZXJlOiBvdGhlcndpc2Ugb25lXG4gICAgICAgIC8vIGNsaWNrIHdvdWxkIGJvdGggc2VsZWN0IGEgY2xhc3MgYW5kIHpvb20gMnggYWJvdXQgdGhlIGN1cnNvciwgYW5kIHRoZVxuICAgICAgICAvLyB6b29tIHdvdWxkIHRoZW4gaGFsdmUgdGhlIHBpeGVsIHJhZGl1cyB0aGUgbmV4dCBjbGljayBoaXQtdGVzdHMgd2l0aC5cbiAgICAgICAgLy8gWm9vbWluZyBpcyBzdGlsbCBvbiB0aGUgd2hlZWwsIHRoZSB6b29tIGJ1dHRvbnMgYW5kIHRoZSB6b29tLWJveCB0b29sLlxuICAgICAgICAuLi4oaXNTcGF0aWFsT21pY3MocGxvdFR5cGUpIHx8IGlzU3BhdGlhbE9taWNzM2QocGxvdFR5cGUpXG4gICAgICAgICAgPyB7IGNsaWNrWm9vbUZhY3RvcjogMCB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9KTtcbiAgICAgIHRoaXMudmlld2VyID0gdmlld2VyO1xuICAgICAgYXdhaXQgdmlld2VyLnJlYWR5O1xuXG4gICAgICBpZiAoaXNTcGF0aWFsT21pY3MzZChwbG90VHlwZSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5tb3VudFNwYXRpYWxPbWljczNkKHZpZXdlciwgaG9zdCk7XG4gICAgICB9IGVsc2UgaWYgKGlzU3BhdGlhbE9taWNzKHBsb3RUeXBlKSkge1xuICAgICAgICBhd2FpdCB0aGlzLm1vdW50U3BhdGlhbE9taWNzKHZpZXdlciwgaG9zdCwgeik7XG4gICAgICB9IGVsc2UgaWYgKGlzTmFwYXJpU2NhdHRlcihwbG90VHlwZSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5tb3VudFNjYXR0ZXIodmlld2VyLCBob3N0LCB6KTtcbiAgICAgIH0gZWxzZSBpZiAoaXNOYXBhcmlTY2F0dGVyM2QocGxvdFR5cGUpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubW91bnRTY2F0dGVyM2Qodmlld2VyLCBpbmZvKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNOYXBhcmlTdXJmYWNlKHBsb3RUeXBlKSkge1xuICAgICAgICBhd2FpdCB0aGlzLm1vdW50U3VyZmFjZSh2aWV3ZXIpO1xuICAgICAgfSBlbHNlIGlmIChpc05hcGFyaTNkKHBsb3RUeXBlKSkge1xuICAgICAgICBhd2FpdCB0aGlzLm1vdW50Vm9sdW1lKHZpZXdlciwgaW5mbywgcGxvdFR5cGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXJJbWFnZSh6KTtcbiAgICAgICAgdGhpcy5maXRDYW1lcmFTb29uKCk7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlRGlzcGxheVN0YXRlKCk7XG4gICAgICAgIHRoaXMuaW5zdGFsbFNjYWxlQmFyKCk7XG4gICAgICAgIHRoaXMuaW5zdGFsbDJkSW50ZXJhY3Rpb24odmlld2VyLCBob3N0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2NoZWR1bGVSZWFkYmFjaygpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbbmFwYXJpLWpzXSBwbG90IGZhaWxlZDonLCBlcnIpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBDaGFubmVsczogcGVyLWNoYW5uZWwgY29tcG9zaXRlLCBMVVQsIG5hdGl2ZSBoaXN0b2dyYW1zIChqaXQtdWkjMTAyKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogVGhlIGdyYXlzY2FsZSBkaXNwbGF5IGNvbG9ybWFwIGZyb20gdGhlIHN0b3JlIHNlbGVjdGlvbiAoK3JldmVyc2UpLCBkZWZhdWx0aW5nIHRvIGdyYXkuXG4gICAqICBNYXBzIHRoZSBqaXQtdWkgc3RvcmUgY29sb3JtYXAgbm9kZSB0byBhIG5hcGFyaSBgQ29sb3JtYXBgIHZpYSB0aGUgbGlicmFyeSdzIExVVCBmYWN0b3J5O1xuICAgKiAgdGhlIG11bHRpY2hhbm5lbCB0aW50IHJhbXBzIGFyZSBidWlsdCBpbnNpZGUge0BsaW5rIE11bHRpQ2hhbm5lbEltYWdlVmlld30gZnJvbSBlYWNoXG4gICAqICBjaGFubmVsJ3MgaGV4IGNvbG91ci4gKi9cbiAgcHJpdmF0ZSBncmF5c2NhbGVDb2xvcm1hcCgpOiBDb2xvcm1hcCB8IHN0cmluZyB7XG4gICAgY29uc3QgdmFsdWUgPSAodGhpcy5jdXJyZW50Q29sb3JtYXAgYXMgeyBkYXRhPzogeyB2YWx1ZT86IHVua25vd24gfSB9IHwgbnVsbCk/LmRhdGE/LnZhbHVlO1xuICAgIGNvbnN0IGx1dCA9IHZhbHVlICE9IG51bGwgPyBidWlsZENvbG9ybWFwTHV0KHZhbHVlLCB0aGlzLmN1cnJlbnRSZXZlcnNlKSA6IG51bGw7XG4gICAgaWYgKGx1dCkgcmV0dXJuIGNvbG9ybWFwRnJvbUx1dCgnZ3JheS1jbWFwJywgbHV0KTtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50UmV2ZXJzZVxuICAgICAgPyBjb2xvcm1hcEZyb21MdXQoJ2dyYXktcmV2JywgW1syNTUsIDI1NSwgMjU1XSwgWzAsIDAsIDBdXSBhcyBSZ2JbXSlcbiAgICAgIDogJ2dyYXknO1xuICB9XG5cbiAgLyoqIEZldGNoIGEgc3RpdGNoZWQgc2xpY2UgYW5kIHJlYWQgaXQgYmFjayBhcyBhIHNpbmdsZS1jaGFubmVsIHVpbnQ4IHBsYW5lLiBgY2hhbm5lbGAgc2VsZWN0cyBhXG4gICAqICBiYW5kIChtdWx0aWNoYW5uZWwpOyBvbWl0IGl0IGZvciB0aGUgZ3JheXNjYWxlIGNvbXBvc2l0ZSAoYWxsIG92ZXJ2aWV3IGxldmVscyBhdmFpbGFibGUsIHNvIGFcbiAgICogIGxhcmdlIGltYWdlIHBpY2tzIGEgZml0dGluZyBkb3duc2NhbGVkIGxldmVsIHJhdGhlciB0aGFuIG9ubHkgdGhlIGZ1bGwtcmVzIHJlYWwgbGV2ZWwpLiAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoQ2hhbm5lbERhdGEoXG4gICAgejogbnVtYmVyLFxuICAgIGNoYW5uZWw/OiBudW1iZXIsXG4gICAgYnVkZ2V0VGlsZXM/OiBudW1iZXIsXG4gICk6IFByb21pc2U8eyBkYXRhOiBVaW50OEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9PiB7XG4gICAgY29uc3QgYm1wID0gYXdhaXQgdGhpcy5mZXRjaFNsaWNlKHosIGNoYW5uZWwsIGJ1ZGdldFRpbGVzKTtcbiAgICByZXR1cm4gdGhpcy5iaXRtYXBUb0x1bWluYW5jZShibXApO1xuICB9XG5cbiAgLyoqIERlY29kZSBhbiBgSW1hZ2VCaXRtYXBgIChzZXJ2ZXIgYmFuZHMgYXJlIGdyYXlzY2FsZSwgUj1HPUIpIHRvIGEgc2luZ2xlLWNoYW5uZWwgdWludDggcGxhbmUuXG4gICAqICBgbWF4U2lkZWAgY2FwcyB0aGUgbG9uZ2VzdCBzaWRlIChkb3duc2NhbGluZyBvbiB0aGUgY2FudmFzIGRyYXcpIOKAlCB1c2VkIHRvIGtlZXAgcHJlLWxvYWRlZFxuICAgKiAgc3VyZmFjZSBzbGljZSBwbGFuZXMgc21hbGwuICovXG4gIHByaXZhdGUgYml0bWFwVG9MdW1pbmFuY2UoXG4gICAgYm1wOiBJbWFnZUJpdG1hcCxcbiAgICBtYXhTaWRlPzogbnVtYmVyLFxuICApOiB7IGRhdGE6IFVpbnQ4QXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0ge1xuICAgIGNvbnN0IHNjYWxlID0gbWF4U2lkZSA/IE1hdGgubWluKDEsIG1heFNpZGUgLyBNYXRoLm1heChibXAud2lkdGgsIGJtcC5oZWlnaHQsIDEpKSA6IDE7XG4gICAgY29uc3QgdyA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoYm1wLndpZHRoICogc2NhbGUpKTtcbiAgICBjb25zdCBoID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChibXAuaGVpZ2h0ICogc2NhbGUpKTtcbiAgICBsZXQgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IE9mZnNjcmVlbkNhbnZhcztcbiAgICBpZiAodHlwZW9mIE9mZnNjcmVlbkNhbnZhcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXModywgaCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgY2FudmFzLndpZHRoID0gdztcbiAgICAgIGNhbnZhcy5oZWlnaHQgPSBoO1xuICAgIH1cbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKSBhc1xuICAgICAgfCBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRcbiAgICAgIHwgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICB8IG51bGw7XG4gICAgaWYgKCFjdHgpIHRocm93IG5ldyBFcnJvcignW25hcGFyaS1qc10gY2hhbm5lbCByZWFkYmFjazogMkQgY29udGV4dCB1bmF2YWlsYWJsZScpO1xuICAgIC8vIFNjYWxlIHRoZSBXSE9MRSBiaXRtYXAgaW50byB0aGUgKHBvc3NpYmx5IHNtYWxsZXIpIHRhcmdldCBjYW52YXMg4oCUIGRyYXdpbmcgYXQgbmF0dXJhbCBzaXplXG4gICAgLy8gd291bGQgY3JvcCB0byB0aGUgdG9wLWxlZnQgd8OXaCBjb3JuZXIgd2hlbiBkb3duc2NhbGluZyBhIGxhcmdlIHNsaWNlIChtYXhTaWRlIDwgYm1wIHNpemUpLlxuICAgIGN0eC5kcmF3SW1hZ2UoYm1wLCAwLCAwLCB3LCBoKTtcbiAgICBibXAuY2xvc2U/LigpO1xuICAgIGNvbnN0IHJnYmEgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHcsIGgpLmRhdGE7XG4gICAgY29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KHcgKiBoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHcgKiBoOyBpKyspIGRhdGFbaV0gPSByZ2JhW2kgKiA0XTtcbiAgICByZXR1cm4geyBkYXRhLCB3aWR0aDogdywgaGVpZ2h0OiBoIH07XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoZSAyRCBpbWFnZSBmb3Igc2xpY2UgYHpgLiBXaXRoIGEgc2VydmVyIHB5cmFtaWQgZGVzY3JpcHRvciB3ZSB1c2UgYSBweXJhbWlkYWxcbiAgICoge0BsaW5rIFRpbGVkU291cmNlfSBwZXIgbGF5ZXIgc28gdGhlIHZpZXcgcmVmaW5lcyB0byBoaWdoZXIgcmVzb2x1dGlvbiBvbiB6b29tIChsaWtlIE9TRCkgYW5kXG4gICAqIHNpdHMgbmF0dXJhbGx5IGluIGZ1bGwtcmVzb2x1dGlvbiBjb29yZGluYXRlczsgd2l0aG91dCBvbmUgd2UgZmFsbCBiYWNrIHRvIHRoZSBzaW5nbGUtbGV2ZWxcbiAgICogc3RpdGNoLiBUaHJlZSBkaXNwbGF5IG1vZGVzIGVpdGhlciB3YXk6IG11bHRpY2hhbm5lbCBhZGRpdGl2ZSB0aW50LCBncmF5c2NhbGUgY29sb3JtYXAsIFJHQi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVuZGVySW1hZ2UoejogbnVtYmVyLCB0b2tlbj86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBpZiAoIXYpIHJldHVybjtcbiAgICBjb25zdCBkZXNjID0gYXdhaXQgdGhpcy5lbnN1cmVEZXNjcmlwdG9yKCk7XG4gICAgaWYgKGRlc2MgJiYgZGVzYy5sZXZlbHM/Lmxlbmd0aCkge1xuICAgICAgaWYgKHRva2VuICE9IG51bGwgJiYgdG9rZW4gIT09IHRoaXMuc2xpY2VSZXEpIHJldHVybjtcbiAgICAgIGF3YWl0IHRoaXMucmVuZGVySW1hZ2VUaWxlZCh6LCBkZXNjKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVuZGVySW1hZ2VTdGl0Y2hlZCh6LCB0b2tlbik7XG4gIH1cblxuICAvKiogU2luZ2xlLWxldmVsIHN0aXRjaCBmYWxsYmFjayAobm8gZGVzY3JpcHRvcik6IHRoZSBwcmUtdGlsaW5nIHBhdGguICovXG4gIHByaXZhdGUgYXN5bmMgcmVuZGVySW1hZ2VTdGl0Y2hlZCh6OiBudW1iZXIsIHRva2VuPzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIGNvbnN0IGRlc2MgPSBhd2FpdCB0aGlzLmVuc3VyZURlc2NyaXB0b3IoKTtcbiAgICBjb25zdCBzdGF0ZXMgPSB0aGlzLnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKCk7XG4gICAgY29uc3QgY2hhbm5lbENvdW50ID0gZGVzYz8uY2hhbm5lbHMgPz8gKHN0YXRlcy5sZW5ndGggfHwgMSk7XG4gICAgY29uc3QgbXVsdGljaGFubmVsID0gISFkZXNjPy5tdWx0aWNoYW5uZWwgJiYgY2hhbm5lbENvdW50ID4gMTtcblxuICAgIC8vIDEpIEZldGNoIGFsbCBwaXhlbCBkYXRhIEJFRk9SRSB0b3VjaGluZyB0aGUgdmlld2VyLCBzbyBhIHN1cGVyc2VkZWQgc2NydWIgY2FuIGJhaWwgd2l0aG91dFxuICAgIC8vICAgIGhhdmluZyB0b3JuIGRvd24gdGhlIHZpc2libGUgbGF5ZXJzIChhdm9pZHMgZmxpY2tlciAvIG91dC1vZi1vcmRlciBsYXllciBzdGF0ZSkuXG4gICAgbGV0IG1vZGU6ICdncmF5c2NhbGUnIHwgJ211bHRpY2hhbm5lbCcgfCAncmdiJztcbiAgICBsZXQgcGxhbmVzOiBBcnJheTx7IGRhdGE6IFVpbnQ4QXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+ID0gW107XG4gICAgbGV0IGJpdG1hcDogSW1hZ2VCaXRtYXAgfCBudWxsID0gbnVsbDtcbiAgICBpZiAobXVsdGljaGFubmVsKSB7XG4gICAgICBtb2RlID0gJ211bHRpY2hhbm5lbCc7XG4gICAgICBwbGFuZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgQXJyYXkuZnJvbSh7IGxlbmd0aDogY2hhbm5lbENvdW50IH0sIChfLCBjKSA9PiB0aGlzLmZldGNoQ2hhbm5lbERhdGEoeiwgYykpLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGNoYW5uZWxDb3VudCA9PT0gMSkge1xuICAgICAgbW9kZSA9ICdncmF5c2NhbGUnO1xuICAgICAgLy8gQ29tcG9zaXRlIGZldGNoIChubyBjaGFubmVsKSDihpIgYWxsIG92ZXJ2aWV3IGxldmVscyB1c2FibGUsIHNvIGEgbGFyZ2UgZ3JheXNjYWxlIGltYWdlXG4gICAgICAvLyBzZWxlY3RzIGEgZml0dGluZyBkb3duc2NhbGVkIGxldmVsIGluc3RlYWQgb2YgdGhlIGZ1bGwtcmVzIHJlYWwgbGV2ZWwgKHRleHR1cmUgbGltaXQpLlxuICAgICAgcGxhbmVzID0gW2F3YWl0IHRoaXMuZmV0Y2hDaGFubmVsRGF0YSh6KV07XG4gICAgfSBlbHNlIHtcbiAgICAgIG1vZGUgPSAncmdiJztcbiAgICAgIGJpdG1hcCA9IGF3YWl0IHRoaXMuZmV0Y2hTbGljZSh6KTtcbiAgICB9XG5cbiAgICAvLyAyKSBDb21taXQg4oCUIHVubGVzcyBhIG5ld2VyIHNjcnViIHN1cGVyc2VkZWQgdXMgb3IgdGhlIHZpZXdlciB3YXMgdG9ybiBkb3duLlxuICAgIGlmICgodG9rZW4gIT0gbnVsbCAmJiB0b2tlbiAhPT0gdGhpcy5zbGljZVJlcSkgfHwgdGhpcy52aWV3ZXIgIT09IHYpIHtcbiAgICAgIGJpdG1hcD8uY2xvc2U/LigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRoZSBkaXNwbGF5ZWQgdGV4dHVyZSBtYXkgYmUgYSBkb3duc2NhbGVkIHB5cmFtaWQgbGV2ZWw7IHNjYWxlIHRoZSBsYXllciBpbnRvIEZVTEwtUkVTT0xVVElPTlxuICAgIC8vIHdvcmxkIGNvb3JkaW5hdGVzIChsZXZlbC0wIHBpeGVscykgc28gdGhlIGNhbWVyYSwgcmVhZGJhY2sgYW5kIOKAlCBjcml0aWNhbGx5IOKAlCBwcmUtc2F2ZWRcbiAgICAvLyByZWdpb25zIChzdG9yZWQgaW4gZnVsbC1yZXMgY29vcmRzLCBlLmcuIG5kcGkpIGFsbCBsaW5lIHVwIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggbGV2ZWwgaXMgc2hvd24uXG4gICAgLy8gVGhpcyBtaXJyb3JzIE9TRCwgd2hvc2UgY29vcmRpbmF0ZSBzeXN0ZW0gaXMgYWx3YXlzIGxldmVsIDAuXG4gICAgY29uc3QgdGV4VyA9IG1vZGUgPT09ICdyZ2InID8gKGJpdG1hcCBhcyBJbWFnZUJpdG1hcCkud2lkdGggOiBwbGFuZXNbMF0/LndpZHRoID8/IDA7XG4gICAgY29uc3QgdGV4SCA9IG1vZGUgPT09ICdyZ2InID8gKGJpdG1hcCBhcyBJbWFnZUJpdG1hcCkuaGVpZ2h0IDogcGxhbmVzWzBdPy5oZWlnaHQgPz8gMDtcbiAgICBjb25zdCBmdWxsVyA9IGRlc2M/LndpZHRoIHx8IHRleFcgfHwgMTtcbiAgICBjb25zdCBmdWxsSCA9IGRlc2M/LmhlaWdodCB8fCB0ZXhIIHx8IDE7XG4gICAgY29uc3Qgc2NhbGU6IFtudW1iZXIsIG51bWJlcl0gPSBbdGV4VyA/IGZ1bGxXIC8gdGV4VyA6IDEsIHRleEggPyBmdWxsSCAvIHRleEggOiAxXTtcblxuICAgIHRoaXMuaW1hZ2VNb2RlID0gbW9kZTtcbiAgICBjb25zdCBpbnRlcnBvbGF0aW9uOiAnbGluZWFyJyB8ICduZWFyZXN0JyA9IHRoaXMuaW1hZ2VTbW9vdGhpbmcgPyAnbGluZWFyJyA6ICduZWFyZXN0JztcbiAgICB0aGlzLmNoYW5uZWxWaWV3ID0gbmV3IE11bHRpQ2hhbm5lbEltYWdlVmlldyh2KTtcbiAgICBpZiAobW9kZSA9PT0gJ211bHRpY2hhbm5lbCcpIHtcbiAgICAgIGNvbnN0IHZpZXdzOiBDaGFubmVsVmlld1tdID0gcGxhbmVzLm1hcCgoZCwgYykgPT4ge1xuICAgICAgICBjb25zdCBzdCA9IHN0YXRlcy5maW5kKChzKSA9PiBzLmluZGV4ID09PSBjKTtcbiAgICAgICAgY29uc3QgY29sb3IgPSBzdD8uY29sb3IgPz8gZGVzYz8uY2hhbm5lbEluZm8/LltjXT8uY29sb3IgPz8gdGludEZvcihjKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzb3VyY2U6IHsga2luZDogJ3R5cGVkJywgd2lkdGg6IGQud2lkdGgsIGhlaWdodDogZC5oZWlnaHQsIGNoYW5uZWxzOiAxLCBkdHlwZTogJ3VpbnQ4JywgZGF0YTogZC5kYXRhIH0sXG4gICAgICAgICAgdGludDogY29sb3IsXG4gICAgICAgICAgbmFtZTogc3Q/Lm5hbWUgPz8gYGNoJHtjfWAsXG4gICAgICAgICAgY29udHJhc3RMaW1pdHM6IFtzdD8ubWluID8/IDAsIHN0Py5tYXggPz8gMjU1XSxcbiAgICAgICAgICBnYW1tYTogc3Q/LmdhbW1hID8/IDEsXG4gICAgICAgICAgdmlzaWJsZTogc3Q/LnZpc2libGUgPz8gdHJ1ZSxcbiAgICAgICAgICBpbnZlcnQ6IHRoaXMuaW52ZXJ0RW5hYmxlZCxcbiAgICAgICAgICBzY2FsZSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jaGFubmVsVmlldy5yZW5kZXIoJ211bHRpY2hhbm5lbCcsIHZpZXdzLCB7IGludGVycG9sYXRpb24gfSk7XG4gICAgfSBlbHNlIGlmIChtb2RlID09PSAnZ3JheXNjYWxlJykge1xuICAgICAgY29uc3QgZCA9IHBsYW5lc1swXTtcbiAgICAgIGNvbnN0IHN0ID0gc3RhdGVzWzBdO1xuICAgICAgdGhpcy5jaGFubmVsVmlldy5yZW5kZXIoXG4gICAgICAgICdncmF5c2NhbGUnLFxuICAgICAgICBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgc291cmNlOiB7IGtpbmQ6ICd0eXBlZCcsIHdpZHRoOiBkLndpZHRoLCBoZWlnaHQ6IGQuaGVpZ2h0LCBjaGFubmVsczogMSwgZHR5cGU6ICd1aW50OCcsIGRhdGE6IGQuZGF0YSB9LFxuICAgICAgICAgICAgY29sb3JtYXA6IHRoaXMuZ3JheXNjYWxlQ29sb3JtYXAoKSxcbiAgICAgICAgICAgIGNvbnRyYXN0TGltaXRzOiBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV0sXG4gICAgICAgICAgICBnYW1tYTogc3Q/LmdhbW1hID8/IDEsXG4gICAgICAgICAgICBpbnZlcnQ6IHRoaXMuaW52ZXJ0RW5hYmxlZCxcbiAgICAgICAgICAgIHNjYWxlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHsgaW50ZXJwb2xhdGlvbiB9LFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jaGFubmVsVmlldy5yZW5kZXIoJ3JnYicsIFt7IHNvdXJjZTogYml0bWFwIGFzIEltYWdlQml0bWFwLCBzY2FsZSB9XSwgeyBpbnRlcnBvbGF0aW9uIH0pO1xuICAgIH1cbiAgICB0aGlzLmltYWdlVyA9IGZ1bGxXO1xuICAgIHRoaXMuaW1hZ2VIID0gZnVsbEg7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoZSAyRCBpbWFnZSB3aXRoIHB5cmFtaWRhbCB7QGxpbmsgVGlsZWRTb3VyY2V9cyDigJQgdGhlIHZpZXcgcmVmaW5lcyB0byBoaWdoZXIgcmVzb2x1dGlvblxuICAgKiBhcyB5b3Ugem9vbSBpbiAodGhlIHZpc3VhbCBmZXRjaGVzIHRoZSBsZXZlbCB3aG9zZSB0ZXhlbHMg4omIIHNjcmVlbiBwaXhlbHMpIGFuZCBzaXRzIGluIGZ1bGwtcmVzXG4gICAqIGNvb3JkaW5hdGVzIHNvIHJlZ2lvbnMgYWxpZ24uIFNhbWUgdGhyZWUgbW9kZXMgYXMgdGhlIHN0aXRjaCBwYXRoLiBQZXItY2hhbm5lbCBsYXllcnMgdXNlIHRoZVxuICAgKiBSRUFMIHB5cmFtaWQgbGV2ZWxzIChwZXItY2hhbm5lbCB0aWxlcyBvbmx5IGV4aXN0IHRoZXJlKTsgdGhlIGNvbXBvc2l0ZSB1c2VzIGFsbCBsZXZlbHMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlbmRlckltYWdlVGlsZWQoejogbnVtYmVyLCBkZXNjOiBUaWxlRGVzY3JpcHRvcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBpZiAoIXYpIHJldHVybjtcbiAgICBjb25zdCBzdGF0ZXMgPSB0aGlzLnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKCk7XG4gICAgY29uc3QgY2hhbm5lbENvdW50ID0gZGVzYy5jaGFubmVscyA/PyAoc3RhdGVzLmxlbmd0aCB8fCAxKTtcbiAgICBjb25zdCBtdWx0aWNoYW5uZWwgPSAhIWRlc2MubXVsdGljaGFubmVsICYmIGNoYW5uZWxDb3VudCA+IDE7XG4gICAgY29uc3QgaW50ZXJwb2xhdGlvbjogJ2xpbmVhcicgfCAnbmVhcmVzdCcgPSB0aGlzLmltYWdlU21vb3RoaW5nID8gJ2xpbmVhcicgOiAnbmVhcmVzdCc7XG5cbiAgICB0aGlzLnRpbGVkID0gdHJ1ZTtcbiAgICB0aGlzLmNoYW5uZWxWaWV3ID0gbmV3IE11bHRpQ2hhbm5lbEltYWdlVmlldyh2KTtcblxuICAgIGlmIChtdWx0aWNoYW5uZWwpIHtcbiAgICAgIHRoaXMuaW1hZ2VNb2RlID0gJ211bHRpY2hhbm5lbCc7XG4gICAgICBjb25zdCB2aWV3czogQ2hhbm5lbFZpZXdbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjaGFubmVsQ291bnQ7IGMrKykge1xuICAgICAgICBjb25zdCBzdCA9IHN0YXRlcy5maW5kKChzKSA9PiBzLmluZGV4ID09PSBjKTtcbiAgICAgICAgY29uc3QgY29sb3IgPSBzdD8uY29sb3IgPz8gZGVzYy5jaGFubmVsSW5mbz8uW2NdPy5jb2xvciA/PyB0aW50Rm9yKGMpO1xuICAgICAgICB2aWV3cy5wdXNoKHtcbiAgICAgICAgICBzb3VyY2U6IHRoaXMuYnVpbGRUaWxlZFNvdXJjZShkZXNjLCBjLCAxKSxcbiAgICAgICAgICB0aW50OiBjb2xvcixcbiAgICAgICAgICBuYW1lOiBzdD8ubmFtZSA/PyBgY2gke2N9YCxcbiAgICAgICAgICBjb250cmFzdExpbWl0czogW3N0Py5taW4gPz8gMCwgc3Q/Lm1heCA/PyAyNTVdLFxuICAgICAgICAgIGdhbW1hOiBzdD8uZ2FtbWEgPz8gMSxcbiAgICAgICAgICB2aXNpYmxlOiBzdD8udmlzaWJsZSA/PyB0cnVlLFxuICAgICAgICAgIGludmVydDogdGhpcy5pbnZlcnRFbmFibGVkLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2hhbm5lbFZpZXcucmVuZGVyKCdtdWx0aWNoYW5uZWwnLCB2aWV3cywgeyBpbnRlcnBvbGF0aW9uIH0pO1xuICAgIH0gZWxzZSBpZiAoY2hhbm5lbENvdW50ID09PSAxKSB7XG4gICAgICB0aGlzLmltYWdlTW9kZSA9ICdncmF5c2NhbGUnO1xuICAgICAgY29uc3Qgc3QgPSBzdGF0ZXNbMF07XG4gICAgICB0aGlzLmNoYW5uZWxWaWV3LnJlbmRlcihcbiAgICAgICAgJ2dyYXlzY2FsZScsXG4gICAgICAgIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuYnVpbGRUaWxlZFNvdXJjZShkZXNjLCB1bmRlZmluZWQsIDEpLFxuICAgICAgICAgICAgY29sb3JtYXA6IHRoaXMuZ3JheXNjYWxlQ29sb3JtYXAoKSxcbiAgICAgICAgICAgIGNvbnRyYXN0TGltaXRzOiBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV0sXG4gICAgICAgICAgICBnYW1tYTogc3Q/LmdhbW1hID8/IDEsXG4gICAgICAgICAgICBpbnZlcnQ6IHRoaXMuaW52ZXJ0RW5hYmxlZCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICB7IGludGVycG9sYXRpb24gfSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW1hZ2VNb2RlID0gJ3JnYic7XG4gICAgICB0aGlzLmNoYW5uZWxWaWV3LnJlbmRlcigncmdiJywgW3sgc291cmNlOiB0aGlzLmJ1aWxkVGlsZWRTb3VyY2UoZGVzYywgdW5kZWZpbmVkLCA0KSB9XSwge1xuICAgICAgICBpbnRlcnBvbGF0aW9uLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuaW1hZ2VXID0gZGVzYy53aWR0aDtcbiAgICB0aGlzLmltYWdlSCA9IGRlc2MuaGVpZ2h0O1xuICAgIC8vIEF3YWl0IG9uIHRoZSBpbml0aWFsIHJlbmRlciBzbyBnZXRIaXN0b2dyYW0vYXV0b0NvbnRyYXN0IGhhdmUgZGF0YSBpbW1lZGlhdGVseTsgc2xpY2UgY2hhbmdlc1xuICAgIC8vIHJlZnJlc2ggZmlyZS1hbmQtZm9yZ2V0ICh0aGUgaGlzdG9ncmFtIHBhbmUgcmV0cmllcykuXG4gICAgYXdhaXQgdGhpcy5yZWZyZXNoSGlzdG9ncmFtU2FtcGxlcyh6LCBkZXNjKTtcbiAgfVxuXG4gIC8qKiBCdWlsZCBhIHB5cmFtaWRhbCBUaWxlZFNvdXJjZSBiYWNrZWQgYnkgdGhlIHNlcnZlciBgL3RpbGVgIGVuZHBvaW50LiBgY2hhbm5lbGAgc2VsZWN0cyBhIGJhbmRcbiAgICogIChncmF5c2NhbGUgbHVtaW5hbmNlLCByZWFsIGxldmVscyBvbmx5KTsgb21pdCBpdCBmb3IgdGhlIGNvbXBvc2l0ZSAoUkdCQSwgYWxsIGxldmVscykuICovXG4gIHByaXZhdGUgYnVpbGRUaWxlZFNvdXJjZShcbiAgICBkZXNjOiBUaWxlRGVzY3JpcHRvcixcbiAgICBjaGFubmVsOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgY2hhbm5lbHM6IDEgfCA0LFxuICApOiBUaWxlZFNvdXJjZSB7XG4gICAgY29uc3QgaW5mb0I2NCA9IHRoaXMudGlsZXMuZ2V0U2VsZWN0ZWRJbmZvQjY0KCkgPz8gJyc7XG4gICAgLy8gUGVyLWNoYW5uZWwgdGlsZXMgZXhpc3Qgb25seSBhdCBSRUFMIEJpby1Gb3JtYXRzIGxldmVsczsgdGhlIGNvbXBvc2l0ZSBleGlzdHMgYXQgYWxsIGxldmVscy5cbiAgICBjb25zdCB1c2FibGUgPVxuICAgICAgY2hhbm5lbCA9PSBudWxsXG4gICAgICAgID8gZGVzYy5sZXZlbHNcbiAgICAgICAgOiBkZXNjLmxldmVscy5zbGljZSgwLCBNYXRoLm1heCgxLCBkZXNjLnJlYWxMZXZlbHMgPz8gZGVzYy5sZXZlbHMubGVuZ3RoKSk7XG4gICAgY29uc3QgbGV2ZWxTY2FsZXMgPSB1c2FibGUubWFwKChsKSA9PiBkZXNjLndpZHRoIC8gTWF0aC5tYXgoMSwgbC53aWR0aCkpOyAvLyBsZXZlbC0wIHB4IHBlciBsZXZlbCBweFxuICAgIGNvbnN0IHRpbGVTaXplID0gZGVzYy50aWxlU2l6ZSB8fCBUSUxFX1NJWkU7XG4gICAgY29uc3QgY2ggPSBjaGFubmVsID09IG51bGwgPyAnJyA6IGAmY2hhbm5lbD0ke2NoYW5uZWx9YDtcbiAgICBjb25zdCBhcGkgPSB0aGlzLmFwaTtcbiAgICByZXR1cm4ge1xuICAgICAga2luZDogJ3RpbGVkJyxcbiAgICAgIHdpZHRoOiBkZXNjLndpZHRoLFxuICAgICAgaGVpZ2h0OiBkZXNjLmhlaWdodCxcbiAgICAgIHRpbGVTaXplLFxuICAgICAgbGV2ZWxzOiB1c2FibGUubGVuZ3RoLFxuICAgICAgbGV2ZWxTY2FsZXMsXG4gICAgICBkZXB0aDogTWF0aC5tYXgoMSwgZGVzYy56IHx8IDEpLFxuICAgICAgY2hhbm5lbHMsXG4gICAgICBkdHlwZTogJ3VpbnQ4JyxcbiAgICAgIGZldGNoVGlsZTogYXN5bmMgKGtleTogVGlsZUtleSk6IFByb21pc2U8UGl4ZWxDaHVuaz4gPT4ge1xuICAgICAgICBjb25zdCByZXMgPSB1c2FibGVba2V5LmxldmVsXT8ucmVzID8/IGtleS5sZXZlbDtcbiAgICAgICAgY29uc3QgdXJsID0gYCR7YXBpfXRpbGU/aW5mbz0ke2luZm9CNjR9JnJlcz0ke3Jlc30mY29sPSR7a2V5LmNvbH0mcm93PSR7a2V5LnJvd30mej0ke2tleS56fSZ0aWxlU2l6ZT0ke3RpbGVTaXplfSR7Y2h9YDtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IGF3YWl0IHRoaXMudGlsZXNcbiAgICAgICAgICAuZ2V0QXV0aEhlYWRlcnMoKVxuICAgICAgICAgIC5jYXRjaCgoKSA9PiAoe30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xuICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgICAgIGlmICghcmVzcC5vaykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgW25hcGFyaS1qc10gdGlsZSAke2tleS5sZXZlbH0vJHtrZXkuY29sfS8ke2tleS5yb3d9IOKGkiAke3Jlc3Auc3RhdHVzfWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJtcCA9IGF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKGF3YWl0IHJlc3AuYmxvYigpKTtcbiAgICAgICAgaWYgKGNoYW5uZWxzID09PSA0KSByZXR1cm4geyB3aWR0aDogYm1wLndpZHRoLCBoZWlnaHQ6IGJtcC5oZWlnaHQsIGRhdGE6IGJtcCB9O1xuICAgICAgICByZXR1cm4gdGhpcy5iaXRtYXBUb0x1bWluYW5jZShibXApO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIChSZSlmZXRjaCBhIGNvYXJzZSBwZXItY2hhbm5lbCBsdW1pbmFuY2Ugc2FtcGxlIGZvciB0aGUgaGlzdG9ncmFtICh0aWxlZCBtb2RlIGhhcyBubyBmdWxsXG4gICAqICBpbi1tZW1vcnkgcGl4ZWxzKS4gT25lIGNoZWFwIG92ZXJ2aWV3IHRpbGUgcGVyIGNoYW5uZWw7IGNhY2hlZCBieSBjaGFubmVsIGluZGV4LiAqL1xuICBwcml2YXRlIGFzeW5jIHJlZnJlc2hIaXN0b2dyYW1TYW1wbGVzKHo6IG51bWJlciwgZGVzYzogVGlsZURlc2NyaXB0b3IpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmhpc3RTYW1wbGVzLmNsZWFyKCk7XG4gICAgaWYgKHRoaXMuaW1hZ2VNb2RlID09PSAncmdiJykgcmV0dXJuOyAvLyBSR0IgdXNlcyB0aGUgZGlzcGxheWVkLXBpeGVsIHJlYWRiYWNrIChyZ2JIaXN0b2dyYW0pXG4gICAgY29uc3QgY2hhbm5lbENvdW50ID0gdGhpcy5pbWFnZU1vZGUgPT09ICdtdWx0aWNoYW5uZWwnID8gZGVzYy5jaGFubmVscyA/PyAxIDogMTtcbiAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNoYW5uZWxDb3VudDsgYysrKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjaCA9IHRoaXMuaW1hZ2VNb2RlID09PSAnbXVsdGljaGFubmVsJyA/IGMgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGQgPSBhd2FpdCB0aGlzLmZldGNoQ2hhbm5lbERhdGEoeiwgY2gsIDEpOyAvLyBidWRnZXQgMSDihpIgY29hcnNlc3Qgc2luZ2xlIHRpbGVcbiAgICAgICAgdGhpcy5oaXN0U2FtcGxlcy5zZXQoYywgZC5kYXRhKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvKiBsZWF2ZSB0aGlzIGNoYW5uZWwncyBzYW1wbGUgdW5zZXQgKi9cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogU3Vic2NyaWJlIGNoYW5uZWwgc3RhdGVzICsgZ3JheXNjYWxlIGNvbG9ybWFwIOKGkiBsaXZlLWFwcGx5IHRvIHRoZSByZW5kZXJlZCBsYXllcnMgKG5vXG4gICAqICByZS1mZXRjaDsgb25seSB6IGNoYW5nZXMgcmUtZmV0Y2gpLiBSZXBsYWNlcyBhbnkgcHJpb3Igc3Vic2NyaXB0aW9uLiAqL1xuICBwcml2YXRlIHN1YnNjcmliZURpc3BsYXlTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BsYXlTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5kaXNwbGF5U3ViID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnN0b3JlLmdldENoYW5uZWxTdGF0ZXMoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXAoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0UmV2ZXJzZVNjYWxlKCksXG4gICAgICB0aGlzLnN0b3JlLmdldEludmVydCgpLFxuICAgIF0pLnN1YnNjcmliZSgoW2NoYW5uZWxzLCBjb2xvcm1hcCwgcmV2ZXJzZSwgaW52ZXJ0XSkgPT4ge1xuICAgICAgdGhpcy5jdXJyZW50Q29sb3JtYXAgPSAoY29sb3JtYXAgYXMgQ29sb3JtYXBOb2RlKSA/PyBudWxsO1xuICAgICAgdGhpcy5jdXJyZW50UmV2ZXJzZSA9IHJldmVyc2U7XG4gICAgICB0aGlzLmludmVydEVuYWJsZWQgPSBpbnZlcnQ7XG4gICAgICB0aGlzLmFwcGx5RGlzcGxheVN0YXRlKGNoYW5uZWxzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBTdWJzY3JpYmUgdGhlIHN0b3JlIGNvbG9ybWFwICgrcmV2ZXJzZSksIGludmVydCwgYW5kIGNoYW5uZWwgc3RhdGUg4oaSIHRoZSB2b2x1bWUvaXNvc3VyZmFjZVxuICAgKiAgdHJhbnNmZXIgZnVuY3Rpb246IGNvbG91ciAoY2hhbm5lbCB0aW50IG9yIHNlbGVjdGVkIGNvbG9ybWFwKSwgdGhlIGludGVuc2l0eSAqKndpbmRvd1xuICAgKiAgKG1pbi9tYXgg4oaSIGNvbnRyYXN0TGltaXRzKSoqIGFuZCAqKmdhbW1hKiosIG1pcnJvcmluZyB0aGUgZ3JheXNjYWxlIGltYWdlJ3MgZGlzcGxheSBjb250cm9sc1xuICAgKiAgc28gdGhlIGhpc3RvZ3JhbSBwYW5lIGRyaXZlcyB0aGUgM0QgcmVuZGVyLiBSZXBsYWNlcyBhbnkgcHJpb3Igc3Vic2NyaXB0aW9uLiAqL1xuICBwcml2YXRlIHN1YnNjcmliZVZvbHVtZURpc3BsYXlTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BsYXlTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5kaXNwbGF5U3ViID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnN0b3JlLmdldENvbG9ybWFwKCksXG4gICAgICB0aGlzLnN0b3JlLmdldFJldmVyc2VTY2FsZSgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRJbnZlcnQoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q2hhbm5lbFN0YXRlcygpLFxuICAgIF0pLnN1YnNjcmliZSgoW2NvbG9ybWFwLCByZXZlcnNlLCBpbnZlcnQsIGNoYW5uZWxzXSkgPT4ge1xuICAgICAgdGhpcy5jdXJyZW50Q29sb3JtYXAgPSAoY29sb3JtYXAgYXMgQ29sb3JtYXBOb2RlKSA/PyBudWxsO1xuICAgICAgdGhpcy5jdXJyZW50UmV2ZXJzZSA9IHJldmVyc2U7XG4gICAgICB0aGlzLmludmVydEVuYWJsZWQgPSBpbnZlcnQ7XG4gICAgICBjb25zdCB2aWV3ID0gdGhpcy52b2x1bWVWaWV3O1xuICAgICAgaWYgKCF2aWV3KSByZXR1cm47XG4gICAgICBpZiAodGhpcy52b2x1bWVNdWx0aWNoYW5uZWwpIHtcbiAgICAgICAgLy8gRWFjaCBjaGFubmVsJ3MgbGF5ZXIgaXMgdGludGVkIGJ5IGl0cyBjb2xvdXIgYW5kIGdldHMgaXRzIG93biB3aW5kb3cvZ2FtbWEvdmlzaWJpbGl0eS5cbiAgICAgICAgdmlldy5sYXllcnMuZm9yRWFjaCgoXywgYykgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0ID0gY2hhbm5lbHMuZmluZCgocykgPT4gcy5pbmRleCA9PT0gYyk7XG4gICAgICAgICAgdmlldy51cGRhdGVDaGFubmVsKGMsIHtcbiAgICAgICAgICAgIGNvbG9ybWFwOiB0aGlzLmNoYW5uZWxUaW50Q29sb3JtYXAoc3Q/LmNvbG9yID8/ICcjZmZmZmZmJyksXG4gICAgICAgICAgICAuLi4oc3RcbiAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICBjb250cmFzdExpbWl0czogW3N0Lm1pbiwgc3QubWF4XSBhcyBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgICAgICAgICAgICAgZ2FtbWE6IHN0LmdhbW1hLFxuICAgICAgICAgICAgICAgICAgdmlzaWJsZTogc3QudmlzaWJsZSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHN0ID0gY2hhbm5lbHNbMF07XG4gICAgICAgIHZpZXcudXBkYXRlQ2hhbm5lbCgwLCB7XG4gICAgICAgICAgY29sb3JtYXA6IHRoaXMudm9sdW1lQ29sb3JtYXAoc3QpLFxuICAgICAgICAgIC4uLihzdCA/IHsgY29udHJhc3RMaW1pdHM6IFtzdC5taW4sIHN0Lm1heF0gYXMgW251bWJlciwgbnVtYmVyXSwgZ2FtbWE6IHN0LmdhbW1hIH0gOiB7fSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEEgY2hhbm5lbCdzIHRpbnQgY29sb3JtYXAgKGJsYWNr4oaSY29sb3VyKSB3aXRoIHJldmVyc2Utc2NhbGUgLyBpbnZlcnQgYXBwbGllZCBieSBmbGlwcGluZy4gKi9cbiAgcHJpdmF0ZSBjaGFubmVsVGludENvbG9ybWFwKGNvbG9yOiBzdHJpbmcpOiBDb2xvcm1hcCB8IHN0cmluZyB7XG4gICAgbGV0IGNtYXA6IENvbG9ybWFwIHwgc3RyaW5nID0gdGludENvbG9ybWFwKGNvbG9yKTtcbiAgICBpZiAodGhpcy5jdXJyZW50UmV2ZXJzZSkgY21hcCA9IHJldmVyc2VDb2xvcm1hcChjbWFwKTtcbiAgICBpZiAodGhpcy5pbnZlcnRFbmFibGVkKSBjbWFwID0gcmV2ZXJzZUNvbG9ybWFwKGNtYXApO1xuICAgIHJldHVybiBjbWFwO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbG91ciBtYXAgZm9yIHRoZSB2b2x1bWUvaXNvc3VyZmFjZS4gQSByZWFsIGNvbG9ybWFwIHNlbGVjdGlvbiAodmlyaWRpcy9tYWdtYS/igKYpIHdpbnM7XG4gICAqIG90aGVyd2lzZSB0aGUgY2hhbm5lbCdzIGNvbG91ciB0aW50cyBpdCAoc28gdGhlIGNoYW5uZWwtZGlhbG9nIGNvbG91ciBzd2F0Y2ggcmVjb2xvcnMgdGhlIDNEXG4gICAqIHJlbmRlcikuIFJldmVyc2Utc2NhbGUgYW5kIGludmVydCBlYWNoIGZsaXAgdGhlIHJhbXAg4oCUIHRoZSBgVm9sdW1lTGF5ZXJgIGhhcyBubyBwZXItbGF5ZXJcbiAgICogaW52ZXJ0LCBzbyBib3RoIGFyZSBlbXVsYXRlZCBieSByZXZlcnNpbmcgdGhlIGNvbG9ybWFwLlxuICAgKi9cbiAgcHJpdmF0ZSB2b2x1bWVDb2xvcm1hcChzdDogSUNoYW5uZWxTdGF0ZSB8IHVuZGVmaW5lZCk6IENvbG9ybWFwIHwgc3RyaW5nIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5jdXJyZW50Q29sb3JtYXAgYXMgeyBsYWJlbD86IHN0cmluZzsgZGF0YT86IHsgdmFsdWU/OiB1bmtub3duIH0gfSB8IG51bGw7XG4gICAgLy8gQSBjb2xvcmVkIGNvbG9ybWFwICh2aXJpZGlzL21hZ21hL+KApikgZHJpdmVzIHRoZSB2b2x1bWU7IHRoZSBkZWZhdWx0IGdyYXlzY2FsZSBmYW1pbHlcbiAgICAvLyAoZ3JheSAvIEdyZXlzIC8gR3JleXMgSW52KSB5aWVsZHMgdG8gdGhlIGNoYW5uZWwncyBjb2xvdXIgc28gdGhlIGRpYWxvZyBjb2xvdXIgc3dhdGNoXG4gICAgLy8gcmVjb2xvcnMgdGhlIDNEIHJlbmRlci5cbiAgICBjb25zdCBsYWJlbCA9IChub2RlPy5sYWJlbCA/PyAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBncmF5RmFtaWx5ID0gbGFiZWwgPT09ICcnIHx8IGxhYmVsLmluY2x1ZGVzKCdncmV5JykgfHwgbGFiZWwuaW5jbHVkZXMoJ2dyYXknKTtcbiAgICBjb25zdCB2YWx1ZSA9IG5vZGU/LmRhdGE/LnZhbHVlO1xuICAgIGNvbnN0IGx1dCA9ICFncmF5RmFtaWx5ICYmIHZhbHVlICE9IG51bGwgPyBidWlsZENvbG9ybWFwTHV0KHZhbHVlLCBmYWxzZSkgOiBudWxsO1xuICAgIGxldCBjbWFwOiBDb2xvcm1hcCB8IHN0cmluZyA9IGx1dFxuICAgICAgPyBjb2xvcm1hcEZyb21MdXQoJ3ZvbC1jbWFwJywgbHV0KVxuICAgICAgOiB0aW50Q29sb3JtYXAoc3Q/LmNvbG9yID8/ICcjZmZmZmZmJyk7XG4gICAgLy8gUmV2ZXJzZS1zY2FsZSBhbmQgaW52ZXJ0IGVhY2ggZmxpcCB0aGUgcmFtcCAodGhlIFZvbHVtZUxheWVyIGhhcyBubyBwZXItbGF5ZXIgaW52ZXJ0KS5cbiAgICBpZiAodGhpcy5jdXJyZW50UmV2ZXJzZSkgY21hcCA9IHJldmVyc2VDb2xvcm1hcChjbWFwKTtcbiAgICBpZiAodGhpcy5pbnZlcnRFbmFibGVkKSBjbWFwID0gcmV2ZXJzZUNvbG9ybWFwKGNtYXApO1xuICAgIHJldHVybiBjbWFwO1xuICB9XG5cbiAgLyoqIEFwcGx5IHRoZSBjdXJyZW50IGNoYW5uZWwgc3RhdGVzIC8gY29sb3JtYXAgdG8gdGhlIGxpdmUgbGF5ZXJzIChubyByZS1mZXRjaCksIGRlbGVnYXRpbmcgdGhlXG4gICAqICBwZXItY2hhbm5lbCBsYXllciBtdXRhdGlvbnMgdG8gdGhlIHtAbGluayBNdWx0aUNoYW5uZWxJbWFnZVZpZXd9LiAqL1xuICBwcml2YXRlIGFwcGx5RGlzcGxheVN0YXRlKGNoYW5uZWxzOiBJQ2hhbm5lbFN0YXRlW10pOiB2b2lkIHtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5jaGFubmVsVmlldztcbiAgICBpZiAoIXRoaXMudmlld2VyIHx8ICF2aWV3KSByZXR1cm47XG4gICAgaWYgKHRoaXMuaW1hZ2VNb2RlID09PSAnbXVsdGljaGFubmVsJykge1xuICAgICAgdmlldy5sYXllcnMuZm9yRWFjaCgoXywgYykgPT4ge1xuICAgICAgICBjb25zdCBzdCA9IGNoYW5uZWxzLmZpbmQoKHMpID0+IHMuaW5kZXggPT09IGMpO1xuICAgICAgICBpZiAoIXN0KSByZXR1cm47XG4gICAgICAgIHZpZXcudXBkYXRlQ2hhbm5lbChjLCB7XG4gICAgICAgICAgdGludDogc3QuY29sb3IsXG4gICAgICAgICAgY29udHJhc3RMaW1pdHM6IFtzdC5taW4sIHN0Lm1heF0sXG4gICAgICAgICAgZ2FtbWE6IHN0LmdhbW1hLFxuICAgICAgICAgIHZpc2libGU6IHN0LnZpc2libGUsXG4gICAgICAgICAgaW52ZXJ0OiB0aGlzLmludmVydEVuYWJsZWQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmltYWdlTW9kZSA9PT0gJ2dyYXlzY2FsZScpIHtcbiAgICAgIGNvbnN0IHN0ID0gY2hhbm5lbHNbMF07XG4gICAgICB2aWV3LnVwZGF0ZUNoYW5uZWwoMCwge1xuICAgICAgICBjb2xvcm1hcDogdGhpcy5ncmF5c2NhbGVDb2xvcm1hcCgpLFxuICAgICAgICBpbnZlcnQ6IHRoaXMuaW52ZXJ0RW5hYmxlZCxcbiAgICAgICAgLi4uKHN0ID8geyBjb250cmFzdExpbWl0czogW3N0Lm1pbiwgc3QubWF4XSBhcyBbbnVtYmVyLCBudW1iZXJdLCBnYW1tYTogc3QuZ2FtbWEgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiAoUmUpaW5zdGFsbCB0aGUgcGh5c2ljYWwgc2NhbGUgYmFyIG92ZXIgdGhlIDJEIGltYWdlLCBzaXplZCBmcm9tIHRoZSBpbWFnZSdzIMK1bS9waXhlbFxuICAgKiAgKGAvdGlsZXMvaW5mb2AgbXBwWCwgZmFsbGluZyBiYWNrIHRvIHRoZSBpbWFnZSBtZXRhZGF0YSkuIE5vLW9wIHdpdGhvdXQgYSBwaHlzaWNhbCBzaXplLiAqL1xuICBwcml2YXRlIGluc3RhbGxTY2FsZUJhcigpOiB2b2lkIHtcbiAgICB0aGlzLnNjYWxlQmFyPy5kZXN0cm95KCk7XG4gICAgdGhpcy5zY2FsZUJhciA9IG51bGw7XG4gICAgY29uc3QgbXBwWCA9IHRoaXMuZGVzY3JpcHRvcj8ubXBwWCB8fCB0aGlzLmxvYWRlZD8uaW1hZ2VJbmZvLmltYWdlTWV0YT8uWzBdPy5tcHBYIHx8IDA7XG4gICAgaWYgKHRoaXMudmlld2VyICYmIHRoaXMuaG9zdCAmJiBtcHBYID4gMCkge1xuICAgICAgdGhpcy5zY2FsZUJhciA9IG5ldyBOYXBhcmlTY2FsZUJhcih0aGlzLmhvc3QsIHRoaXMudmlld2VyLmNhbWVyYSwgbXBwWCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIENvbnZlcnQgYSBuYXBhcmktanMgYEhpc3RvZ3JhbWAgKGJpbiBjb3VudCArIG1pbi9tYXgpIHRvIHRoZSBwYW5lJ3MgYElIaXN0b2dyYW1gIChiaW4gZWRnZXMpLiAqL1xuICBwcml2YXRlIHRvSUhpc3RvZ3JhbShoOiB7IGNvdW50czogVWludDMyQXJyYXk7IGJpbnM6IG51bWJlcjsgbWluOiBudW1iZXI7IG1heDogbnVtYmVyIH0pOiBJSGlzdG9ncmFtIHtcbiAgICBjb25zdCBzcGFuID0gaC5tYXggLSBoLm1pbiB8fCAxO1xuICAgIGNvbnN0IGJpbnMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBoLmJpbnMgfSwgKF8sIGkpID0+IGgubWluICsgKGkgKiBzcGFuKSAvIGguYmlucyk7XG4gICAgY29uc3QgY291bnRzID0gQXJyYXkuZnJvbShoLmNvdW50cyk7XG4gICAgcmV0dXJuIHsgYmlucywgY291bnRzLCBtYXg6IGNvdW50cy5yZWR1Y2UoKG0sIGMpID0+IChjID4gbSA/IGMgOiBtKSwgMCkgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3VudCB0aGUgM0Qgdm9sdW1lL2lzb3N1cmZhY2UuIEEgbXVsdGljaGFubmVsIGltYWdlIGJlY29tZXMgb25lIGFkZGl0aXZlLCB0aW50ZWRcbiAgICoge0BsaW5rIFZvbHVtZUxheWVyfSBwZXIgY2hhbm5lbCAoc28gZWFjaCBjaGFubmVsJ3MgY29sb3VyIGNvbXBvc2l0ZXMgaW50byB0aGUgcmVuZGVyKTsgYVxuICAgKiBncmF5c2NhbGUvY29tcG9zaXRlIGltYWdlIHVzZXMgYSBzaW5nbGUgdm9sdW1lLiBBZGRzIHRoZSBheGVzIGdpem1vICsgbGFiZWxzIGFuZCB3aXJlcyB0aGVcbiAgICogZGlzcGxheS1zdGF0ZSBzdWJzY3JpcHRpb24uIFRoZSBjYWxsZXIgb3ducyBgdmlld2VyLnJlYWR5YC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbW91bnRWb2x1bWUoXG4gICAgdmlld2VyOiBWaWV3ZXIsXG4gICAgaW5mbzogSUltYWdlSW5mbyB8IHVuZGVmaW5lZCxcbiAgICBwbG90VHlwZTogUGxvdFR5cGUsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5sb2FkVG9rZW47IC8vIGJhaWwgYmVmb3JlIHJlbmRlcmluZyBpZiBhIENhbmNlbCAvIG5ldyBwbG90IGJ1bXBzIHRoaXNcbiAgICBjb25zdCBkZXNjID0gYXdhaXQgdGhpcy5lbnN1cmVEZXNjcmlwdG9yKCk7XG4gICAgLy8gU2VydmVybGVzcyBtdWx0aWNoYW5uZWwgKHRpbGVkOmZhbHNlICsgY2hhbm5lbFVybHMpOiBubyB0aWxlIGRlc2NyaXB0b3IsIHNvXG4gICAgLy8gZGVyaXZlIHRoZSBjaGFubmVsIGNvdW50IGZyb20gaW1hZ2VNZXRhIGFuZCBhc3NlbWJsZSBlYWNoIGJhbmQgZnJvbSBpdHMgb3duXG4gICAgLy8gY2hhbm5lbFVybHNbel1bY10gcGxhbmUgKGZldGNoU2xpY2UgZG9lcyB0aGUgcGVyLWNoYW5uZWwgcm91dGluZykuXG4gICAgY29uc3Qgc2ltcGxlTWMgPSB0aGlzLnNpbXBsZVN0YWNrLmlzU2ltcGxlKGluZm8pICYmICEhaW5mbz8uY2hhbm5lbFVybHM/Lmxlbmd0aFxuICAgICAgJiYgKGluZm8/LmltYWdlTWV0YT8uWzBdPy5jaGFubmVsQ291bnQgPz8gMSkgPiAxO1xuICAgIGNvbnN0IGNoYW5uZWxDb3VudCA9IHNpbXBsZU1jID8gaW5mbyEuaW1hZ2VNZXRhIVswXS5jaGFubmVsQ291bnQgOiAoZGVzYz8uY2hhbm5lbHMgPz8gMSk7XG4gICAgY29uc3QgbXVsdGljaGFubmVsID0gc2ltcGxlTWMgfHwgKCEhZGVzYz8ubXVsdGljaGFubmVsICYmIGNoYW5uZWxDb3VudCA+IDEpO1xuICAgIGNvbnN0IHJlcyA9IHZvbHVtZVJlc29sdXRpb25Gb3IodGhpcy5yZXNvbHV0aW9uU2NhbGUpO1xuICAgIGNvbnN0IHJlbmRlcmluZzogJ2lzbycgfCAnbWlwJyA9IGlzTmFwYXJpSXNvc3VyZmFjZShwbG90VHlwZSkgPyAnaXNvJyA6ICdtaXAnO1xuICAgIGNvbnN0IHN0YXRlcyA9IHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKTtcblxuICAgIHRoaXMudm9sdW1lQ2hhbm5lbERhdGEuY2xlYXIoKTtcbiAgICB0aGlzLnZvbHVtZU11bHRpY2hhbm5lbCA9IG11bHRpY2hhbm5lbDtcbiAgICB0aGlzLmltYWdlTW9kZSA9IHRoaXMudm9sdW1lTXVsdGljaGFubmVsID8gJ211bHRpY2hhbm5lbCcgOiAnZ3JheXNjYWxlJztcbiAgICBjb25zdCB2aWV3ID0gbmV3IE11bHRpQ2hhbm5lbFZvbHVtZVZpZXcodmlld2VyKTtcbiAgICB0aGlzLnZvbHVtZVZpZXcgPSB2aWV3O1xuXG4gICAgLy8gQXNzZW1ibGUgcGVyLWNoYW5uZWwgc2NhbGFyIHZvbHVtZXMgZnJvbSB0aGUgc2VydmVyIHRpbGVzIChqaXQtc3BlY2lmaWMpOyB0aGUgbmFwYXJpLWpzIHZpZXdcbiAgICAvLyBvd25zIHRoZSBsYXllciBvcmNoZXN0cmF0aW9uIChvbmUgYWRkaXRpdmUgdGludGVkIHZvbHVtZSBwZXIgY2hhbm5lbCwgb3IgYSBzaW5nbGUgZ3JheXNjYWxlXG4gICAgLy8gdm9sdW1lKS4gVGhlIGFkYXB0ZXIgY29tcHV0ZXMgZWFjaCBjaGFubmVsJ3MgY29sb3JtYXAgKGluY2wuIGludmVydC9yZXZlcnNlIGZsaXBzKS5cbiAgICBsZXQgZGltczogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlcjsgZGVwdGg6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3QgY2hhbm5lbHM6IFZvbHVtZUNoYW5uZWxbXSA9IFtdO1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KHRydWUpO1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoMCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChtdWx0aWNoYW5uZWwpIHtcbiAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjaGFubmVsQ291bnQ7IGMrKykge1xuICAgICAgICAgIGNvbnN0IHZvbCA9IGF3YWl0IHRoaXMuYXNzZW1ibGVWb2x1bWUoaW5mbywgcmVzLCBjKTtcbiAgICAgICAgICBpZiAoIXZvbCkgY29udGludWU7XG4gICAgICAgICAgZGltcyA9IHZvbDtcbiAgICAgICAgICB0aGlzLnZvbHVtZUNoYW5uZWxEYXRhLnNldChjLCB2b2wuZGF0YSk7XG4gICAgICAgICAgY29uc3Qgc3QgPSBzdGF0ZXMuZmluZCgocykgPT4gcy5pbmRleCA9PT0gYyk7XG4gICAgICAgICAgY29uc3QgY29sb3IgPSBzdD8uY29sb3IgPz8gZGVzYz8uY2hhbm5lbEluZm8/LltjXT8uY29sb3IgPz8gdGludEZvcihjKTtcbiAgICAgICAgICBjaGFubmVscy5wdXNoKHtcbiAgICAgICAgICAgIGRhdGE6IHZvbC5kYXRhLFxuICAgICAgICAgICAgd2lkdGg6IHZvbC53aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogdm9sLmhlaWdodCxcbiAgICAgICAgICAgIGRlcHRoOiB2b2wuZGVwdGgsXG4gICAgICAgICAgICBjb2xvcm1hcDogdGhpcy5jaGFubmVsVGludENvbG9ybWFwKGNvbG9yKSxcbiAgICAgICAgICAgIGNvbnRyYXN0TGltaXRzOiBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV0sXG4gICAgICAgICAgICBnYW1tYTogc3Q/LmdhbW1hID8/IDEsXG4gICAgICAgICAgICB2aXNpYmxlOiBzdD8udmlzaWJsZSA/PyB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB2b2wgPSBhd2FpdCB0aGlzLmFzc2VtYmxlVm9sdW1lKGluZm8sIHJlcyk7XG4gICAgICAgIGlmICh2b2wpIHtcbiAgICAgICAgICBkaW1zID0gdm9sO1xuICAgICAgICAgIHRoaXMudm9sdW1lQ2hhbm5lbERhdGEuc2V0KDAsIHZvbC5kYXRhKTtcbiAgICAgICAgICBjb25zdCBzdCA9IHN0YXRlc1swXTtcbiAgICAgICAgICBjaGFubmVscy5wdXNoKHtcbiAgICAgICAgICAgIGRhdGE6IHZvbC5kYXRhLFxuICAgICAgICAgICAgd2lkdGg6IHZvbC53aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogdm9sLmhlaWdodCxcbiAgICAgICAgICAgIGRlcHRoOiB2b2wuZGVwdGgsXG4gICAgICAgICAgICBjb2xvcm1hcDogdGhpcy52b2x1bWVDb2xvcm1hcChzdCksXG4gICAgICAgICAgICBjb250cmFzdExpbWl0czogW3N0Py5taW4gPz8gMCwgc3Q/Lm1heCA/PyAyNTVdLFxuICAgICAgICAgICAgZ2FtbWE6IHN0Py5nYW1tYSA/PyAxLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoMCk7XG4gICAgfVxuXG4gICAgaWYgKCFkaW1zIHx8ICFjaGFubmVscy5sZW5ndGggfHwgdGhpcy5sb2FkVG9rZW4gIT09IHRva2VuKSByZXR1cm47IC8vIGNhbmNlbGxlZCDihpIgZG9uJ3QgcmVuZGVyXG5cbiAgICAvLyBSZXNvbHV0aW9uLWludmFyaWFudCB3b3JsZCBib3guIFNpemluZyB0aGUgYm94IGJ5IHRoZSBzYW1wbGVkIHZveGVsIGNvdW50cyBtYWRlIGhpZ2hlclxuICAgIC8vIGluLXBsYW5lIHJlc29sdXRpb24gZ3JvdyBYL1kgd2hpbGUgdGhlIGRlcHRoIHN0YXllZCB0aGUgKGNvbnN0YW50KSBzbGljZSBjb3VudCDigJQgc28gWiBhcHBlYXJlZFxuICAgIC8vIHRvIHNocmluayBhdCBoaWdoZXIgcmVzb2x1dGlvbi4gSW5zdGVhZCBhbmNob3IgdGhlIGluLXBsYW5lIGxvbmcgc2lkZSB0byBhIGZpeGVkIHJlZmVyZW5jZSBhbmRcbiAgICAvLyBsZXQgWiBzcGFuIHRoZSBmdWxsIHNsaWNlIGNvdW50OyB0aGUgYm94IHNoYXBlIGlzIHRoZW4gaWRlbnRpY2FsIGF0IGV2ZXJ5IGRlY2ltYXRlIGZhY3Rvci4gVGhlXG4gICAgLy8gcGVyLWF4aXMgYHZveGVsU2l6ZWAgKG5hcGFyaSBgc2NhbGVgKSBtYXBzIHRoZSBzYW1wbGVkIGdyaWQgb250byB0aGF0IGZpeGVkIHdvcmxkIGJveC5cbiAgICAvLyBBIHN0YWNrIHRoYXQgZGVjbGFyZXMgaXRzIHBoeXNpY2FsIHNwYWNpbmcgb24gQUxMIFRIUkVFIGF4ZXMgZ2V0cyBpdHMgdHJ1ZVxuICAgIC8vIGV4dGVudCBhcyB0aGUgd29ybGQgYm94IOKAlCB0aGUgb25seSB3YXkgYW5pc290cm9weSBzdXJ2aXZlcywgYW5kIHdoYXQgbWFrZXMgYVxuICAgIC8vIHJlc2FtcGxlZCA0MCB4IDQwIHggMjAwIMK1bSB2b2x1bWUgcmVhZCBhcyBhIGJyYWluIGluc3RlYWQgb2YgYSBjdWJlLWFzcGVjdFxuICAgIC8vIGJyaWNrLiBJdCBuZWVkcyBub25lIG9mIHRoZSByZWZlcmVuY2UtYm94IGFyaXRobWV0aWM6IGEgcGh5c2ljYWwgYm94IGlzXG4gICAgLy8gYWxyZWFkeSBpbmRlcGVuZGVudCBvZiB0aGUgZGVjaW1hdGUgZmFjdG9yLlxuICAgIC8vXG4gICAgLy8gRXZlcnl0aGluZyBlbHNlIGtlZXBzIHRoYXQgYXJpdGhtZXRpYy4gU2l6aW5nIHRoZSBib3ggYnkgdGhlIHNhbXBsZWQgdm94ZWxcbiAgICAvLyBjb3VudHMgbWFkZSBoaWdoZXIgaW4tcGxhbmUgcmVzb2x1dGlvbiBncm93IFgvWSB3aGlsZSB0aGUgZGVwdGggc3RheWVkIHRoZVxuICAgIC8vIChjb25zdGFudCkgc2xpY2UgY291bnQg4oCUIHNvIFogYXBwZWFyZWQgdG8gc2hyaW5rIGF0IGhpZ2hlciByZXNvbHV0aW9uLlxuICAgIC8vIEFuY2hvcmluZyB0aGUgaW4tcGxhbmUgbG9uZyBzaWRlIHRvIGEgZml4ZWQgcmVmZXJlbmNlIGFuZCBsZXR0aW5nIFogc3BhbiB0aGVcbiAgICAvLyBmdWxsIHNsaWNlIGNvdW50IG1ha2VzIHRoZSBib3ggc2hhcGUgaWRlbnRpY2FsIGF0IGV2ZXJ5IGRlY2ltYXRlIGZhY3Rvci5cbiAgICBjb25zdCBtZXRhID0gdGhpcy5sb2FkZWQ/LmltYWdlSW5mby5pbWFnZU1ldGE/LlswXTtcbiAgICBjb25zdCBtcHBYWVo6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB8IG51bGwgPVxuICAgICAgbWV0YT8ubXBwWCAmJiBtZXRhPy5tcHBZICYmIG1ldGE/Lm1wcFogPyBbbWV0YS5tcHBYLCBtZXRhLm1wcFksIG1ldGEubXBwWl0gOiBudWxsO1xuICAgIC8vIFRoZSBpbWFnZSdzIERFQ0xBUkVEIHBpeGVsIGRpbWVuc2lvbnMsIHdoaWNoIGlzIHdoYXQgbXBwIGlzIHBlcjogdGhlIHNhbXBsZWRcbiAgICAvLyBkaW1zIGFyZSBkZWNpbWF0ZWQsIHNvIHNpemluZyBhIHBoeXNpY2FsIGJveCBieSB0aGVtIHdvdWxkIG1ha2UgdGhlIHdvcmxkXG4gICAgLy8gYm94IGRlcGVuZCBvbiB0aGUgcmVzb2x1dGlvbiB0aGUgdXNlciBoYXBwZW5zIHRvIGJlIHZpZXdpbmcgYXQuXG4gICAgY29uc3QgZnVsbFcgPSB0aGlzLmRlc2NyaXB0b3I/LndpZHRoID8/IG1ldGE/LnggPz8gZGltcy53aWR0aDtcbiAgICBjb25zdCBmdWxsSCA9IHRoaXMuZGVzY3JpcHRvcj8uaGVpZ2h0ID8/IG1ldGE/LnkgPz8gZGltcy5oZWlnaHQ7XG4gICAgY29uc3QgZnVsbEQgPSBtZXRhPy56IHx8IHRoaXMubG9hZGVkPy5pbWFnZUluZm8udXJscz8ubGVuZ3RoIHx8IGRpbXMuZGVwdGg7XG4gICAgbGV0IHdvcmxkOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyOyBkZXB0aDogbnVtYmVyIH07XG4gICAgaWYgKG1wcFhZWikge1xuICAgICAgd29ybGQgPSB7XG4gICAgICAgIHdpZHRoOiBmdWxsVyAqIG1wcFhZWlswXSxcbiAgICAgICAgaGVpZ2h0OiBmdWxsSCAqIG1wcFhZWlsxXSxcbiAgICAgICAgZGVwdGg6IGZ1bGxEICogbXBwWFlaWzJdLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZnVsbExvbmcgPSBNYXRoLm1heCgxLCBmdWxsVywgZnVsbEgpO1xuICAgICAgd29ybGQgPSB7XG4gICAgICAgIHdpZHRoOiAoZnVsbFcgKiBWT0xVTUVfV09STERfSU5QTEFORV9SRUYpIC8gZnVsbExvbmcsXG4gICAgICAgIGhlaWdodDogKGZ1bGxIICogVk9MVU1FX1dPUkxEX0lOUExBTkVfUkVGKSAvIGZ1bGxMb25nLFxuICAgICAgICBkZXB0aDogZnVsbEQsXG4gICAgICB9O1xuICAgIH1cbiAgICAvLyBCYXNlIGJveCAoWi1zY2FsZSA9IDEpICsgdGhlIHNhbXBsZWQgZGVwdGggZHJpdmUgdGhlIGxpdmUgWi1oZWlnaHQgaGFuZGxlIGJlbG93OyB0aGUgcGVyc2lzdGVkXG4gICAgLy8gYHZvbHVtZVpTY2FsZWAgKHVzZXIgZHJhZykgYXBwbGllcyBvbiB0b3Agc28gY2hhbmdpbmcgcmVzb2x1dGlvbiBrZWVwcyB0aGUgY2hvc2VuIGhlaWdodC5cbiAgICB0aGlzLnZvbHVtZVdvcmxkQmFzZSA9IHdvcmxkO1xuICAgIHRoaXMudm9sdW1lU2FtcGxlZERlcHRoID0gTWF0aC5tYXgoMSwgZGltcy5kZXB0aCk7XG4gICAgY29uc3Qgd29ybGRaID0gd29ybGQuZGVwdGggKiB0aGlzLnZvbHVtZVpTY2FsZTtcbiAgICBjb25zdCB2b3hlbFNpemU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFtcbiAgICAgIHdvcmxkLndpZHRoIC8gZGltcy53aWR0aCxcbiAgICAgIHdvcmxkLmhlaWdodCAvIGRpbXMuaGVpZ2h0LFxuICAgICAgd29ybGRaIC8gdGhpcy52b2x1bWVTYW1wbGVkRGVwdGgsXG4gICAgXTtcbiAgICBmb3IgKGNvbnN0IGNoIG9mIGNoYW5uZWxzKSBjaC52b3hlbFNpemUgPSB2b3hlbFNpemU7XG5cbiAgICB2aWV3LnJlbmRlcih0aGlzLnZvbHVtZU11bHRpY2hhbm5lbCA/ICdtdWx0aWNoYW5uZWwnIDogJ2dyYXlzY2FsZScsIGNoYW5uZWxzLCB7IHJlbmRlcmluZyB9KTtcbiAgICB0aGlzLmltYWdlVyA9IGRpbXMud2lkdGg7XG4gICAgdGhpcy5pbWFnZUggPSBkaW1zLmhlaWdodDtcbiAgICB0aGlzLnZvbHVtZURpbXMgPSBkaW1zO1xuXG4gICAgLy8gM0QgY29vcmRpbmF0ZS1heGVzIC8gc2NhbGUgZ2l6bW8gKyBsYWJlbHMsIHNoYXJpbmcgdGhlIHZvbHVtZSdzIHdvcmxkIGJveCBzbyB0aGUgZ2l6bW8gdHJhY2tzXG4gICAgLy8gdGhlIHJlbmRlcmVkIHByb3BvcnRpb25zLiBQaHlzaWNhbCBzY2FsZSB0ZXh0IHN0aWxsIGNvbWVzIGZyb20gdGhlIEZVTEwgaW1hZ2UgZXh0ZW50LlxuICAgIHRoaXMuYXhlc0xheWVyID0gdmlld2VyLmFkZEF4ZXMod29ybGQud2lkdGgsIHdvcmxkLmhlaWdodCwgd29ybGRaLCB7IHZpc2libGU6IHRoaXMuYXhlc1Zpc2libGUgfSk7XG4gICAgaWYgKHRoaXMuaG9zdCkge1xuICAgICAgdGhpcy5heGVzTGFiZWxzID0gbmV3IE5hcGFyaUF4ZXNMYWJlbHMoXG4gICAgICAgIHRoaXMuaG9zdCxcbiAgICAgICAgdmlld2VyLmNhbWVyYTNkLFxuICAgICAgICB0aGlzLmJ1aWxkQXhlc0xhYmVscyh7IHdpZHRoOiB3b3JsZC53aWR0aCwgaGVpZ2h0OiB3b3JsZC5oZWlnaHQsIGRlcHRoOiB3b3JsZFogfSksXG4gICAgICApO1xuICAgICAgdGhpcy5heGVzTGFiZWxzLnNldFZpc2libGUodGhpcy5heGVzVmlzaWJsZSk7XG4gICAgICAvLyBJbi12aWV3IGRyYWcgaGFuZGxlIGF0IHRoZSBUT1AgRU5EIE9GIFRIRSBaIEFYSVMgKHRoZSBib3gncyBtaW4tWFkgY29ybmVyLCB3aGVyZSB0aGUgYmx1ZVxuICAgICAgLy8gXCJaXCIgYXhpcyArIGxhYmVsIGxpdmUpLCBzbyBpdCByZWFkcyBhcyB0aGUgWi1oZWlnaHQgY29udHJvbC4gRmxvYXRlZCBhIGxpdHRsZSBwYXN0IHRoZSBheGlzXG4gICAgICAvLyB0aXAgKMOXMS4xMikgc28gdGhlIGdyaXAgY2xlYXJzIHRoZSBcIlogwrcg4oCmXCIgbGFiZWwuIERyYWcg4oaVIHRvIHJlc3RyZXRjaCBaIGxpdmUuXG4gICAgICB0aGlzLnpIYW5kbGUgPSBuZXcgTmFwYXJpVm9sdW1lWkhhbmRsZSh0aGlzLmhvc3QsIHZpZXdlci5jYW1lcmEzZCwge1xuICAgICAgICB0b3BBbmNob3I6ICgpID0+IFtcbiAgICAgICAgICAtdGhpcy52b2x1bWVXb3JsZEJhc2UhLndpZHRoIC8gMixcbiAgICAgICAgICAtdGhpcy52b2x1bWVXb3JsZEJhc2UhLmhlaWdodCAvIDIsXG4gICAgICAgICAgKCh0aGlzLnZvbHVtZVdvcmxkQmFzZSEuZGVwdGggKiB0aGlzLnZvbHVtZVpTY2FsZSkgLyAyKSAqIDEuMTIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldFNjYWxlOiAoKSA9PiB0aGlzLnZvbHVtZVpTY2FsZSxcbiAgICAgICAgc2V0U2NhbGU6IChzKSA9PiB0aGlzLnNldFZvbHVtZVpTY2FsZShzKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnN1YnNjcmliZVZvbHVtZURpc3BsYXlTdGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RyZXRjaCB0aGUgdm9sdW1lJ3MgWiBoZWlnaHQgbGl2ZSAoZHJpdmVuIGJ5IHRoZSBpbi12aWV3IHtAbGluayBOYXBhcmlWb2x1bWVaSGFuZGxlfSkuIE9ubHlcbiAgICogdGhlIHBlci1heGlzIGB2b3hlbFNpemVgIC8gYXhlcyBkZXB0aCBjaGFuZ2Ug4oCUIHRoZSB2b3hlbCB0ZXh0dXJlcyBhcmUgdW50b3VjaGVkIOKAlCBzbyBkcmFnZ2luZyBpc1xuICAgKiBzbW9vdGguIGBmYWN0b3JgIGlzIHJlbGF0aXZlIHRvIHRoZSB2b2x1bWUncyBuYXR1cmFsIHByb3BvcnRpb25zICgxKS4gUGVyc2lzdHMgYWNyb3NzIHJlLW1vdW50c1xuICAgKiAocmVzb2x1dGlvbiBjaGFuZ2VzKSBzbyB0aGUgY2hvc2VuIGhlaWdodCBzdGlja3MuXG4gICAqL1xuICBwcml2YXRlIHNldFZvbHVtZVpTY2FsZShmYWN0b3I6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudm9sdW1lWlNjYWxlID0gTWF0aC5taW4oMTAsIE1hdGgubWF4KDAuMSwgZmFjdG9yKSk7XG4gICAgY29uc3QgYmFzZSA9IHRoaXMudm9sdW1lV29ybGRCYXNlO1xuICAgIGlmICghYmFzZSB8fCAhdGhpcy52b2x1bWVWaWV3KSByZXR1cm47XG4gICAgY29uc3Qgd29ybGRaID0gYmFzZS5kZXB0aCAqIHRoaXMudm9sdW1lWlNjYWxlO1xuICAgIGNvbnN0IHZzWiA9IHdvcmxkWiAvIHRoaXMudm9sdW1lU2FtcGxlZERlcHRoO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy52b2x1bWVWaWV3LmxheWVycykge1xuICAgICAgY29uc3QgW3N4LCBzeV0gPSBsYXllci52b3hlbFNpemU7XG4gICAgICBsYXllci52b3hlbFNpemUgPSBbc3gsIHN5LCB2c1pdO1xuICAgIH1cbiAgICBpZiAodGhpcy5heGVzTGF5ZXIpIHRoaXMuYXhlc0xheWVyLmRlcHRoID0gd29ybGRaO1xuICAgIHRoaXMuYXhlc0xhYmVscz8udXBkYXRlQW5jaG9ycyhcbiAgICAgIHRoaXMuYnVpbGRBeGVzTGFiZWxzKHsgd2lkdGg6IGJhc2Uud2lkdGgsIGhlaWdodDogYmFzZS5oZWlnaHQsIGRlcHRoOiB3b3JsZFogfSksXG4gICAgKTtcbiAgICB0aGlzLnpIYW5kbGU/LnJlcG9zaXRpb24oKTtcbiAgICB0aGlzLnZpZXdlcj8ucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqIEJ1aWxkIHRoZSBYL1kvWiBheGlzLWVuZCBsYWJlbCBzcGVjcyBmb3IgdGhlIDNEIGdpem1vLiBBbmNob3JzIGFyZSBpbiB0aGUgdm9sdW1lJ3MgY2VudHJlZFxuICAgKiAgd29ybGQgYm94IChtYXRjaGluZyB0aGUgQXhlc0xheWVyIGdlb21ldHJ5KTsgdGhlIHNjYWxlIHRleHQgcmVmbGVjdHMgdGhlIEZVTEwgaW1hZ2UgZXh0ZW50IOKAlFxuICAgKiAgcGh5c2ljYWwgwrVtIHdoZW4gwrVtL3BpeGVsIGlzIGtub3duLCBlbHNlIHBpeGVsIChYL1kpIC8gc2xpY2UgKFopIGNvdW50cy4gKi9cbiAgcHJpdmF0ZSBidWlsZEF4ZXNMYWJlbHMoXG4gICAgdm9sOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyOyBkZXB0aDogbnVtYmVyIH0sXG4gICk6IEF4aXNMYWJlbFNwZWNbXSB7XG4gICAgY29uc3QgaHggPSB2b2wud2lkdGggLyAyO1xuICAgIGNvbnN0IGh5ID0gdm9sLmhlaWdodCAvIDI7XG4gICAgY29uc3QgaHogPSB2b2wuZGVwdGggLyAyO1xuICAgIC8vIE1lYXN1cmVkIGZyb20gdGhlIElNQUdFJ3Mgb3duIGV4dGVudCwgbmV2ZXIgZnJvbSB0aGUgd29ybGQgYm94OiB0aGUgYm94IGlzIGFcbiAgICAvLyBzaGFwZSAoYW5kIGZvciBhIHBoeXNpY2FsbHkgc2l6ZWQgdm9sdW1lIGl0IGlzIGFscmVhZHkgaW4gwrVtLCBzbyByZWFkaW5nIGFcbiAgICAvLyBwaXhlbCBjb3VudCBvZmYgaXQgYW5kIG11bHRpcGx5aW5nIGJ5IG1wcCB3b3VsZCBzY2FsZSB0aGUgbGFiZWwgdHdpY2UpLlxuICAgIGNvbnN0IHsgcHgsIG1wcCB9ID0gdGhpcy5pbWFnZUV4dGVudCgpO1xuICAgIGNvbnN0IGxlbiA9IChuOiBudW1iZXIsIHVtOiBudW1iZXIpOiBzdHJpbmcgPT4gKHVtID4gMCA/IGZvcm1hdFVtKG4gKiB1bSkgOiBgJHtufSBweGApO1xuICAgIHJldHVybiBbXG4gICAgICB7IGFuY2hvcjogW2h4LCAtaHksIC1oel0sIHRleHQ6IGBYIMK3ICR7bGVuKHB4WzBdLCBtcHBbMF0pfWAsIGNvbG9yOiAnI2VkNDU0NScgfSxcbiAgICAgIHsgYW5jaG9yOiBbLWh4LCBoeSwgLWh6XSwgdGV4dDogYFkgwrcgJHtsZW4ocHhbMV0sIG1wcFsxXSl9YCwgY29sb3I6ICcjNGRkOTU5JyB9LFxuICAgICAgLy8gUGh5c2ljYWwgd2hlbiB0aGUgc3RhY2sgZGVjbGFyZXMgaXRzIHNsaWNlIHNwYWNpbmcgKGBtcHBaYCkg4oCUIGEgcmVzYW1wbGVkXG4gICAgICAvLyB2b2x1bWUga25vd3MgaG93IHRoaWNrIGl0IGlzOyBhIHBsYWluIHotc3RhY2sgY2FuIG9ubHkgc2F5IGhvdyBtYW55IHNsaWNlcy5cbiAgICAgIHsgYW5jaG9yOiBbLWh4LCAtaHksIGh6XSwgdGV4dDogYFogwrcgJHtsZW4ocHhbMl0sIG1wcFsyXSl9YCwgY29sb3I6ICcjNjY4Y2ZmJyB9LFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogVGhlIGltYWdlJ3MgZGVjbGFyZWQgZXh0ZW50IGluIHBpeGVscy9zbGljZXMsIGFuZCBpdHMgcGh5c2ljYWwgc3BhY2luZyBwZXJcbiAgICogYXhpcyBpbiDCtW0gKDAgPSB1bmRlY2xhcmVkLCBhbmQgdGhlbiB0aGF0IGF4aXMgcmVhZHMgaW4gcGl4ZWxzKS5cbiAgICpcbiAgICogT25lIHBsYWNlLCBiZWNhdXNlIHRoZSB2b2x1bWUgd29ybGQgYm94IGFuZCB0aGUgYXhpcyBsYWJlbHMgaGF2ZSB0byBhZ3JlZVxuICAgKiBhYm91dCB3aGF0IHRoZSBpbWFnZSdzIHJlYWwgZGltZW5zaW9ucyBhcmUg4oCUIHRoZSBzYW1wbGVkIGdyaWQgaXMgZGVjaW1hdGVkIGFuZFxuICAgKiBzYXlzIG5vdGhpbmcgYWJvdXQgZWl0aGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBpbWFnZUV4dGVudCgpOiB7IHB4OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl07IG1wcDogW251bWJlciwgbnVtYmVyLCBudW1iZXJdIH0ge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmxvYWRlZD8uaW1hZ2VJbmZvLmltYWdlTWV0YT8uWzBdO1xuICAgIGNvbnN0IGRpbXMgPSB0aGlzLnZvbHVtZURpbXM7XG4gICAgY29uc3QgbXBwWCA9IHRoaXMuZGVzY3JpcHRvcj8ubXBwWCB8fCBtZXRhPy5tcHBYIHx8IDA7XG4gICAgcmV0dXJuIHtcbiAgICAgIHB4OiBbXG4gICAgICAgIHRoaXMuZGVzY3JpcHRvcj8ud2lkdGggPz8gbWV0YT8ueCA/PyBkaW1zPy53aWR0aCA/PyAxLFxuICAgICAgICB0aGlzLmRlc2NyaXB0b3I/LmhlaWdodCA/PyBtZXRhPy55ID8/IGRpbXM/LmhlaWdodCA/PyAxLFxuICAgICAgICBtZXRhPy56IHx8IHRoaXMubG9hZGVkPy5pbWFnZUluZm8udXJscz8ubGVuZ3RoIHx8IGRpbXM/LmRlcHRoIHx8IDEsXG4gICAgICBdLFxuICAgICAgLy8gQSBkZXNjcmlwdG9yIHRoYXQgcmVwb3J0cyBvbmx5IG1wcFggaXMgc3F1YXJlLXBpeGVsIGJ5IGNvbnZlbnRpb24sIHdoaWNoIGlzXG4gICAgICAvLyB3aGF0IHRoZSAyRCBzY2FsZSBiYXIgYWxyZWFkeSBhc3N1bWVzIG9mIGl0LlxuICAgICAgbXBwOiBbbXBwWCwgdGhpcy5kZXNjcmlwdG9yPy5tcHBZIHx8IG1ldGE/Lm1wcFkgfHwgbXBwWCwgbWV0YT8ubXBwWiB8fCAwXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFzc2VtYmxlIGEgZG93bnNhbXBsZWQgdWludDggdm9sdW1lIChsdW1pbmFuY2UpIGZyb20gdGhlIHBlci1zbGljZSB0aWxlIGVuZHBvaW50LiBTbGljZXMgYXJlXG4gICAqIGZldGNoZWQgd2l0aCBib3VuZGVkIGNvbmN1cnJlbmN5IChrZWVwcyB0aGUgY29ubmVjdGlvbiBwb29sIGZ1bGwgd2l0aG91dCBmbG9vZGluZyBpdCBvbiBhIGRlZXBcbiAgICogc3RhY2spIGFuZCByZWFkIGludG8gdGhlIHZvbHVtZSBhcyBlYWNoIGFycml2ZXMsIGRyaXZpbmcge0BsaW5rIHN0YWNrTG9hZGluZ1Byb2dyZXNzJH0gc28gdGhlXG4gICAqIGhvc3Qgc2hvd3MgYSBkZXRlcm1pbmF0ZSBwcm9ncmVzcyBiYXIgaW5zdGVhZCBvZiBhIGJhcmUgc3Bpbm5lci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYXNzZW1ibGVWb2x1bWUoXG4gICAgaW5mbzogSUltYWdlSW5mbyB8IHVuZGVmaW5lZCxcbiAgICBvcHRzOiB7IG1heFNsaWNlPzogbnVtYmVyOyBzbGljZVN0ZXA/OiBudW1iZXIgfSA9IHt9LFxuICAgIGNoYW5uZWw/OiBudW1iZXIsXG4gICk6IFByb21pc2U8eyBkYXRhOiBVaW50OEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlcjsgZGVwdGg6IG51bWJlciB9IHwgbnVsbD4ge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5sb2FkVG9rZW47IC8vIGJhaWwgaWYgYSBDYW5jZWwgLyBuZXcgcGxvdCBidW1wcyB0aGlzIHdoaWxlIHdlIGZldGNoXG4gICAgY29uc3QgZnVsbERlcHRoID0gaW5mbz8uaW1hZ2VNZXRhPy5bMF0/LnogfHwgaW5mbz8udXJscz8ubGVuZ3RoIHx8IDE7XG4gICAgaWYgKGZ1bGxEZXB0aCA8IDEpIHtcbiAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gbm8gc2xpY2VzIHRvIGFzc2VtYmxlIGEgdm9sdW1lJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgc3RlcCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3Iob3B0cy5zbGljZVN0ZXAgPz8gMSkpO1xuICAgIGNvbnN0IG1heFNsaWNlID0gb3B0cy5tYXhTbGljZSA/PyBWT0xVTUVfTUFYX1NMSUNFO1xuICAgIC8vIFNvdXJjZS1zbGljZSBpbmRpY2VzIHNhbXBsZWQgaW50byB0aGUgdm9sdW1lIChldmVyeSBgc3RlcGB0aCBwbGFuZSDihpIgbG93LXJlcyBpcyBmYXN0ZXIpLlxuICAgIGNvbnN0IHpJbmRpY2VzOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IHogPSAwOyB6IDwgZnVsbERlcHRoOyB6ICs9IHN0ZXApIHpJbmRpY2VzLnB1c2goeik7XG4gICAgY29uc3QgZGVwdGggPSB6SW5kaWNlcy5sZW5ndGg7XG5cbiAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICAgIHRyeSB7XG4gICAgICAvLyBGZXRjaCBlYWNoIHNsaWNlIGF0IGEgcHlyYW1pZCBsZXZlbCBtYXRjaGluZyBgbWF4U2xpY2VgIChidWRnZXQgc2NhbGVzIHdpdGggdGhlIGRlY2ltYXRlXG4gICAgICAvLyBmYWN0b3IpLCBzbyBhIGhpZ2hlciBmYWN0b3IgcHVsbHMgYSBmaW5lciBsZXZlbCDihpIgbW9yZSByZWFsIGluLXBsYW5lIGRldGFpbDsgdGhlbiBkb3duc2FtcGxlXG4gICAgICAvLyB0byBgbWF4U2xpY2VgLiBgY2hhbm5lbGAgc2VsZWN0cyBhIGJhbmQgKG11bHRpY2hhbm5lbCB2b2x1bWUpOyBvbWl0IGZvciB0aGUgZ3JheXNjYWxlXG4gICAgICAvLyBjb21wb3NpdGUuIFRoZSBjYWxsZXIgb3ducyB0aGUgc3RhY2tMb2FkaW5nIGZsYWcgKG11bHRpY2hhbm5lbCBhc3NlbWJsZXMgY2hhbm5lbHMgaW4gdHVybikuXG4gICAgICBjb25zdCBidWRnZXQgPSB0aGlzLnRpbGVCdWRnZXRGb3IobWF4U2xpY2UpO1xuICAgICAgY29uc3QgZmlyc3QgPSBhd2FpdCB0aGlzLmZldGNoU2xpY2UoekluZGljZXNbMF0sIGNoYW5uZWwsIGJ1ZGdldCk7XG4gICAgICBjb25zdCBzY2FsZSA9IE1hdGgubWluKDEsIG1heFNsaWNlIC8gTWF0aC5tYXgoZmlyc3Qud2lkdGgsIGZpcnN0LmhlaWdodCwgMSkpO1xuICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGZpcnN0LndpZHRoICogc2NhbGUpKTtcbiAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoZmlyc3QuaGVpZ2h0ICogc2NhbGUpKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheSh3aWR0aCAqIGhlaWdodCAqIGRlcHRoKTtcblxuICAgICAgbGV0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBPZmZzY3JlZW5DYW52YXM7XG4gICAgICBpZiAodHlwZW9mIE9mZnNjcmVlbkNhbnZhcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpIGFzXG4gICAgICAgIHwgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICAgIHwgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICAgIHwgbnVsbDtcbiAgICAgIGlmICghY3R4KSB0aHJvdyBuZXcgRXJyb3IoJ25hcGFyaS1qcyB2b2x1bWUgYXNzZW1ibHk6IDJEIGNvbnRleHQgdW5hdmFpbGFibGUnKTtcblxuICAgICAgLy8gUmVhZCBvbmUgZmV0Y2hlZCBzbGljZSBiaXRtYXAgaW50byB0aGUgdm9sdW1lIHBsYW5lIGB6YCAobHVtaW5hbmNlKS4gU3luY2hyb25vdXMgYmV0d2VlblxuICAgICAgLy8gYXdhaXRzLCBzbyB0aGUgc2hhcmVkIDJEIGNvbnRleHQgaXMgc2FmZSB0byByZXVzZSBhY3Jvc3MgdGhlIGNvbmN1cnJlbnQgZmV0Y2ggd29ya2Vycy5cbiAgICAgIGxldCBkb25lID0gMDtcbiAgICAgIGNvbnN0IHJlYWRTbGljZSA9ICh6OiBudW1iZXIsIGJtcDogSW1hZ2VCaXRtYXApOiB2b2lkID0+IHtcbiAgICAgICAgY3R4LmNsZWFyUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgY3R4LmRyYXdJbWFnZShibXAsIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBjb25zdCByZ2JhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCB3aWR0aCwgaGVpZ2h0KS5kYXRhO1xuICAgICAgICBjb25zdCBiYXNlID0geiAqIHdpZHRoICogaGVpZ2h0O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdpZHRoICogaGVpZ2h0OyBpKyspIHtcbiAgICAgICAgICBkYXRhW2Jhc2UgKyBpXSA9XG4gICAgICAgICAgICAocmdiYVtpICogNF0gKiAwLjI5OSArIHJnYmFbaSAqIDQgKyAxXSAqIDAuNTg3ICsgcmdiYVtpICogNCArIDJdICogMC4xMTQpIHwgMDtcbiAgICAgICAgfVxuICAgICAgICBibXAuY2xvc2U/LigpO1xuICAgICAgICBkb25lKys7XG4gICAgICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoTWF0aC5yb3VuZCgoZG9uZSAvIGRlcHRoKSAqIDEwMCkpO1xuICAgICAgfTtcblxuICAgICAgcmVhZFNsaWNlKDAsIGZpcnN0KTtcblxuICAgICAgLy8gUmVtYWluaW5nIHBsYW5lcyB2aWEgYSBzbWFsbCBwb29sIG9mIHdvcmtlcnMgZHJhaW5pbmcgYSBzaGFyZWQgcXVldWUuIEVhY2ggcGxhbmUgYHBgXG4gICAgICAvLyBtYXBzIHRvIHNvdXJjZSBzbGljZSBgekluZGljZXNbcF1gIChzdWJzYW1wbGVkIGZvciBsb3ctcmVzKS5cbiAgICAgIGNvbnN0IHBlbmRpbmc6IG51bWJlcltdID0gW107XG4gICAgICBmb3IgKGxldCBwID0gMTsgcCA8IGRlcHRoOyBwKyspIHBlbmRpbmcucHVzaChwKTtcbiAgICAgIGNvbnN0IHdvcmtlciA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIGNvbnN0IHAgPSBwZW5kaW5nLnNoaWZ0KCk7XG4gICAgICAgICAgaWYgKHAgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmxvYWRUb2tlbiAhPT0gdG9rZW4pIHJldHVybjtcbiAgICAgICAgICByZWFkU2xpY2UocCwgYXdhaXQgdGhpcy5mZXRjaFNsaWNlKHpJbmRpY2VzW3BdLCBjaGFubmVsLCBidWRnZXQpKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IHBvb2xTaXplID0gTWF0aC5taW4oVk9MVU1FX0ZFVENIX0NPTkNVUlJFTkNZLCBNYXRoLm1heCgxLCBkZXB0aCAtIDEpKTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKEFycmF5LmZyb20oeyBsZW5ndGg6IHBvb2xTaXplIH0sICgpID0+IHdvcmtlcigpKSk7XG5cbiAgICAgIGlmICh0aGlzLmxvYWRUb2tlbiAhPT0gdG9rZW4pIHJldHVybiBudWxsOyAvLyBjYW5jZWxsZWQg4oaSIGRvbid0IHJlbmRlciBhIHBhcnRpYWwgdm9sdW1lXG4gICAgICByZXR1cm4geyBkYXRhLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNb3VudCB0aGUgTkFQQVJJX1NDQVRURVIgMkQgc2NhdHRlcjogdGhlIHNsaWNlIGltYWdlIHdpdGggYSBwb2ludHMgbGF5ZXIgYXQgZWFjaCByZWdpb24nc1xuICAgKiBjZW50cm9pZCAobmFwYXJpLWpzIGFuYWxvZyBvZiBQbG90bHkncyByZWdpb24tY2VudHJvaWQgc2NhdHRlcikuIFJlYnVpbGRzIHRoZSBwb2ludHMgbGl2ZSBhc1xuICAgKiByZWdpb25zIGNoYW5nZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbW91bnRTY2F0dGVyKHZpZXdlcjogVmlld2VyLCBob3N0OiBIVE1MRWxlbWVudCwgejogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5yZW5kZXJJbWFnZSh6KTtcbiAgICB0aGlzLmZpdENhbWVyYVNvb24oKTtcbiAgICB0aGlzLnN1YnNjcmliZURpc3BsYXlTdGF0ZSgpO1xuICAgIHRoaXMuaW5zdGFsbFNjYWxlQmFyKCk7XG4gICAgLy8gVGhpcyBtb2RlIHBsb3RzIFJFR0lPTiBjZW50cm9pZHMsIHNvIHdpdGhvdXQgdGhlIHJlZ2lvbiB0b29scyB0aGVyZSBpcyBub1xuICAgIC8vIHdheSB0byBwcm9kdWNlIGEgcG9pbnQg4oCUIGRyYXdpbmcgYSByZWdpb24gbm93IGFkZHMgb25lIGltbWVkaWF0ZWx5LlxuICAgIHRoaXMuaW5zdGFsbDJkSW50ZXJhY3Rpb24odmlld2VyLCBob3N0KTtcbiAgICB0aGlzLnJlYnVpbGRTY2F0dGVyUG9pbnRzKCk7XG4gICAgdGhpcy5zY2F0dGVyUmVnaW9uU3ViID0gdGhpcy5yZWdpb25TdG9yZVxuICAgICAgLmdldFJlZ2lvblVwZGF0ZUV2ZW50KClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5yZWJ1aWxkU2NhdHRlclBvaW50cygpKTtcbiAgICB0aGlzLnNjaGVkdWxlUmVhZGJhY2soKTtcbiAgfVxuXG4gIC8qKiAoUmUpYnVpbGQgdGhlIDJEIHNjYXR0ZXIncyBwb2ludCBsYXllciBhdCB0aGUgY3VycmVudCByZWdpb24gY2VudHJvaWRzLiAqL1xuICBwcml2YXRlIHJlYnVpbGRTY2F0dGVyUG9pbnRzKCk6IHZvaWQge1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBpZiAoIXYpIHJldHVybjtcbiAgICBpZiAodGhpcy5zY2F0dGVyMmRQb2ludHMpIHtcbiAgICAgIHYubGF5ZXJzLnJlbW92ZSh0aGlzLnNjYXR0ZXIyZFBvaW50cyk7XG4gICAgICB0aGlzLnNjYXR0ZXIyZFBvaW50cyA9IG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGNlbnRyb2lkcyA9IHRoaXMucmVnaW9uQ2VudHJvaWRzKCk7XG4gICAgaWYgKGNlbnRyb2lkcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB0aGlzLnNjYXR0ZXIyZFBvaW50cyA9IHYuYWRkUG9pbnRzKGNlbnRyb2lkcywge1xuICAgICAgc2l6ZTogMTIsXG4gICAgICBmYWNlQ29sb3I6IFsxLCAwLjg1LCAwLjIsIDFdLFxuICAgICAgYm9yZGVyQ29sb3I6IFswLCAwLCAwLCAxXSxcbiAgICAgIGJvcmRlcldpZHRoOiAyLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJlZ2lvbiBjZW50cm9pZHMgYXMgZmxhdCBgW3gsIHksIOKApl1gIGRhdGEgY29vcmRzIChyZWN0YW5nbGUgLyBwb2x5Z29uIC8gbXVsdGlwb2x5Z29uKS4gKi9cbiAgcHJpdmF0ZSByZWdpb25DZW50cm9pZHMoKTogRmxvYXQzMkFycmF5IHtcbiAgICBjb25zdCBvdXQ6IG51bWJlcltdID0gW107XG4gICAgY29uc3QgcG9seUNlbnRyb2lkID0gKHhzOiBudW1iZXJbXSwgeXM6IG51bWJlcltdKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBuID0geHMubGVuZ3RoO1xuICAgICAgaWYgKG4gPT09IDApIHJldHVybjtcbiAgICAgIGxldCBjeCA9IDA7XG4gICAgICBsZXQgY3kgPSAwO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgY3ggKz0geHNbaV07XG4gICAgICAgIGN5ICs9IHlzW2ldO1xuICAgICAgfVxuICAgICAgb3V0LnB1c2goY3ggLyBuLCBjeSAvIG4pO1xuICAgIH07XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpKSB7XG4gICAgICBjb25zdCBiID0gci5ib3VuZHMgYXNcbiAgICAgICAgfCB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9XG4gICAgICAgIHwgeyB4cG9pbnRzOiBudW1iZXJbXTsgeXBvaW50czogbnVtYmVyW10gfVxuICAgICAgICB8IHsgcG9seWdvbnM6IHsgeHBvaW50czogbnVtYmVyW107IHlwb2ludHM6IG51bWJlcltdIH1bXSB9XG4gICAgICAgIHwgbnVsbFxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICghYikgY29udGludWU7XG4gICAgICBpZiAoJ3dpZHRoJyBpbiBiICYmICd4JyBpbiBiKSB7XG4gICAgICAgIG91dC5wdXNoKGIueCArIGIud2lkdGggLyAyLCBiLnkgKyBiLmhlaWdodCAvIDIpO1xuICAgICAgfSBlbHNlIGlmICgneHBvaW50cycgaW4gYikge1xuICAgICAgICBwb2x5Q2VudHJvaWQoYi54cG9pbnRzLCBiLnlwb2ludHMpO1xuICAgICAgfSBlbHNlIGlmICgncG9seWdvbnMnIGluIGIpIHtcbiAgICAgICAgZm9yIChjb25zdCBwIG9mIGIucG9seWdvbnMpIHBvbHlDZW50cm9pZChwLnhwb2ludHMsIHAueXBvaW50cyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KG91dCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGludGVyYWN0aW9uIHN0YWNrIGV2ZXJ5IDJEIG1vZGUgbmVlZHM6IHRoZSByZWdpb24gb3ZlcmxheSAoZHJhdy9zZWxlY3QvZWRpdCksIHRoZSBwaXhlbFxuICAgKiB0b29scyB0aGF0IHJlYWQgYmFjayBkaXNwbGF5ZWQgcGl4ZWxzICh3YW5kLCBicnVzaCwgdmVydGV4IGVyYXNlciwgem9vbS10by1ib3gsIFNBTS9jZWxscG9zZSksXG4gICAqIGFuZCBhIGNhbWVyYSBob29rIHRoYXQga2VlcHMgdGhhdCByZWFkYmFjayBjdXJyZW50IGFzIHRoZSB2aWV3IHBhbnMvem9vbXMgYW5kIHRpbGVkIGxldmVsc1xuICAgKiBsb2FkLlxuICAgKlxuICAgKiBFeHRyYWN0ZWQgYmVjYXVzZSBmb3JnZXR0aW5nIGl0IGlzIGludmlzaWJsZTogdGhlIHRvb2xiYXIgZ2F0ZXMgaXRzIHJlZ2lvbiBidXR0b25zIG9uIDJELXZzLTNEXG4gICAqIHJhdGhlciB0aGFuIG9uIHBsb3QgdHlwZSwgc28gYSAyRCBtb2RlIHRoYXQgc2tpcHMgdGhpcyBzaG93cyBldmVyeSB0b29sIGFuZCBzaWxlbnRseSBkb2VzXG4gICAqIG5vdGhpbmcuIFRoYXQgaXMgZXhhY3RseSB3aGF0IGhhcHBlbmVkIHRvIHRoZSBzcGF0aWFsIGFuZCByZWdpb24tY2VudHJvaWQgc2NhdHRlciBtb2Rlcy5cbiAgICovXG4gIHByaXZhdGUgaW5zdGFsbDJkSW50ZXJhY3Rpb24odmlld2VyOiBWaWV3ZXIsIGhvc3Q6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25PdmVybGF5ID0gbmV3IE5hcGFyaVJlZ2lvbk92ZXJsYXkoaG9zdCwgdmlld2VyLCB0aGlzLnJlZ2lvblN0b3JlKTtcbiAgICB0aGlzLmJ1aWxkVG9vbEhvc3RzKCk7XG4gICAgdGhpcy5jYW1lcmFSZWFkYmFja09mZiA9IHZpZXdlci5jYW1lcmEuY2hhbmdlZC5jb25uZWN0KCgpID0+IHRoaXMuYXJtUmVhZGJhY2soKSk7XG4gIH1cblxuICAvLyDilIDilIAgU3BhdGlhbCBvbWljcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogTWFya2VyIHJhZGl1cyAoaW1hZ2UgcHgpIGZvciBhIGRhdGFzZXQgdGhhdCBkZWNsYXJlcyBub25lIOKAlCBzZWdtZW50ZWQgY2VsbHMgb2Z0ZW4gZG9uJ3QuICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNQQVRJQUxfRkFMTEJBQ0tfUkFESVVTID0gNDtcbiAgLyoqIFNtYWxsZXN0IG1hcmtlciBESUFNRVRFUiwgaW4gc2xpY2UgcGl4ZWxzLCBvdmVyIGEgdm9sdW1lLWJhY2tlZCBkYXRhc2V0LiBBIGNlbGwncyByZWFsXG4gICAqICBzaXplIGlzIGhvbm91cmVkIHdoZXJldmVyIGl0IHN1cnZpdmVzIHRoZSBncmlkOiB0aGUgQUJDIGF0bGFzIHNlcnZlcyA1IMK1bSByYWRpaSBvbiBhXG4gICAqICA0MCDCtW0vcHggdGVtcGxhdGUsIHNvIGRyYXdpbmcgdGhlbSB0byBzY2FsZSB3b3VsZCBwdXQgZXZlcnkgY2VsbCBhIGZpZnRoIG9mIGEgcGl4ZWwgd2lkZVxuICAgKiAgYW5kIHRoZSBzZWN0aW9uIHdvdWxkIGNvbWUgdXAgZW1wdHkuIFRoZSBwb2ludC1zaXplIGNvbnRyb2wgc2NhbGVzIHVwIGZyb20gdGhpcyBmbG9vci4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU1BBVElBTF9TTElDRV9NSU5fRElBTUVURVJfUFggPSAxLjU7XG4gIC8qKiBMb25nZXN0IHNpZGUgb2YgdGhlIGdlbmUtbWFwIHJhc3RlciwgaW4gZmllbGQgcGl4ZWxzLiBBIGdlbmUgbWFwIGlzIGEgc21vb3RoXG4gICAqICBmaWVsZCByZWFkIGFzIHRlcnJpdG9yeSwgc28gaXQgZ2FpbnMgbm90aGluZyBmcm9tIG1hdGNoaW5nIGEgMiBHcHggc2xpZGUnc1xuICAgKiAgcmVzb2x1dGlvbiDigJQgYW5kIHRoZSBlc3RpbWF0ZSBjb3N0cyBvbmUgcGFzcyBvdmVyIHRoaXMgbWFueSBwaXhlbHMuICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEdFTkVfTUFQX01BWF9TSURFID0gNTEyO1xuICAvKiogS2VybmVsIM+DIGluIGZpZWxkIHBpeGVscyBhdCBzbW9vdGhpbmcgMTogd2lkZSBlbm91Z2ggdG8gcmVhZCBiZXR3ZWVuIGNlbGxzLFxuICAgKiAgdGlnaHQgZW5vdWdoIHRvIGtlZXAgYSBudWNsZXVzLXNjYWxlIHN0cnVjdHVyZSBkaXN0aW5jdC4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgR0VORV9NQVBfU0lHTUEgPSAyLjU7XG4gIC8qKiBDbHVzdGVycyBkcmF3biBhcyBkZW5zaXR5IHZvbHVtZXMgYXQgb25jZS4gUGFzdCBhIGhhbmRmdWwsIGFkZGl0aXZlIHRyYW5zbHVjZW50XG4gICAqICBjbG91ZHMgc3RvcCBiZWluZyBzZXBhcmFibGUgYnkgZXllIOKAlCBhbmQgZWFjaCBvbmUgaXMgYSBmdWxsIHJhc3RlcmlzYXRpb24uICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFTlNJVFlfTUFYX0NMVVNURVJTID0gNjtcbiAgLyoqIENvbG91ciBmb3Igb2JzZXJ2YXRpb25zIHdoZW4gbm90aGluZyBpcyBzZWxlY3RlZCB0byBjb2xvdXIgYnk6IHZpc2libGUsIG5ldXRyYWwsIGFuZFxuICAgKiAgb2J2aW91c2x5IG5vdCBlbmNvZGluZyBhbnl0aGluZy4gKi9cbiAgLyoqIEhvdyBtdWNoIGxhcmdlciBhIHNlbGVjdGVkIG1hcmtlciBpcyBkcmF3biwgc28gYSBzbWFsbCBzZWxlY3Rpb24gaXMgZmluZGFibGUgaW5zaWRlIGFcbiAgICogIDMuN00tcG9pbnQgY2xvdWQgcmF0aGVyIHRoYW4gbWVyZWx5IGJyaWdodGVyLiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTUEFUSUFMX1NFTEVDVEVEX1NJWkVfU0NBTEUgPSAxLjY7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU1BBVElBTF9ORVVUUkFMX0NPTE9SOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9XG4gICAgWzAuMzUsIDAuNzIsIDAuOTUsIDAuOV07XG5cbiAgLyoqXG4gICAqIE1vdW50IHRoZSBTUEFUSUFMX09NSUNTIHZpZXc6IHRoZSB0aXNzdWUgaW1hZ2Ugd2l0aCBvbmUgbWFya2VyIHBlciBvYnNlcnZhdGlvbiwgY29sb3VyZWQgYnlcbiAgICogYW4gYW5ub3RhdGlvbiBjb2x1bW4gb3IgYSBnZW5lLiBUaGUgbWFya2VycyByZWJ1aWxkIHdoZW5ldmVyIHRoZSBkYXRhc2V0IG9yIHRoZSB2aWV3IHN0YXRlXG4gICAqIGNoYW5nZXMsIHNvIHN3aXRjaGluZyB0aGUgY29sb3VyLWJ5IGNvbHVtbiBkb2VzIG5vdCByZW1vdW50IHRoZSBzY2VuZS5cbiAgICpcbiAgICogU2V0cyB1cCB0aGUgZnVsbCAyRCBpbnRlcmFjdGlvbiBzdGFjayDigJQgcmVnaW9uIG92ZXJsYXksIHBpeGVsLXRvb2wgaG9zdHMsIHJlYWRiYWNrIGN1cnJlbmN5IOKAlFxuICAgKiBleGFjdGx5IGFzIHRoZSBwbGFpbiBpbWFnZSB2aWV3IGRvZXMuIFRoYXQgaXMgTk9UIG9wdGlvbmFsIGhlcmU6IHRoaXMgbW9kZSdzIHNlbGVjdGlvbiBpc1xuICAgKiBkcml2ZW4gYnkgZHJhd24gUk9Jcywgc28gd2l0aG91dCB0aGUgb3ZlcmxheSB0aGVyZSBpcyBubyB3YXkgdG8gbWFrZSBhIHNlbGVjdGlvbiBhdCBhbGwuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG1vdW50U3BhdGlhbE9taWNzKHZpZXdlcjogVmlld2VyLCBob3N0OiBIVE1MRWxlbWVudCwgejogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5yZW5kZXJJbWFnZSh6KTtcbiAgICAvLyBPbmx5IGZpdCB0byB0aGUgaW1hZ2Ugd2hlbiB0aGlzIGRhdGFzZXQgYWN0dWFsbHkgaGFzIG9uZS4gT3RoZXJ3aXNlIHRoZXJlIGlzXG4gICAgLy8gbm90aGluZyB0byBmaXQsIGBpbWFnZVdgL2BpbWFnZUhgIHN0aWxsIGhvbGQgdGhlIExBU1QgaW1hZ2UncyBkaW1lbnNpb25zLCBhbmRcbiAgICAvLyB0aGlzIGZpdHMgdG8gdGhvc2Ug4oCUIGFuZCBiZWNhdXNlIGl0IGRlZmVycyB0byBhIGZyYW1lLCBpdCBsYW5kcyBBRlRFUiB0aGUgcG9pbnRzXG4gICAgLy8gYXJlIGFkZGVkIGFuZCBvdmVyd3JpdGVzIHRoZSBmcmFtaW5nIHRoZXkgc2V0LiBUaGF0IGlzIHdoYXQgbGVmdCBhbiBpbWFnZS1sZXNzXG4gICAgLy8gZGF0YXNldCBhcyBhIHRlbi1waXhlbCBzcGVjayBvZmYgdG8gb25lIHNpZGUuXG4gICAgaWYgKHRoaXMuc3BhdGlhbExhdGVzdD8uWzBdPy5pbWFnZVJlZikgdGhpcy5maXRDYW1lcmFTb29uKCk7XG4gICAgdGhpcy5zdWJzY3JpYmVEaXNwbGF5U3RhdGUoKTtcbiAgICB0aGlzLmluc3RhbGxTY2FsZUJhcigpO1xuICAgIHRoaXMuaW5zdGFsbDJkSW50ZXJhY3Rpb24odmlld2VyLCBob3N0KTtcbiAgICB0aGlzLmluc3RhbGxTcGF0aWFsSG92ZXIoaG9zdCk7XG4gICAgdGhpcy5zdWJzY3JpYmVTcGF0aWFsKCk7XG4gICAgdGhpcy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaW9uIGRyYXdpbmcgZm9yIHRoZSAzRCBjbG91ZC5cbiAgICpcbiAgICogUmV1c2VzIHtAbGluayBOYXBhcmlSZWdpb25PdmVybGF5fSB2ZXJiYXRpbSBieSBoYW5kaW5nIGl0IGEgU0NSRUVOLVNQQUNFIHZpZXdlcjogdGhlIGRyYXduXG4gICAqIHNoYXBlIGlzIGEgbGFzc28gaW4gY2FudmFzIHBpeGVscywgc28gXCJ3b3JsZFwiIGlzIHRoZSBjYW52YXMgYW5kIGJvdGggdHJhbnNmb3JtcyBhcmUgaWRlbnRpdHlcbiAgICogKGJhciB0aGUgY2xpZW504oaSY2FudmFzIG9mZnNldCkuIEV2ZXJ5IGV4aXN0aW5nIHRvb2wg4oCUIHJlY3RhbmdsZSwgcG9seWdvbiwgZnJlZWhhbmQg4oCUIHRoZXJlZm9yZVxuICAgKiB3b3JrcyBpbiAzRCB3aXRoIG5vIG5ldyBkcmF3aW5nIGNvZGUuXG4gICAqXG4gICAqIEEgc2NyZWVuLXNwYWNlIHNoYXBlIHN0b3BzIG1lYW5pbmcgYW55dGhpbmcgdGhlIG1vbWVudCB0aGUgY2FtZXJhIG1vdmVzLCBzbyBhbiBvcmJpdCBjbGVhcnNcbiAgICogdGhlIGRyYXduIHJlZ2lvbnMuIFRoZSBTRUxFQ1RJT04gaXQgcHJvZHVjZWQgaXMga2VwdDogdGhhdCBpcyB0aGUgZHVyYWJsZSBhcnRlZmFjdCwgYW5kIHRoZVxuICAgKiBoaWdobGlnaHRlZCBwb2ludHMgc3RheSBoaWdobGlnaHRlZCBmcm9tIGV2ZXJ5IGFuZ2xlLlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsM2RJbnRlcmFjdGlvbih2aWV3ZXI6IFZpZXdlciwgaG9zdDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjYW52YXNSZWN0ID0gKCkgPT4gdGhpcy5jYW52YXM/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHNjcmVlblNwYWNlOiBPdmVybGF5Vmlld2VyID0ge1xuICAgICAgY2FudmFzVG9Xb3JsZDogKGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHIgPSBjYW52YXNSZWN0KCk7XG4gICAgICAgIHJldHVybiByID8gW2NsaWVudFggLSByLmxlZnQsIGNsaWVudFkgLSByLnRvcF0gOiBbY2xpZW50WCwgY2xpZW50WV07XG4gICAgICB9LFxuICAgICAgLy8gQWxyZWFkeSBjYW52YXMgcGl4ZWxzLlxuICAgICAgd29ybGRUb0NhbnZhczogKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PiBbeCwgeV0sXG4gICAgICBzZXRDb250cm9sc0VuYWJsZWQ6IChlbmFibGVkOiBib29sZWFuKSA9PiB2aWV3ZXIuc2V0Q29udHJvbHNFbmFibGVkKGVuYWJsZWQpLFxuICAgICAgY2FtZXJhOiB2aWV3ZXIuY2FtZXJhM2QsXG4gICAgfTtcbiAgICB0aGlzLnJlZ2lvbk92ZXJsYXkgPSBuZXcgTmFwYXJpUmVnaW9uT3ZlcmxheShob3N0LCBzY3JlZW5TcGFjZSwgdGhpcy5yZWdpb25TdG9yZSk7XG4gICAgdGhpcy5idWlsZFRvb2xIb3N0cygpO1xuICAgIHRoaXMuY2FtZXJhUmVhZGJhY2tPZmYgPSB2aWV3ZXIuY2FtZXJhM2QuY2hhbmdlZC5jb25uZWN0KCgpID0+IHtcbiAgICAgIC8vIE9ubHkgd2hpbGUgbm90aGluZyBpcyBiZWluZyBkcmF3biDigJQgY2xlYXJpbmcgbWlkLWdlc3R1cmUgd291bGQgZGVsZXRlIHRoZVxuICAgICAgLy8gc2hhcGUgdW5kZXIgdGhlIHVzZXIncyBjdXJzb3IuXG4gICAgICBpZiAodGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCkubGVuZ3RoID4gMCkgdGhpcy5yZWdpb25TdG9yZS5zZXRSZWdpb25zKFtdKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBNb3ZlbWVudCwgaW4gc2NyZWVuIHBpeGVscywgdW5kZXIgd2hpY2ggYSBwcmVzcy1yZWxlYXNlIGlzIGEgQ0xJQ0sgYW5kIG5vdCBhXG4gICAqICBkcmFnLiBBbiBvcmJpdCBvciBhIHBhbiBzdGFydHMgdGhlIHNhbWUgd2F5LCBzbyB0aGUgdHdvIGhhdmUgdG8gYmUgdG9sZFxuICAgKiAgYXBhcnQgYnkgaG93IGZhciB0aGUgcG9pbnRlciB0cmF2ZWxsZWQuICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENMSUNLX1NMT1BfUFggPSA0O1xuICAvKiogTG9uZ2VzdCBwcmVzcy1yZWxlYXNlIHN0aWxsIHRyZWF0ZWQgYXMgYSBjbGljay4gQSBsb25nIHByZXNzIHdpdGggdGhlIG1vdXNlXG4gICAqICBoZWxkIHN0aWxsIGlzIG1vcmUgbGlrZWx5IGFuIGludGVycnVwdGVkIGRyYWcgdGhhbiBhIHNlbGVjdGlvbi4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQ0xJQ0tfTUFYX01TID0gNjAwO1xuICAvKiogUG9pbnRlciBkaXN0YW5jZSwgaW4gc2NyZWVuIHBpeGVscywgdGhhdCBzdGlsbCBjb3VudHMgYXMgXCJvblwiIGEgbWFya2VyLlxuICAgKiAgR2VuZXJvdXMgcmVsYXRpdmUgdG8gYSAxLjVweCBkaXNjOiB0aGUgY3Vyc29yIGlzIGEgYmx1bnQgaW5zdHJ1bWVudCwgYW5kIGFcbiAgICogIHRvb2x0aXAgeW91IGhhdmUgdG8gaHVudCBmb3IgaXMgd29yc2UgdGhhbiBub25lLiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBIT1ZFUl9SQURJVVNfUFggPSAxMDtcblxuICAvKipcbiAgICogQ3Vyc29yIHRvb2x0aXAgZm9yIHRoZSBzcGF0aWFsIHZpZXdzOiBob3ZlciBhIG1hcmtlciwgcmVhZCBpdHMgY2xhc3MuXG4gICAqXG4gICAqIEEgMzQtZW50cnkgbGVnZW5kIGNhbm5vdCBiZSByZWFkIGJhY2sgZnJvbSBhIGRvdCDigJQgc2V2ZXJhbCBjbGFzc2VzIGdldFxuICAgKiBzaW1pbGFyIGNvbG91cnMsIGFuZCBtYXRjaGluZyBvbmUgdG8gYSBzd2F0Y2ggYnkgZXllIGlzIGV4YWN0bHkgdGhlIHRhc2sgdGhpc1xuICAgKiByZW1vdmVzLiBJdCByZXBvcnRzIHdoYXRldmVyIHRoZSBjbG91ZCBpcyBDVVJSRU5UTFkgY29sb3VyZWQgYnksIHNvIGl0IGFuZFxuICAgKiB0aGUgbGVnZW5kIGNhbiBuZXZlciBzYXkgZGlmZmVyZW50IHRoaW5ncy5cbiAgICpcbiAgICogTGlzdGVucyBvbiB0aGUgSE9TVCByYXRoZXIgdGhhbiB0aGUgY2FudmFzIHNvIGl0IGtlZXBzIHdvcmtpbmcgb3ZlciB0aGUgcmVnaW9uXG4gICAqIG92ZXJsYXkgKGFuIFNWRyBjb3ZlcmluZyB0aGUgY2FudmFzLCB3aGljaCB3b3VsZCBvdGhlcndpc2Ugc3dhbGxvdyBldmVyeVxuICAgKiBtb3ZlKSwgYW5kIHRocm90dGxlcyB0byBvbmUgaGl0LXRlc3QgcGVyIGFuaW1hdGlvbiBmcmFtZTogYSBwb2ludGVybW92ZSBjYW5cbiAgICogZmlyZSBmYXIgbW9yZSBvZnRlbiB0aGFuIHRoYXQsIGFuZCBlYWNoIHRlc3QgaXMgYSBwYXNzIG92ZXIgdGhlIGNsb3VkLlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsU3BhdGlhbEhvdmVyKGhvc3Q6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVTcGF0aWFsSG92ZXIoKTtcbiAgICB0aGlzLnNwYXRpYWxUb29sdGlwID0gbmV3IE5hcGFyaVNwYXRpYWxUb29sdGlwKGhvc3QpO1xuXG4gICAgY29uc3Qgb25Nb3ZlID0gKGU6IFBvaW50ZXJFdmVudCkgPT4ge1xuICAgICAgY29uc3QgY2FudmFzID0gdGhpcy5jYW52YXM7XG4gICAgICBpZiAoIWNhbnZhcykgcmV0dXJuO1xuICAgICAgY29uc3QgcmVjdCA9IGNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHRoaXMuaG92ZXJQb2ludGVyID0ge1xuICAgICAgICB4OiBlLmNsaWVudFggLSByZWN0LmxlZnQsXG4gICAgICAgIHk6IGUuY2xpZW50WSAtIHJlY3QudG9wLFxuICAgICAgICBjbGllbnRYOiBlLmNsaWVudFgsXG4gICAgICAgIGNsaWVudFk6IGUuY2xpZW50WSxcbiAgICAgIH07XG4gICAgICBpZiAodGhpcy5ob3ZlckZyYW1lKSByZXR1cm47XG4gICAgICB0aGlzLmhvdmVyRnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICB0aGlzLmhvdmVyRnJhbWUgPSAwO1xuICAgICAgICB0aGlzLnVwZGF0ZUhvdmVyKGhvc3QpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICBjb25zdCBvbkxlYXZlID0gKCkgPT4ge1xuICAgICAgdGhpcy5ob3ZlclBvaW50ZXIgPSBudWxsO1xuICAgICAgdGhpcy5zcGF0aWFsVG9vbHRpcD8uaGlkZSgpO1xuICAgIH07XG5cbiAgICAvLyBBIGNsaWNrIG9uIGEgbWFya2VyIHNlbGVjdHMgaXRzIGNsYXNzLCBleGFjdGx5IGFzIGNsaWNraW5nIHRoYXQgY2xhc3MgaW4gdGhlXG4gICAgLy8gcGFuZWwncyBsZWdlbmQgZG9lcyDigJQgaW5jbHVkaW5nIGNsaWNraW5nIGFnYWluIHRvIGNsZWFyLCBzbyBhIGNsaWNrIGlzXG4gICAgLy8gYWx3YXlzIHJldmVyc2libGUuIFRyYWNrZWQgYXMgZG93bi91cCByYXRoZXIgdGhhbiBib3VuZCB0byBgY2xpY2tgIHNvIGEgRFJBR1xuICAgIC8vIChhbiBvcmJpdCBpbiAzRCwgYSBwYW4gaW4gMkQpIGNhbiBiZSB0b2xkIGFwYXJ0IGZyb20gYSBjbGljazogdGhlIGdlc3R1cmVcbiAgICAvLyBoYXMgdG8gbW92ZSBsZXNzIHRoYW4gYSBmZXcgcGl4ZWxzIGFuZCBiZSBvdmVyIHF1aWNrbHkuXG4gICAgbGV0IGRvd246IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHQ6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3Qgb25Eb3duID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGRvd24gPSB7IHg6IGUuY2xpZW50WCwgeTogZS5jbGllbnRZLCB0OiBEYXRlLm5vdygpIH07XG4gICAgfTtcbiAgICBjb25zdCBvblVwID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gZG93bjtcbiAgICAgIGRvd24gPSBudWxsO1xuICAgICAgaWYgKCFzdGFydCkgcmV0dXJuO1xuICAgICAgY29uc3QgbW92ZWQgPSBNYXRoLmh5cG90KGUuY2xpZW50WCAtIHN0YXJ0LngsIGUuY2xpZW50WSAtIHN0YXJ0LnkpO1xuICAgICAgaWYgKG1vdmVkID4gTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuQ0xJQ0tfU0xPUF9QWCkgcmV0dXJuO1xuICAgICAgaWYgKERhdGUubm93KCkgLSBzdGFydC50ID4gTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuQ0xJQ0tfTUFYX01TKSByZXR1cm47XG4gICAgICAvLyBBIHJlZ2lvbiB0b29sIG93bnMgdGhlIHBvaW50ZXIgd2hpbGUgaXQgaXMgYWN0aXZlLCBhbmQgcGxhY2luZyBhIHBvbHlnb25cbiAgICAgIC8vIHZlcnRleCBpcyBhbHNvIGEgY2xpY2sgdGhhdCBkb2VzIG5vdCBtb3ZlLlxuICAgICAgaWYgKHRoaXMucmVnaW9uT3ZlcmxheT8udG9vbEFjdGl2ZSkgcmV0dXJuO1xuICAgICAgdGhpcy5zZWxlY3RDbGFzc0F0KGUuY2xpZW50WCwgZS5jbGllbnRZKTtcbiAgICB9O1xuXG4gICAgaG9zdC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIG9uTW92ZSk7XG4gICAgaG9zdC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVybGVhdmUnLCBvbkxlYXZlKTtcbiAgICBob3N0LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgb25Eb3duKTtcbiAgICBob3N0LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIG9uVXApO1xuICAgIHRoaXMuaG92ZXJPZmYucHVzaCgoKSA9PiBob3N0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgb25Nb3ZlKSk7XG4gICAgdGhpcy5ob3Zlck9mZi5wdXNoKCgpID0+IGhvc3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmxlYXZlJywgb25MZWF2ZSkpO1xuICAgIHRoaXMuaG92ZXJPZmYucHVzaCgoKSA9PiBob3N0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgb25Eb3duKSk7XG4gICAgdGhpcy5ob3Zlck9mZi5wdXNoKCgpID0+IGhvc3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgb25VcCkpO1xuXG4gICAgLy8gSW4gM0QgdGhlIGNhY2hlZCBwb3NpdGlvbnMgYXJlIHNjcmVlbiBwaXhlbHMsIHNvIGFuIG9yYml0IGludmFsaWRhdGVzIHRoZW0uXG4gICAgY29uc3QgY2FtZXJhID0gdGhpcy52aWV3ZXI/LmNhbWVyYTNkO1xuICAgIGlmIChjYW1lcmEgJiYgaXNTcGF0aWFsT21pY3MzZCh0aGlzLmN1cnJlbnRQbG90VHlwZSkpIHtcbiAgICAgIGNvbnN0IG9mZiA9IGNhbWVyYS5jaGFuZ2VkLmNvbm5lY3QoKCkgPT4ge1xuICAgICAgICB0aGlzLnNwYXRpYWxTY2VuZVJldisrO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmhvdmVyT2ZmLnB1c2gob2ZmKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVNwYXRpYWxIb3ZlcigpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IG9mZiBvZiB0aGlzLmhvdmVyT2ZmKSBvZmYoKTtcbiAgICB0aGlzLmhvdmVyT2ZmID0gW107XG4gICAgaWYgKHRoaXMuaG92ZXJGcmFtZSkgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5ob3ZlckZyYW1lKTtcbiAgICB0aGlzLmhvdmVyRnJhbWUgPSAwO1xuICAgIHRoaXMuaG92ZXJQb2ludGVyID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxUb29sdGlwPy5kaXNwb3NlKCk7XG4gICAgdGhpcy5zcGF0aWFsVG9vbHRpcCA9IG51bGw7XG4gICAgdGhpcy5ob3ZlclBvc2l0aW9ucyA9IG51bGw7XG4gICAgdGhpcy5ob3ZlclBvc2l0aW9uc1JldiA9IC0xO1xuICAgIHRoaXMuaG92ZXJJbmRleCA9IG51bGw7XG4gIH1cblxuICAvKiogSGl0LXRlc3QgdGhlIGxhc3QgcG9pbnRlciBwb3NpdGlvbiBhbmQgc2hvdyBvciBoaWRlIHRoZSB0b29sdGlwLiAqL1xuICBwcml2YXRlIHVwZGF0ZUhvdmVyKGhvc3Q6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGlwID0gdGhpcy5zcGF0aWFsVG9vbHRpcDtcbiAgICBjb25zdCBwb2ludGVyID0gdGhpcy5ob3ZlclBvaW50ZXI7XG4gICAgY29uc3QgZGF0YXNldCA9IHRoaXMuc3BhdGlhbExhdGVzdD8uWzBdO1xuICAgIGlmICghdGlwIHx8ICFwb2ludGVyIHx8ICFkYXRhc2V0KSByZXR1cm47XG5cbiAgICBjb25zdCBwb3NpdGlvbnMgPSB0aGlzLmhvdmVyUG9zaXRpb25zRm9yKGRhdGFzZXQub2JzZXJ2YXRpb25zKTtcbiAgICBpZiAoIXBvc2l0aW9ucykge1xuICAgICAgdGlwLmhpZGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaXMzZCA9IGlzU3BhdGlhbE9taWNzM2QodGhpcy5jdXJyZW50UGxvdFR5cGUpO1xuICAgIC8vIDNEIGNvbXBhcmVzIHNjcmVlbiBwaXhlbHMgZGlyZWN0bHk7IDJEIGhvbGRzIHdvcmxkIHBvc2l0aW9ucywgc28gdGhlIHJhZGl1c1xuICAgIC8vIGlzIGNvbnZlcnRlZCBvbmNlIGluc3RlYWQgb2YgcHJvamVjdGluZyB0aGUgd2hvbGUgY2xvdWQuXG4gICAgY29uc3Qgem9vbSA9IGlzM2QgPyAxIDogKHRoaXMudmlld2VyPy5jYW1lcmEuem9vbSA/PyAxKTtcbiAgICBjb25zdCByYWRpdXMgPSBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5IT1ZFUl9SQURJVVNfUFggLyAoem9vbSA+IDAgPyB6b29tIDogMSk7XG4gICAgbGV0IHggPSBwb2ludGVyLng7XG4gICAgbGV0IHkgPSBwb2ludGVyLnk7XG4gICAgaWYgKCFpczNkKSB7XG4gICAgICBjb25zdCB3b3JsZCA9IHRoaXMudmlld2VyPy5jYW52YXNUb1dvcmxkKHBvaW50ZXIuY2xpZW50WCwgcG9pbnRlci5jbGllbnRZKTtcbiAgICAgIGlmICghd29ybGQpIHtcbiAgICAgICAgdGlwLmhpZGUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgW3gsIHldID0gd29ybGQ7XG4gICAgfVxuXG4gICAgY29uc3QgaGl0ID0gdGhpcy5waWNrT2JzZXJ2YXRpb24ocG9zaXRpb25zLCB4LCB5LCByYWRpdXMsIGlzM2QpO1xuICAgIGNvbnN0IGxpbmVzID0gaG92ZXJUZXh0KHRoaXMuaG92ZXJTb3VyY2UsIGhpdCk7XG4gICAgaWYgKCFsaW5lcykge1xuICAgICAgdGlwLmhpZGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVjdCA9IGhvc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdGlwLnNob3cobGluZXMsIHBvaW50ZXIuY2xpZW50WCAtIHJlY3QubGVmdCwgcG9pbnRlci5jbGllbnRZIC0gcmVjdC50b3ApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdCB0aGUgY2xhc3Mgb2YgdGhlIG1hcmtlciBhdCBhIGNsaWVudCBwb3NpdGlvbiDigJQgdGhlIGNhbnZhcyBlcXVpdmFsZW50IG9mXG4gICAqIGNsaWNraW5nIHRoYXQgY2xhc3MgaW4gdGhlIHBhbmVsJ3MgbGVnZW5kLCBhbmQgdGhlIHNhbWUgc2VsZWN0aW9uIG9iamVjdCwgc29cbiAgICogdGhlIHR3byBjb250cm9scyBjYW5ub3QgcHJvZHVjZSBkaWZmZXJlbnQgcmVzdWx0cy5cbiAgICpcbiAgICogQ2xpY2tpbmcgYSBjbGFzcyB0aGF0IGlzIGFscmVhZHkgdGhlIHdob2xlIHNlbGVjdGlvbiBDTEVBUlMgaXQsIHdoaWNoIGlzIHdoYXRcbiAgICogdGhlIGxlZ2VuZCBkb2VzLiBDb21wYXJlZCBhZ2FpbnN0IHRoZSBzZWxlY3Rpb24gaXRzZWxmIHJhdGhlciB0aGFuIGFnYWluc3QgYVxuICAgKiByZW1lbWJlcmVkIGNsaWNrLCBzbyBzZWxlY3RpbmcgZnJvbSB0aGUgbGVnZW5kIGFuZCB0aGVuIGNsaWNraW5nIHRoZSBzYW1lXG4gICAqIGNsYXNzIG9uIHRoZSBjYW52YXMgc3RpbGwgdG9nZ2xlcy5cbiAgICovXG4gIHByaXZhdGUgc2VsZWN0Q2xhc3NBdChjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuaG92ZXJTb3VyY2U7XG4gICAgY29uc3Qgc3RvcmUgPSB0aGlzLnNlbGVjdGlvblN0b3JlO1xuICAgIGNvbnN0IGRhdGFzZXQgPSB0aGlzLnNwYXRpYWxMYXRlc3Q/LlswXTtcbiAgICAvLyBPbmx5IGEgY2F0ZWdvcmljYWwgc291cmNlIGhhcyBjbGFzc2VzIHRvIHNlbGVjdC4gQSBnZW5lIGlzIGNvbnRpbnVvdXM6XG4gICAgLy8gdGhlcmUgaXMgbm8gc2V0IG9mIGNlbGxzIHRoYXQgXCJpc1wiIGEgdmFsdWUuXG4gICAgaWYgKCFzdG9yZSB8fCAhZGF0YXNldCB8fCBzb3VyY2U/LmtpbmQgIT09ICdjYXRlZ29yaWNhbCcpIHJldHVybjtcblxuICAgIGNvbnN0IHBvc2l0aW9ucyA9IHRoaXMuaG92ZXJQb3NpdGlvbnNGb3IoZGF0YXNldC5vYnNlcnZhdGlvbnMpO1xuICAgIGlmICghcG9zaXRpb25zKSByZXR1cm47XG4gICAgY29uc3QgY2FudmFzID0gdGhpcy5jYW52YXM7XG4gICAgaWYgKCFjYW52YXMpIHJldHVybjtcbiAgICBjb25zdCByZWN0ID0gY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGlzM2QgPSBpc1NwYXRpYWxPbWljczNkKHRoaXMuY3VycmVudFBsb3RUeXBlKTtcbiAgICBjb25zdCB6b29tID0gaXMzZCA/IDEgOiAodGhpcy52aWV3ZXI/LmNhbWVyYS56b29tID8/IDEpO1xuICAgIGNvbnN0IHJhZGl1cyA9IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLkhPVkVSX1JBRElVU19QWCAvICh6b29tID4gMCA/IHpvb20gOiAxKTtcbiAgICBsZXQgeCA9IGNsaWVudFggLSByZWN0LmxlZnQ7XG4gICAgbGV0IHkgPSBjbGllbnRZIC0gcmVjdC50b3A7XG4gICAgaWYgKCFpczNkKSB7XG4gICAgICBjb25zdCB3b3JsZCA9IHRoaXMudmlld2VyPy5jYW52YXNUb1dvcmxkKGNsaWVudFgsIGNsaWVudFkpO1xuICAgICAgaWYgKCF3b3JsZCkgcmV0dXJuO1xuICAgICAgW3gsIHldID0gd29ybGQ7XG4gICAgfVxuXG4gICAgY29uc3QgaGl0ID0gbmVhcmVzdE9ic2VydmF0aW9uKHBvc2l0aW9ucywgeCwgeSwgcmFkaXVzKTtcbiAgICBpZiAoaGl0IDwgMCkgcmV0dXJuO1xuICAgIGNvbnN0IGNvZGUgPSBzb3VyY2UuY29kZXNbaGl0XTtcbiAgICAvLyBBIGNlbGwgdGhlIGFubm90YXRpb24gZG9lcyBub3QgY292ZXIgaGFzIG5vIGNsYXNzIHRvIHNlbGVjdC5cbiAgICBpZiAoY29kZSA9PT0gdW5kZWZpbmVkIHx8IGNvZGUgPT09IE5PX0NBVEVHT1JZKSByZXR1cm47XG5cbiAgICBjb25zdCBuZXh0ID0gc2VsZWN0QnlDYXRlZ29yeShzb3VyY2UuY29kZXMsIGNvZGUpO1xuICAgIGNvbnN0IGN1cnJlbnQgPSBzdG9yZS5jdXJyZW50KCk7XG4gICAgaWYgKHNhbWVTZWxlY3Rpb24oY3VycmVudCwgbmV4dCkpIHtcbiAgICAgIHN0b3JlLmNsZWFyKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN0b3JlLnNldChuZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGljaCBvYnNlcnZhdGlvbiBpcyB1bmRlciB0aGUgY3Vyc29yLlxuICAgKlxuICAgKiBJbiAzRCB0aGlzIGRlZmVycyB0byBuYXBhcmktanMncyB7QGxpbmsgbmVhcmVzdFByb2plY3RlZEluZGV4fSBXSVRIIHRoZSBkZXB0aHMgdGhlXG4gICAqIHByb2plY3Rpb24gcHJvZHVjZWQsIHNvIHRoZSBmcm9udC1tb3N0IGNhbmRpZGF0ZSB3aW5zLiBUaGF0IG1hdHRlcnMgbW9yZSB0aGFuIGl0XG4gICAqIHNvdW5kczogdGhlIHJlbmRlcmVyIGRlcHRoLXRlc3RzIHRoZSBiaWxsYm9hcmRzLCBhbmQgaW4gYSAzLjdNLXBvaW50IGNsb3VkIHRoZSBjdXJzb3JcbiAgICogY292ZXJzIG1hbnkgb2YgdGhlbSDigJQgcGlja2luZyB0aGUgb25lIG5lYXJlc3QgdGhlIGN1cnNvcidzIGNlbnRyZSByZWd1bGFybHkgbmFtZXMgYVxuICAgKiBjZWxsIHRoYXQgc29tZXRoaW5nIGVsc2UgaXMgZHJhd24gb3Zlciwgd2hpY2ggcmVhZHMgYXMgYSB3cm9uZyB0b29sdGlwIHJhdGhlciB0aGFuIGFzXG4gICAqIGEgc3VidGxldHkgb2YgcGlja2luZy5cbiAgICpcbiAgICogSW4gMkQgdGhlIHBvc2l0aW9ucyBhcmUgV09STEQgY29vcmRpbmF0ZXMgb24gb25lIHBsYW5lLCBzbyB0aGVyZSBpcyBubyBkZXB0aCB0byBicmVha1xuICAgKiB0aWVzIHdpdGggYW5kIHRoZSBleGlzdGluZyBuZWFyZXN0LW1hcmtlciBydWxlIGlzIHRoZSByaWdodCBvbmUuXG4gICAqL1xuICBwcml2YXRlIHBpY2tPYnNlcnZhdGlvbihcbiAgICBwb3NpdGlvbnM6IEZsb2F0MzJBcnJheSxcbiAgICB4OiBudW1iZXIsXG4gICAgeTogbnVtYmVyLFxuICAgIHJhZGl1czogbnVtYmVyLFxuICAgIGlzM2Q6IGJvb2xlYW4sXG4gICk6IG51bWJlciB7XG4gICAgaWYgKCFpczNkKSByZXR1cm4gbmVhcmVzdE9ic2VydmF0aW9uKHBvc2l0aW9ucywgeCwgeSwgcmFkaXVzKTtcbiAgICAvLyBUaGUgY2xvdWQgZHJhd3MgYSBzZWxlY3RlZCBtYXJrZXIgTEFSR0VSLCBzbyB0aGUgcGljayBoYXMgdG8gdXNlIHRoZSBzYW1lIHJhZGl1cyB0aGVcbiAgICAvLyByZW5kZXJlciB1c2VkIOKAlCBvdGhlcndpc2UgdGhlIGhpZ2hsaWdodGVkIGNlbGxzLCB0aGUgb25lcyBhIHJlYWRlciBpcyBtb3N0IGxpa2VseSB0b1xuICAgIC8vIGJlIHBvaW50aW5nIGF0LCBhcmUgdGhlIGhhcmRlc3QgdG8gaG92ZXIuXG4gICAgY29uc3Qgc2NhbGUgPSBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5TUEFUSUFMX1NFTEVDVEVEX1NJWkVfU0NBTEU7XG4gICAgY29uc3QgbWFzayA9IHRoaXMuc2VsZWN0aW9uU3RvcmU/LmN1cnJlbnQoKT8ubWFzaztcbiAgICBjb25zdCBvcHRzID0gbWFzaz8ubGVuZ3RoXG4gICAgICA/IHsgcmFkaXVzQXQ6IChpOiBudW1iZXIpID0+IChtYXNrW2ldID8gcmFkaXVzICogc2NhbGUgOiByYWRpdXMpIH1cbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIC8vIGByYWRpdXNgIHN0aWxsIGJvdW5kcyB3aGljaCBidWNrZXRzIGFyZSB2aXNpdGVkLCBzbyBpdCBoYXMgdG8gYmUgdGhlIExBUkdFU1QgYW55XG4gICAgLy8gcG9pbnQgY2FuIGNsYWltLCBub3QgdGhlIGJhc2Ugb25lLlxuICAgIGNvbnN0IHJlYWNoID0gbWFzaz8ubGVuZ3RoID8gcmFkaXVzICogc2NhbGUgOiByYWRpdXM7XG4gICAgaWYgKHRoaXMuaG92ZXJJbmRleCkgcmV0dXJuIHRoaXMuaG92ZXJJbmRleC5waWNrKHgsIHksIHJlYWNoLCBvcHRzKTtcbiAgICByZXR1cm4gbmVhcmVzdFByb2plY3RlZEluZGV4KHBvc2l0aW9ucywgeCwgeSwgcmVhY2gsIHRoaXMuc3BhdGlhbERlcHRoczNkLCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb3NpdGlvbnMgdG8gaGl0LXRlc3QgYWdhaW5zdCwgcmVidWlsdCBvbmx5IHdoZW4gdGhlIHNjZW5lIG9yIGNhbWVyYSBtb3ZlZC5cbiAgICpcbiAgICogQSBwYXNzIG92ZXIgMy43TSBvYnNlcnZhdGlvbnMgaXMgbm90IHNvbWV0aGluZyB0byBkbyBwZXIgcG9pbnRlcm1vdmUsIGFuZCB0aGVcbiAgICogY2xvdWQgZG9lcyBub3QgbW92ZSBiZXR3ZWVuIGZyYW1lcyB1bmxlc3Mgc29tZXRoaW5nIHNheXMgaXQgZGlkLlxuICAgKi9cbiAgcHJpdmF0ZSBob3ZlclBvc2l0aW9uc0ZvcihvYnM6IFNwYXRpYWxPYnNlcnZhdGlvbnMpOiBGbG9hdDMyQXJyYXkgfCBudWxsIHtcbiAgICBpZiAodGhpcy5ob3ZlclBvc2l0aW9ucyAmJiB0aGlzLmhvdmVyUG9zaXRpb25zUmV2ID09PSB0aGlzLnNwYXRpYWxTY2VuZVJldikge1xuICAgICAgcmV0dXJuIHRoaXMuaG92ZXJQb3NpdGlvbnM7XG4gICAgfVxuICAgIGNvbnN0IGlzM2QgPSBpc1NwYXRpYWxPbWljczNkKHRoaXMuY3VycmVudFBsb3RUeXBlKTtcbiAgICBjb25zdCBidWlsdCA9IGlzM2RcbiAgICAgID8gdGhpcy5nZXRTcGF0aWFsU2NyZWVuUHJvamVjdGlvbihvYnMpXG4gICAgICA6IHRoaXMuaG92ZXJXb3JsZFBvc2l0aW9ucyhvYnMpO1xuICAgIHRoaXMuaG92ZXJQb3NpdGlvbnMgPSBidWlsdDtcbiAgICB0aGlzLmhvdmVyUG9zaXRpb25zUmV2ID0gdGhpcy5zcGF0aWFsU2NlbmVSZXY7XG4gICAgLy8gQnVpbHQgaGVyZSwgaW4gdGhlIHNhbWUgbGF6eSBzbG90LCBzbyBpdCBpcyBwYWlkIGZvciBvbiB0aGUgZmlyc3QgaG92ZXIgYWZ0ZXIgdGhlXG4gICAgLy8gc2NlbmUgbW92ZWQgYW5kIG5vdCBvbiBldmVyeSBmcmFtZSBvZiBhbiBvcmJpdC4gT25seSB3b3J0aCBpdCBwYXN0IHRoZSBwb2ludCB3aGVyZVxuICAgIC8vIHRoZSBsaW5lYXIgc2NhbiBzdG9wcyBiZWluZyBmcmVlOyBiZWxvdyB0aGF0IHRoZSBidWlsZCBjb3N0cyBtb3JlIHRoYW4gaXQgc2F2ZXMuXG4gICAgdGhpcy5ob3ZlckluZGV4ID0gbnVsbDtcbiAgICBpZiAoaXMzZCAmJiBidWlsdCAmJiB0aGlzLmNhbnZhcyAmJiBidWlsdC5sZW5ndGggLyAyID49IFNDUkVFTl9JTkRFWF9NSU5fUE9JTlRTKSB7XG4gICAgICBjb25zdCB3ID0gdGhpcy5jYW52YXMuY2xpZW50V2lkdGggfHwgdGhpcy5jYW52YXMud2lkdGg7XG4gICAgICBjb25zdCBoID0gdGhpcy5jYW52YXMuY2xpZW50SGVpZ2h0IHx8IHRoaXMuY2FudmFzLmhlaWdodDtcbiAgICAgIGlmICh3ICYmIGgpIHtcbiAgICAgICAgdGhpcy5ob3ZlckluZGV4ID0gbmV3IFNjcmVlbkluZGV4KFxuICAgICAgICAgIHsgc2NyZWVuOiBidWlsdCwgZGVwdGg6IHRoaXMuc3BhdGlhbERlcHRoczNkID8/IG5ldyBGbG9hdDMyQXJyYXkoYnVpbHQubGVuZ3RoIC8gMikgfSxcbiAgICAgICAgICB3LFxuICAgICAgICAgIGgsXG4gICAgICAgICAgLy8gVGhlIGxhcmdlc3QgcmFkaXVzIGFueSBwaWNrIGhlcmUgY2FuIGNsYWltOiB0aGUgYmFzZSBob3ZlciByYWRpdXMsIHRpbWVzIHRoZVxuICAgICAgICAgIC8vIHNjYWxlIGEgU0VMRUNURUQgbWFya2VyIGlzIGRyYXduIGF0LiBTdGF0ZWQgcmF0aGVyIHRoYW4gbGVmdCB0byB0aGUgZGVmYXVsdCxcbiAgICAgICAgICAvLyBiZWNhdXNlIGl0IGlzIHdoYXQgZGVjaWRlcyB3aGV0aGVyIGEgbWFya2VyIHN0cmFkZGxpbmcgdGhlIGNhbnZhcyBlZGdlIGlzXG4gICAgICAgICAgLy8gZm91bmQg4oCUIGl0cyBjZW50cmUgaXMgb2ZmIHNjcmVlbiB3aGlsZSBwYXJ0IG9mIGl0IGlzIG5vdC5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBtYXhSZWFjaDogTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuSE9WRVJfUkFESVVTX1BYXG4gICAgICAgICAgICAgICogTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuU1BBVElBTF9TRUxFQ1RFRF9TSVpFX1NDQUxFLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBidWlsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgMkQgbWFya2VycycgV09STEQgcG9zaXRpb25zLCBpbmRleGVkIGJ5IG9ic2VydmF0aW9uLCBOYU4gZm9yIGFueSBub3Qgb25cbiAgICogdGhlIGRpc3BsYXllZCBwbGFuZSDigJQgdGhlIHNhbWUgYWZmaW5lIGFuZCB0aGUgc2FtZSBzdWJzZXQgdGhlIG1hcmtlciBsYXllciB3YXNcbiAgICogYnVpbHQgZnJvbSwgc28gdGhlIHRvb2x0aXAgY2Fubm90IHBvaW50IGF0IGEgY2VsbCB0aGF0IGlzIG5vdCBkcmF3bi5cbiAgICovXG4gIHByaXZhdGUgaG92ZXJXb3JsZFBvc2l0aW9ucyhvYnM6IFNwYXRpYWxPYnNlcnZhdGlvbnMpOiBGbG9hdDMyQXJyYXkgfCBudWxsIHtcbiAgICBjb25zdCBkYXRhc2V0ID0gdGhpcy5zcGF0aWFsTGF0ZXN0Py5bMF07XG4gICAgaWYgKCFkYXRhc2V0IHx8IG9icy5jb3VudCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgc2xhYiA9IHRoaXMuc3BhdGlhbFNsYWIoZGF0YXNldCk7XG4gICAgY29uc3QgcmVmID0gc2xhYj8ucmVmID8/IGRhdGFzZXQuaW1hZ2VSZWY7XG4gICAgY29uc3QgW3N4LCBzeV0gPSByZWY/LnNjYWxlID8/IFsxLCAxXTtcbiAgICBjb25zdCBbdHgsIHR5XSA9IHJlZj8udHJhbnNsYXRlID8/IFswLCAwXTtcbiAgICBjb25zdCBkcmF3biA9IHNsYWI/LmluZGljZXMgPz8gbnVsbDtcbiAgICBjb25zdCBvdXQgPSBuZXcgRmxvYXQzMkFycmF5KG9icy5jb3VudCAqIDIpLmZpbGwoTmFOKTtcbiAgICBjb25zdCBuID0gZHJhd24gPyBkcmF3bi5sZW5ndGggOiBvYnMuY291bnQ7XG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBuOyBrKyspIHtcbiAgICAgIGNvbnN0IGkgPSBkcmF3biA/IGRyYXduW2tdIDogaztcbiAgICAgIG91dFtpICogMl0gPSBvYnMueFtpXSAqIHN4ICsgdHg7XG4gICAgICBvdXRbaSAqIDIgKyAxXSA9IG9icy55W2ldICogc3kgKyB0eTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGF0IHRoZSB0b29sdGlwIHNheXMsIHJlc29sdmVkIG9uY2UgcGVyIGNvbG91ciBzb3VyY2UgcmF0aGVyIHRoYW4gcGVyIGhvdmVyLlxuICAgKlxuICAgKiBGZXRjaGVkIHNlcGFyYXRlbHkgZnJvbSB0aGUgY29sb3VyaW5nIG9uIHB1cnBvc2U6IHRoZSByZWZlcmVuY2UgcG9ydCBjYWNoZXNcbiAgICogY29sdW1ucywgYnV0IGEgaG9zdCdzIG5lZWQgbm90LCBhbmQgcmUtZmV0Y2hpbmcgYSAzLjdNLWVsZW1lbnQgdmVjdG9yIGJlY2F1c2VcbiAgICogdGhlIHBvaW50ZXIgbW92ZWQgd291bGQgYmUgaW5kZWZlbnNpYmxlIGVpdGhlciB3YXkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlc29sdmVIb3ZlclNvdXJjZShcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCB8IG51bGwsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnNwYXRpYWxEYXRhO1xuICAgIGNvbnN0IGNvbG9yQnkgPSB2aWV3LmNvbG9yQnk7XG4gICAgY29uc3Qga2V5ID0gZGF0YXNldCAmJiBjb2xvckJ5XG4gICAgICA/IGAke2RhdGFzZXQuaWR9fCR7Y29sb3JCeS5raW5kfToke2NvbG9yQnkubmFtZX1gXG4gICAgICA6IG51bGw7XG4gICAgaWYgKGtleSA9PT0gdGhpcy5ob3ZlclNvdXJjZUtleSkgcmV0dXJuO1xuICAgIC8vIFRoZSBrZXkgaXMgY29tbWl0dGVkIG9ubHkgd2hlcmUgYSB2YWx1ZSBpcyBhY3R1YWxseSBzdG9yZWQuIFNldHRpbmcgaXQgdXBcbiAgICAvLyBmcm9udCB3b3VsZCBtZWFuIGEgcmVzb2x1dGlvbiB0aGF0IGxvc2VzIHRoZSByYWNlIGxlYXZlcyB0aGUga2V5IGNsYWltaW5nIGFcbiAgICAvLyBzb3VyY2UgdGhhdCB3YXMgbmV2ZXIgc3RvcmVkIOKAlCBhbmQgc2luY2UgZXZlcnkgbGF0ZXIgZW1pc3Npb24gY2FycmllcyB0aGVcbiAgICAvLyBzYW1lIGtleSwgaXQgd291bGQgc2hvcnQtY2lyY3VpdCBoZXJlIGZvcmV2ZXIgYW5kIHRoZSB0b29sdGlwIHdvdWxkIHN0YXlcbiAgICAvLyBzaWxlbnQgZm9yIHRoZSByZXN0IG9mIHRoZSBzZXNzaW9uLlxuICAgIGNvbnN0IHRva2VuID0gKyt0aGlzLmhvdmVyU291cmNlVG9rZW47XG4gICAgLy8gTm8gY29sb3VyIHNvdXJjZSBtZWFucyBub3RoaW5nIGlzIGJlaW5nIHNhaWQgYWJvdXQgdGhlIGNlbGxzLCBzbyB0aGVyZSBpcyBub1xuICAgIC8vIGNsdXN0ZXIgdG8gbmFtZSBhbmQgdGhlIHRvb2x0aXAgc3RheXMgc2lsZW50LlxuICAgIGlmICgha2V5IHx8ICFkYXRhc2V0IHx8ICFjb2xvckJ5IHx8ICFwb3J0KSB7XG4gICAgICB0aGlzLmhvdmVyU291cmNlID0gbnVsbDtcbiAgICAgIHRoaXMuaG92ZXJTb3VyY2VLZXkgPSBrZXk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBpZiAoY29sb3JCeS5raW5kID09PSAnY29sdW1uJykge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSBhd2FpdCBwb3J0LmdldENvbHVtbihjb2xvckJ5Lm5hbWUpO1xuICAgICAgICBpZiAodG9rZW4gIT09IHRoaXMuaG92ZXJTb3VyY2VUb2tlbikgcmV0dXJuO1xuICAgICAgICB0aGlzLmhvdmVyU291cmNlID0gaXNDYXRlZ29yaWNhbENvbHVtbihjb2x1bW4pXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICBraW5kOiAnY2F0ZWdvcmljYWwnLFxuICAgICAgICAgICAgbmFtZTogY29sb3JCeS5uYW1lLFxuICAgICAgICAgICAgY2F0ZWdvcmllczogY29sdW1uLm1ldGEuY2F0ZWdvcmllcyxcbiAgICAgICAgICAgIGNvZGVzOiBjb2x1bW4uY29kZXMsXG4gICAgICAgICAgfVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAga2luZDogJ2NvbnRpbnVvdXMnLFxuICAgICAgICAgICAgbmFtZTogY29sb3JCeS5uYW1lLFxuICAgICAgICAgICAgdmFsdWVzOiBjb2x1bW4udmFsdWVzLFxuICAgICAgICAgICAgLi4uKGNvbHVtbi5tZXRhLnVuaXQgPyB7IHVuaXQ6IGNvbHVtbi5tZXRhLnVuaXQgfSA6IHt9KSxcbiAgICAgICAgICB9O1xuICAgICAgICB0aGlzLmhvdmVyU291cmNlS2V5ID0ga2V5O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB2YWx1ZXMgPSBhd2FpdCBwb3J0LmdldEZlYXR1cmVWZWN0b3IoY29sb3JCeS5uYW1lKTtcbiAgICAgIGlmICh0b2tlbiAhPT0gdGhpcy5ob3ZlclNvdXJjZVRva2VuKSByZXR1cm47XG4gICAgICB0aGlzLmhvdmVyU291cmNlID0ge1xuICAgICAgICBraW5kOiAnY29udGludW91cycsXG4gICAgICAgIG5hbWU6IGNvbG9yQnkubmFtZSxcbiAgICAgICAgdmFsdWVzLFxuICAgICAgICAuLi4oZGF0YXNldC5mZWF0dXJlcz8udW5pdCA/IHsgdW5pdDogZGF0YXNldC5mZWF0dXJlcy51bml0IH0gOiB7fSksXG4gICAgICB9O1xuICAgICAgdGhpcy5ob3ZlclNvdXJjZUtleSA9IGtleTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGlmICh0b2tlbiAhPT0gdGhpcy5ob3ZlclNvdXJjZVRva2VuKSByZXR1cm47XG4gICAgICAvLyBUaGUgdG9vbHRpcCBpcyBhbiBleHRyYTsgYSBmYWlsZWQgZmV0Y2ggbXVzdCBub3QgZGlzdHVyYiB0aGUgcmVuZGVyLiBUaGVcbiAgICAgIC8vIGtleSBpcyBsZWZ0IHVuc2V0IHNvIGEgbGF0ZXIgZW1pc3Npb24gcmV0cmllcyByYXRoZXIgdGhhbiBpbmhlcml0aW5nIGFcbiAgICAgIC8vIHBlcm1hbmVudCBzaWxlbmNlLlxuICAgICAgdGhpcy5ob3ZlclNvdXJjZSA9IG51bGw7XG4gICAgICB0aGlzLmhvdmVyU291cmNlS2V5ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvamVjdCBldmVyeSBvYnNlcnZhdGlvbiB0byBjYW52YXMgcGl4ZWxzIHVuZGVyIHRoZSBjdXJyZW50IDNEIGNhbWVyYS5cbiAgICpcbiAgICogVGhlIHByb2plY3Rpb24gaXRzZWxmIGlzIHRoZSByZW5kZXJlcidzOiBgdmlld2VyLnByb2plY3RQb2ludHNgIG93bnMgdGhlIGNhbWVyYSwgdGhlXG4gICAqIHZpZXdwb3J0IGluIENTUyBwaXhlbHMsIHRoZSBwZXJzcGVjdGl2ZSBkaXZpZGUgYW5kIHRoZSB5LWZsaXAuIFRoaXMgdXNlZCB0byBiZSBmaWZ0ZWVuXG4gICAqIGxpbmVzIG9mIGNvbHVtbi1tYWpvciBtYXRyaXggYXJpdGhtZXRpYyBoZXJlLCBkdXBsaWNhdGluZyBhIHNlY29uZCBjb3B5IGluXG4gICAqIGBuYXBhcmktYXhlcy1sYWJlbHNgIOKAlCBhbmQgdGhlIHR3byBoYWQgZHJpZnRlZCBvbiB3aGF0IHRvIGRvIHdpdGggYSBOYU4gdy5cbiAgICpcbiAgICogV2hhdCBpcyBsZWZ0IGlzIHRoZSBwYXJ0IHRoYXQgaXMgZ2VudWluZWx5IHRoaXMgYWRhcHRlcidzOiBTQ0FUVEVSSU5HIHRoZSBkcmF3biBzdWJzZXRcbiAgICogYmFjayBpbnRvIG9ic2VydmF0aW9uIG9yZGVyLiBUaGUgY2xvdWQgaG9sZHMgb25seSB0aGUgcG9pbnRzIG9mIHRoZSBkaXNwbGF5ZWQgc2VjdGlvbixcbiAgICogaW4gaXRzIG93biBwYWNraW5nOyBldmVyeSBjb25zdW1lciBpbmRleGVzIGJ5IG9ic2VydmF0aW9uLiBOYU4gc3RhbmRzIGZvciBcIm5vdCBvblxuICAgKiBzY3JlZW5cIiwgd2hpY2ggaXMgYWxzbyB0aGUgcmlnaHQgYW5zd2VyIGZvciBhbiBvYnNlcnZhdGlvbiB3aG9zZSBzZWN0aW9uIGlzIGhpZGRlbi5cbiAgICpcbiAgICogTnVsbCB3aGVuIHRoZSAzRCBjbG91ZCBpcyBub3QgbW91bnRlZCwgc28gdGhlIGNhbGxlciBmYWxscyBiYWNrIHRvIHRoZSAyRCBhZmZpbmUgcGF0aC5cbiAgICovXG4gIGdldFNwYXRpYWxTY3JlZW5Qcm9qZWN0aW9uKG9iczogU3BhdGlhbE9ic2VydmF0aW9ucyk6IEZsb2F0MzJBcnJheSB8IG51bGwge1xuICAgIGNvbnN0IHZpZXdlciA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdmlld2VyIHx8ICF0aGlzLnNwYXRpYWxQb3NpdGlvbnMzZCkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBwcm9qZWN0ZWQgPSB2aWV3ZXIucHJvamVjdFBvaW50cyh0aGlzLnNwYXRpYWxQb3NpdGlvbnMzZCwgdGhpcy5zcGF0aWFsUHJvamVjdGlvbjNkKTtcbiAgICBpZiAoIXByb2plY3RlZCkgcmV0dXJuIG51bGw7XG4gICAgLy8gUmV1c2VkIGFjcm9zcyBjYW1lcmEgY2hhbmdlczogYXQgMy43TSBvYnNlcnZhdGlvbnMgdGhpcyBpcyBhIDMwIE1CIGFsbG9jYXRpb24gdGhhdFxuICAgIC8vIHdvdWxkIG90aGVyd2lzZSBoYXBwZW4gb24gZXZlcnkgb3JiaXQuXG4gICAgdGhpcy5zcGF0aWFsUHJvamVjdGlvbjNkID0gcHJvamVjdGVkO1xuXG4gICAgY29uc3QgZHJhd24gPSB0aGlzLnNwYXRpYWxEcmF3bjNkO1xuICAgIGNvbnN0IHsgc2NyZWVuLCBkZXB0aCB9ID0gcHJvamVjdGVkO1xuICAgIGNvbnN0IGNvdW50ID0gc2NyZWVuLmxlbmd0aCA+PiAxO1xuICAgIGNvbnN0IG91dCA9IG5ldyBGbG9hdDMyQXJyYXkob2JzLmNvdW50ICogMikuZmlsbChOYU4pO1xuICAgIGNvbnN0IGRlcHRocyA9IG5ldyBGbG9hdDMyQXJyYXkob2JzLmNvdW50KS5maWxsKE5hTik7XG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBjb3VudDsgaysrKSB7XG4gICAgICBjb25zdCBpID0gZHJhd24gPyBkcmF3bltrXSA6IGs7XG4gICAgICBpZiAoaSA+PSBvYnMuY291bnQpIGNvbnRpbnVlO1xuICAgICAgb3V0W2kgKiAyXSA9IHNjcmVlbltrICogMl07XG4gICAgICBvdXRbaSAqIDIgKyAxXSA9IHNjcmVlbltrICogMiArIDFdO1xuICAgICAgZGVwdGhzW2ldID0gZGVwdGhba107XG4gICAgfVxuICAgIC8vIEtlcHQgYmVzaWRlIHRoZSBzY3JlZW4gcG9zaXRpb25zIHNvIHRoZSBob3ZlciBwaWNrIGNhbiBwcmVmZXIgdGhlIEZST05ULW1vc3QgcG9pbnRcbiAgICAvLyB1bmRlciB0aGUgY3Vyc29yIHJhdGhlciB0aGFuIHRoZSBvbmUgbmVhcmVzdCBpdHMgY2VudHJlIOKAlCB3aGljaCBpbiBhIGRlbnNlIGNsb3VkIGlzXG4gICAgLy8gcmVndWxhcmx5IHNvbWV0aGluZyB0aGUgcmVuZGVyZXIgZHJldyBhbm90aGVyIHBvaW50IG92ZXIuXG4gICAgdGhpcy5zcGF0aWFsRGVwdGhzM2QgPSBkZXB0aHM7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKiBSZWJ1aWxkIHRoZSBtYXJrZXJzIG9uIGFueSBkYXRhc2V0IG9yIHZpZXctc3RhdGUgY2hhbmdlLiAqL1xuICBwcml2YXRlIHN1YnNjcmliZVNwYXRpYWwoKTogdm9pZCB7XG4gICAgdGhpcy5zcGF0aWFsU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnNwYXRpYWxEYXRhO1xuICAgIGlmICghcG9ydCkgcmV0dXJuO1xuICAgIGNvbnN0IHNlbGVjdGlvbiQgPSB0aGlzLnNlbGVjdGlvblN0b3JlPy5nZXRTZWxlY3Rpb24kKCkgPz8gb2YoZW1wdHlTZWxlY3Rpb24oKSk7XG4gICAgLy8gVGhlIGRpc3BsYXkgY29sb3JtYXAgaXMgYW4gaW5wdXQgaGVyZSwgbm90IGp1c3Qgc29tZXRoaW5nIHJlYWQgYXQgYnVpbGRcbiAgICAvLyB0aW1lOiBgY29udGludW91c0NvbG9ybWFwOiBudWxsYCBtZWFucyBcImZvbGxvdyB0aGUgaW1hZ2UncyBjb2xvcm1hcFwiLCBhbmQgYVxuICAgIC8vIHNldHRpbmcgdGhhdCBvbmx5IHRha2VzIGVmZmVjdCBhdCB0aGUgbmV4dCB1bnJlbGF0ZWQgcmVidWlsZCBpcyBub3Qgb25lLlxuICAgIHRoaXMuc3BhdGlhbFN1YiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgcG9ydC5nZXREYXRhc2V0JCgpLCB0aGlzLnN0b3JlLmdldFNwYXRpYWxWaWV3JCgpLCBzZWxlY3Rpb24kLFxuICAgICAgdGhpcy5zdG9yZS5nZXRDb2xvcm1hcCgpLCB0aGlzLnN0b3JlLmdldFJldmVyc2VTY2FsZSgpLFxuICAgIF0pLnN1YnNjcmliZSgoW2RhdGFzZXQsIHZpZXcsIHNlbGVjdGlvbiwgY29sb3JtYXAsIHJldmVyc2VdKSA9PiB7XG4gICAgICB0aGlzLmN1cnJlbnRDb2xvcm1hcCA9IChjb2xvcm1hcCBhcyBDb2xvcm1hcE5vZGUpID8/IG51bGw7XG4gICAgICB0aGlzLmN1cnJlbnRSZXZlcnNlID0gISFyZXZlcnNlO1xuICAgICAgLy8gS2VwdCBzbyBhIHNsaWNlIGNoYW5nZSBjYW4gcmVkcmF3IHRoZSBtYXJrZXJzIGZvciB0aGUgbmV3IHBsYW5lLCB3aGljaFxuICAgICAgLy8gYXJyaXZlcyB0aHJvdWdoIHNldFpJbmRleCByYXRoZXIgdGhhbiB0aHJvdWdoIGFueSBvZiB0aGVzZSBzdHJlYW1zLlxuICAgICAgdGhpcy5zcGF0aWFsTGF0ZXN0ID0gW2RhdGFzZXQsIHZpZXcsIHNlbGVjdGlvbl07XG4gICAgICAvLyBUaGUgbWFya2VycyBhcmUgYWJvdXQgdG8gbW92ZSBvciBjaGFuZ2UgbWVhbmluZywgc28gYm90aCBoYWx2ZXMgb2YgdGhlXG4gICAgICAvLyB0b29sdGlwIOKAlCB3aGVyZSB0aGUgcG9pbnRzIGFyZSwgYW5kIHdoYXQgdGhleSBhcmUg4oCUIGFyZSBzdGFsZS5cbiAgICAgIHRoaXMuc3BhdGlhbFNjZW5lUmV2Kys7XG4gICAgICB2b2lkIHRoaXMucmVzb2x2ZUhvdmVyU291cmNlKGRhdGFzZXQsIHZpZXcpO1xuICAgICAgdm9pZCAoaXNTcGF0aWFsT21pY3MzZCh0aGlzLmN1cnJlbnRQbG90VHlwZSlcbiAgICAgICAgPyB0aGlzLnJlYnVpbGRTcGF0aWFsUG9pbnRzM2QoZGF0YXNldCwgdmlldywgc2VsZWN0aW9uKVxuICAgICAgICA6IHRoaXMucmVidWlsZFNwYXRpYWxQb2ludHMoZGF0YXNldCwgdmlldywgc2VsZWN0aW9uKSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogKFJlKWJ1aWxkIHRoZSBvYnNlcnZhdGlvbiBtYXJrZXIgbGF5ZXIgZm9yIHRoZSBjdXJyZW50IGRhdGFzZXQgKyB2aWV3IHN0YXRlLiAqL1xuICBwcml2YXRlIGFzeW5jIHJlYnVpbGRTcGF0aWFsUG9pbnRzKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrID0gZW1wdHlTZWxlY3Rpb24oKSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgdmlld2VyID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2aWV3ZXIpIHJldHVybjtcbiAgICBjb25zdCB0b2tlbiA9ICsrdGhpcy5zcGF0aWFsUmVidWlsZFRva2VuO1xuXG4gICAgLy8gUmVzb2x2ZSBjb2xvdXJzIEJFRk9SRSB0b3VjaGluZyB0aGUgc2NlbmU6IGEgZ2VuZSBmZXRjaCBjYW4gZmFpbCBvciBiZVxuICAgIC8vIHN1cGVyc2VkZWQsIGFuZCBkcm9wcGluZyB0aGUgZXhpc3RpbmcgbGF5ZXIgZmlyc3Qgd291bGQgYmxhbmsgdGhlIHZpZXcuXG4gICAgbGV0IGZhY2VDb2xvcjogUmV0dXJuVHlwZTx0eXBlb2YgdG9SZ2JhVHVwbGVzPiB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICAgIHRyeSB7XG4gICAgICBmYWNlQ29sb3IgPSBkYXRhc2V0XG4gICAgICAgID8gYXdhaXQgdGhpcy5zcGF0aWFsRmFjZUNvbG9ycyhkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24pXG4gICAgICAgIDogTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuU1BBVElBTF9ORVVUUkFMX0NPTE9SO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSBzcGF0aWFsIGNvbG91cmluZyBmYWlsZWQg4oCUIGZhbGxpbmcgYmFjayB0byBhIGZsYXQgY29sb3VyJywgZXJyKTtcbiAgICAgIGZhY2VDb2xvciA9IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLlNQQVRJQUxfTkVVVFJBTF9DT0xPUjtcbiAgICB9XG4gICAgLy8gQSBuZXdlciByZWJ1aWxkIChvciBhIHRlYXJkb3duKSBzdGFydGVkIHdoaWxlIHRoZSB2ZWN0b3Igd2FzIGluIGZsaWdodC5cbiAgICBpZiAodG9rZW4gIT09IHRoaXMuc3BhdGlhbFJlYnVpbGRUb2tlbiB8fCB0aGlzLnZpZXdlciAhPT0gdmlld2VyKSByZXR1cm47XG5cbiAgICBpZiAoIWRhdGFzZXQgfHwgZGF0YXNldC5vYnNlcnZhdGlvbnMuY291bnQgPT09IDApIHtcbiAgICAgIGlmICh0aGlzLnNwYXRpYWxQb2ludHMpIHtcbiAgICAgICAgdmlld2VyLmxheWVycy5yZW1vdmUodGhpcy5zcGF0aWFsUG9pbnRzKTtcbiAgICAgICAgdGhpcy5zcGF0aWFsUG9pbnRzID0gbnVsbDtcbiAgICAgICAgdGhpcy5zcGF0aWFsTGF5ZXJLZXkgPSBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZ2VuZU1hcExheWVyKSB7XG4gICAgICAgIHZpZXdlci5sYXllcnMucmVtb3ZlKHRoaXMuZ2VuZU1hcExheWVyKTtcbiAgICAgICAgdGhpcy5nZW5lTWFwTGF5ZXIgPSBudWxsO1xuICAgICAgICB0aGlzLmdlbmVNYXBLZXkgPSBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9icyA9IGRhdGFzZXQub2JzZXJ2YXRpb25zO1xuICAgIC8vIEEgZGF0YXNldCB3aG9zZSBpbWFnZSBJUyBpdHMgdm9sdW1lIHNob3dzIE9ORSBQTEFORSBhdCBhIHRpbWUsIHNvIHRoZVxuICAgIC8vIG1hcmtlcnMgYXJlIHRoZSBvYnNlcnZhdGlvbnMgaW4gdGhlIGRpc3BsYXllZCBwbGFuZSwgZHJhd24gaW4gdGhhdCBwbGFuZSdzXG4gICAgLy8gcGl4ZWwgZ3JpZC4gV2l0aG91dCB0aGUgZmlsdGVyIHRoZSBzcGVjaW1lbidzIHdob2xlIGRlcHRoIHBpbGVzIG9udG8gb25lXG4gICAgLy8gc2VjdGlvbiBhbmQgcmVhZHMgYXMgYSBzbWVhcjsgd2l0aG91dCB0aGUgYWZmaW5lIHRoZSBjb29yZGluYXRlcyBhcmUgcmVhZFxuICAgIC8vIGFzIHBpeGVscyBhbmQgbGFuZCBvZmYgdGhlIHNsaWNlIGVudGlyZWx5LlxuICAgIGNvbnN0IHNsYWIgPSB0aGlzLnNwYXRpYWxTbGFiKGRhdGFzZXQpO1xuICAgIC8vIFRoZSBnZW5lIG1hcCBnb2VzIFVOREVSIHRoZSBjZWxscywgc28gaXQgaXMgc2V0dGxlZCBiZWZvcmUgdGhleSBhcmUgYWRkZWQuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVHZW5lTWFwKHZpZXdlciwgZGF0YXNldCwgdmlldywgc2VsZWN0aW9uLCBzbGFiKTtcbiAgICBpZiAodG9rZW4gIT09IHRoaXMuc3BhdGlhbFJlYnVpbGRUb2tlbiB8fCB0aGlzLnZpZXdlciAhPT0gdmlld2VyKSByZXR1cm47XG4gICAgY29uc3QgcmVmID0gc2xhYj8ucmVmID8/IGRhdGFzZXQuaW1hZ2VSZWY7XG4gICAgY29uc3QgYmFzZSA9IG1hcmtlckRpYW1ldGVycyhvYnMsIE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLlNQQVRJQUxfRkFMTEJBQ0tfUkFESVVTKTtcbiAgICBjb25zdCBzY2FsZSA9IHZpZXcucG9pbnRTY2FsZSA+IDAgPyB2aWV3LnBvaW50U2NhbGUgOiAxO1xuICAgIGNvbnN0IGZsb29yID0gc2xhYj8ubWluRGlhbWV0ZXIgPz8gMDtcbiAgICBjb25zdCBzaXplT2YgPSAoaTogbnVtYmVyKSA9PlxuICAgICAgTWF0aC5tYXgodHlwZW9mIGJhc2UgPT09ICdudW1iZXInID8gYmFzZSA6IGJhc2VbaV0sIGZsb29yKSAqIHNjYWxlO1xuICAgIGNvbnN0IHNpemU6IG51bWJlciB8IEZsb2F0MzJBcnJheSA9XG4gICAgICB0eXBlb2YgYmFzZSA9PT0gJ251bWJlcicgJiYgIXNsYWJcbiAgICAgICAgPyBNYXRoLm1heChiYXNlLCBmbG9vcikgKiBzY2FsZVxuICAgICAgICA6IEZsb2F0MzJBcnJheS5mcm9tKHNsYWI/LmluZGljZXMgPz8geyBsZW5ndGg6IG9icy5jb3VudCB9LCAoX3YsIGkpID0+XG4gICAgICAgICAgICBzaXplT2Yoc2xhYiA/IHNsYWIuaW5kaWNlc1tpXSA6IGkpKTtcblxuICAgIC8vIG5hcGFyaSdzIGltYWdlIHZpZXcgQ0xFQVJTIHRoZSB3aG9sZSBsYXllciBsaXN0IG9uIGV2ZXJ5IHJlbmRlciwgc28gdGhlXG4gICAgLy8gbWFya2VycyBnbyB3aXRoIGl0IHdoZW5ldmVyIHRoZSBpbWFnZSBpcyByZS1yZW5kZXJlZCDigJQgYSBzY3J1YiwgYSBjb250cmFzdFxuICAgIC8vIGNoYW5nZS4gVGhlIGNhY2hlZCBoYW5kbGUgaXMgdGhlbiBkZXRhY2hlZCwgYW5kIG11dGF0aW5nIGl0IGRyYXdzIG5vdGhpbmc6XG4gICAgLy8gdHJlYXQgYSBsYXllciB0aGF0IGlzIG5vIGxvbmdlciBpbiB0aGUgc2NlbmUgYXMgYWJzZW50IHNvIGl0IGdldHMgcmUtYWRkZWQuXG4gICAgaWYgKHRoaXMuc3BhdGlhbFBvaW50cyAmJiAhdmlld2VyLmxheWVycy5pdGVtcy5pbmNsdWRlcyh0aGlzLnNwYXRpYWxQb2ludHMpKSB7XG4gICAgICB0aGlzLnNwYXRpYWxQb2ludHMgPSBudWxsO1xuICAgICAgdGhpcy5zcGF0aWFsTGF5ZXJLZXkgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIEEgc2l6ZS9jb2xvdXIvb3BhY2l0eS9zZWxlY3Rpb24gY2hhbmdlIGlzIERJU1BMQVktb25seTogbXV0YXRlIHRoZSBsYXllclxuICAgIC8vIHJhdGhlciB0aGFuIGRyb3BwaW5nIGFuZCByZS1hZGRpbmcgaXQuIEJvdGggc2V0dGVycyBidW1wIHRoZSBsYXllcidzXG4gICAgLy8gZGF0YVZlcnNpb24sIHdoaWNoIGlzIHdoYXQgbWFrZXMgbmFwYXJpLWpzIHJlYnVpbGQgdGhlIGluc3RhbmNlIGJ1ZmZlciBhbmRcbiAgICAvLyByZWRyYXcg4oCUIGFuZCBpdCBhdm9pZHMgcmVidWlsZGluZyA4NGsgcG9zaXRpb25zIHRvIGNoYW5nZSBvbmUgbnVtYmVyLlxuICAgIC8vIFRoZSBzbGljZSBpcyBwYXJ0IG9mIHRoZSBrZXk6IGEgc2NydWIgY2hhbmdlcyBXSElDSCBvYnNlcnZhdGlvbnMgYXJlIGRyYXduLFxuICAgIC8vIHdoaWNoIGlzIGdlb21ldHJ5LCBub3QgZGlzcGxheS5cbiAgICBjb25zdCBrZXkgPSBgJHtkYXRhc2V0LmlkfToke29icy5jb3VudH06JHtzbGFiPy5zbGljZSA/PyAnJ31gO1xuICAgIGlmICh0aGlzLnNwYXRpYWxQb2ludHMgJiYga2V5ID09PSB0aGlzLnNwYXRpYWxMYXllcktleSkge1xuICAgICAgdGhpcy5zcGF0aWFsUG9pbnRzLnNpemUgPSBzaXplO1xuICAgICAgdGhpcy5zcGF0aWFsUG9pbnRzLmZhY2VDb2xvciA9IHRoaXMuZ2F0aGVyQ29sb3JzKGZhY2VDb2xvciwgc2xhYj8uaW5kaWNlcykgYXMgbmV2ZXI7XG4gICAgICB2aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNwYXRpYWxQb2ludHMpIHtcbiAgICAgIHZpZXdlci5sYXllcnMucmVtb3ZlKHRoaXMuc3BhdGlhbFBvaW50cyk7XG4gICAgICB0aGlzLnNwYXRpYWxQb2ludHMgPSBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGRyYXduID0gc2xhYj8uaW5kaWNlcztcbiAgICBjb25zdCBjb3VudCA9IGRyYXduID8gZHJhd24ubGVuZ3RoIDogb2JzLmNvdW50O1xuICAgIGNvbnN0IHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoY291bnQgKiAyKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IG8gPSBkcmF3biA/IGRyYXduW2ldIDogaTtcbiAgICAgIHBvc2l0aW9uc1tpICogMl0gPSBvYnMueFtvXTtcbiAgICAgIHBvc2l0aW9uc1tpICogMiArIDFdID0gb2JzLnlbb107XG4gICAgfVxuICAgIHRoaXMuc3BhdGlhbExheWVyS2V5ID0ga2V5O1xuICAgIHRoaXMuc3BhdGlhbFBvaW50cyA9IHZpZXdlci5hZGRQb2ludHMocG9zaXRpb25zLCB7XG4gICAgICBuYW1lOiAnb2JzZXJ2YXRpb25zJyxcbiAgICAgIHNpemUsXG4gICAgICBmYWNlQ29sb3I6IHRoaXMuZ2F0aGVyQ29sb3JzKGZhY2VDb2xvciwgZHJhd24pLFxuICAgICAgLy8gTm8gYm9yZGVyOiBhdCBWaXNpdW0gc3BvdCBkZW5zaXR5IGFuIG91dGxpbmUgcGVyIG1hcmtlciByZWFkcyBhcyBub2lzZSxcbiAgICAgIC8vIGFuZCBpdCBjb3N0cyBhIHNlY29uZCBjb2xvdXIgYXJyYXkuXG4gICAgICBib3JkZXJXaWR0aDogMCxcbiAgICAgIC8vIFRoZSBkYXRhc2V0J3MgZGF0YS0+d29ybGQgYWZmaW5lLiBTcGF0aWFsRGF0YSByZWNvcmRzIG9uZSBwZXIgY29vcmRpbmF0ZVxuICAgICAgLy8gc3lzdGVtIChWaXNpdW0gc3BvdCBjb29yZHMgYXJlIGluIHRoZSBGVUxMLXJlc29sdXRpb24gZnJhbWUgd2hpbGUgdGhlXG4gICAgICAvLyBzZXJ2ZWQgaW1hZ2UgbWF5IGJlIHRoZSBoaXJlcyBkb3duc2NhbGUpLCBzbyB3aXRob3V0IHRoaXMgdGhlIG1hcmtlcnNcbiAgICAgIC8vIGxhbmQgaW4gdGhlIHJpZ2h0IHNoYXBlIGF0IHRoZSB3cm9uZyBzY2FsZS4gRGVmYXVsdHMgdG8gaWRlbnRpdHkgd2hlblxuICAgICAgLy8gdGhlIGNvb3JkaW5hdGVzIGFyZSBhbHJlYWR5IGluIHRoZSBpbWFnZSdzIHBpeGVsIHNwYWNlLlxuICAgICAgc2NhbGU6IHJlZj8uc2NhbGUgPz8gWzEsIDFdLFxuICAgICAgdHJhbnNsYXRlOiByZWY/LnRyYW5zbGF0ZSA/PyBbMCwgMF0sXG4gICAgfSk7XG4gICAgdGhpcy5mcmFtZVNwYXRpYWxQb2ludHNPbmNlKHZpZXdlciwgZGF0YXNldC5pZCwgcG9zaXRpb25zLCAhIXJlZik7XG4gICAgdGhpcy5oaWRlRm9yZWlnbkltYWdlKHZpZXdlciwgISFyZWYgfHwgISFkYXRhc2V0LnZvbHVtZSk7XG4gICAgdGhpcy5zZXRSZWdpb25HcmlkRm9yKGRhdGFzZXQsIHBvc2l0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogVGVsbCB0aGUgcmVnaW9uIG92ZXJsYXkgaG93IGZpbmVseSBhIGRyYXduIHZlcnRleCBtYXkgYmUgcGxhY2VkLlxuICAgKlxuICAgKiBSZWdpb24gZ2VvbWV0cnkgaXMgc3RvcmVkIGluIHdob2xlIHdvcmxkIHVuaXRzLCB3aGljaCBpcyByaWdodCB3aGVuIHRoZSB3b3JsZCBJU1xuICAgKiBwaXhlbHMg4oCUIGEgcmVnaW9uIHNob3VsZCBhbGlnbiB0byB0aGVtLiBJdCBpcyB3cm9uZyBmb3IgYSBkYXRhc2V0IHRoYXQgcmVnaXN0ZXJzIG9udG9cbiAgICogbm8gaW1hZ2U6IHNlcUZJU0gncyBvYnNlcnZhdGlvbnMgc3BhbiBhYm91dCA1IHggNyB1bml0cyBpbiB0b3RhbCwgc28gd2hvbGUtdW5pdFxuICAgKiB2ZXJ0aWNlcyBsZWF2ZSByb3VnaGx5IHNpeCBieSBlaWdodCBwbGFjZWFibGUgcG9zaXRpb25zIGFjcm9zcyB0aGUgZW50aXJlIHNhbXBsZSBhbmRcbiAgICogYW4gUk9JIGNhbm5vdCBiZSBkcmF3biBhdCBhbnkgem9vbS4gTm90aGluZyBlcnJvcnM7IHRoZSB0b29sIGp1c3QgY2Fubm90IGV4cHJlc3MgdGhlXG4gICAqIHNoYXBlLlxuICAgKlxuICAgKiBLZXllZCBvbiB3aGV0aGVyIHRoZSBkYXRhc2V0IGJyaW5ncyBQSVhFTFMgcmF0aGVyIHRoYW4gb24gdGhlIGV4dGVudCwgYmVjYXVzZSB0aGVcbiAgICogZXh0ZW50IGNhbm5vdCB0ZWxsIHRoZSB0d28gYXBhcnQg4oCUIDIsMDAwIHVuaXRzIGlzIGEgc21hbGwgc2xpZGUgb3IgYSBsYXJnZSBzZWN0aW9uXG4gICAqIGRlcGVuZGluZyBvbmx5IG9uIHdoYXQgdGhlIHVuaXRzIGFyZSwgYW5kIG9ubHkgdGhlIGRhdGFzZXQga25vd3MuXG4gICAqL1xuICBwcml2YXRlIHNldFJlZ2lvbkdyaWRGb3IoZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHBvc2l0aW9uczogRmxvYXQzMkFycmF5KTogdm9pZCB7XG4gICAgY29uc3Qgb3ZlcmxheSA9IHRoaXMucmVnaW9uT3ZlcmxheTtcbiAgICBpZiAoIW92ZXJsYXk/LnNldFdvcmxkUXVhbnR1bSkgcmV0dXJuO1xuICAgIGlmIChkYXRhc2V0LmltYWdlUmVmIHx8IGRhdGFzZXQudm9sdW1lKSB7XG4gICAgICBvdmVybGF5LnNldFdvcmxkUXVhbnR1bShQSVhFTF9XT1JMRF9RVUFOVFVNKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IG1pblggPSBJbmZpbml0eTsgbGV0IG1heFggPSAtSW5maW5pdHk7IGxldCBtaW5ZID0gSW5maW5pdHk7IGxldCBtYXhZID0gLUluZmluaXR5O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICBjb25zdCB4ID0gcG9zaXRpb25zW2ldO1xuICAgICAgY29uc3QgeSA9IHBvc2l0aW9uc1tpICsgMV07XG4gICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh4KSB8fCAhTnVtYmVyLmlzRmluaXRlKHkpKSBjb250aW51ZTtcbiAgICAgIGlmICh4IDwgbWluWCkgbWluWCA9IHg7XG4gICAgICBpZiAoeCA+IG1heFgpIG1heFggPSB4O1xuICAgICAgaWYgKHkgPCBtaW5ZKSBtaW5ZID0geTtcbiAgICAgIGlmICh5ID4gbWF4WSkgbWF4WSA9IHk7XG4gICAgfVxuICAgIG92ZXJsYXkuc2V0V29ybGRRdWFudHVtKHdvcmxkUXVhbnR1bUZvckV4dGVudChtYXhYIC0gbWluWCwgbWF4WSAtIG1pblkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGcmFtZSB0aGUgMkQgY2FtZXJhIG9uIHRoZSBvYnNlcnZhdGlvbnMsIGZvciBhIGRhdGFzZXQgdGhhdCBicmluZ3Mgbm8gaW1hZ2UuXG4gICAqXG4gICAqIFRoZSAyRCBjYW1lcmEgaXMgbm9ybWFsbHkgZml0dGVkIHRvIHRoZSBJTUFHRSwgYmVjYXVzZSB0aGUgb2JzZXJ2YXRpb25zIGFyZSBpbiB0aGF0XG4gICAqIGltYWdlJ3MgcGl4ZWwgc3BhY2UgYW5kIGZyYW1pbmcgdGhlIGltYWdlIGZyYW1lcyB0aGVtIHRvby4gQSBkYXRhc2V0IHdpdGggbm9cbiAgICogcmVmZXJlbmNlIGltYWdlIGhhcyBjb29yZGluYXRlcyBpbiBpdHMgb3duIHVuaXRzIGluc3RlYWQg4oCUIHNlcUZJU0gncyBzcGFuIGFib3V0XG4gICAqIDV4NyDigJQgc28gdGhlIGltYWdlIGZyYW1pbmcgbGVmdCBvdmVyIGZyb20gd2hhdGV2ZXIgd2FzIG9uIHNjcmVlbiBiZWZvcmUgcHV0cyB0aGVcbiAgICogd2hvbGUgY2xvdWQgb2Zmc2NyZWVuOiBtZWFzdXJlZCBhdCA5LjcgeCAxMy40IFBJWEVMUywgY2VudHJlZCAyNTZweCBmcm9tIHdoZXJlIHRoZVxuICAgKiBjYW1lcmEgd2FzIGxvb2tpbmcuIFRoZSBwb2ludHMgYXJlIGFsbCB0aGVyZSBhbmQgZHJhd247IHRoZXkgYXJlIGEgc3BlY2suIFdoaWNoXG4gICAqIGxvb2tzIGV4YWN0bHkgbGlrZSB0aGUgZGF0YXNldCBoYXZpbmcgZmFpbGVkIHRvIGxvYWQuXG4gICAqXG4gICAqIE9uY2UgcGVyIGRhdGFzZXQsIGFzIG5hcGFyaS1qcydzIGBmaXQzZDogJ29uY2UnYCBkb2VzIGZvciB0aGUgY2xvdWQ6IHJlLWNvbG91cmluZyxcbiAgICogc2xpY2luZyBvciBwaWNraW5nIGEgZ2VuZSByZS1hZGRzIHRoaXMgbGF5ZXIsIGFuZCByZS1mcmFtaW5nIG9uIHRob3NlIHdvdWxkIG1vdmVcbiAgICogdGhlIGNhbWVyYSB1bmRlciB0aGUgdXNlciDigJQgdGhlIGNhbWVyYSB0b29scyBhbmQgdGhlIGNhbnZhcyBkcmFnIGFyZSBtZWFudCB0byBiZVxuICAgKiB0aGUgb25seSB0aGluZ3MgdGhhdCBkby5cbiAgICovXG4gIC8qKlxuICAgKiBIaWRlIHRoZSBpbWFnZSBsYXllciBmb3IgYSBkYXRhc2V0IHRoYXQgYnJpbmdzIG5vIGltYWdlIG9mIGl0cyBvd24uXG4gICAqXG4gICAqIFRoZSBob3N0J3Mgdmlld2VyIGtlZXBzIHdoYXRldmVyIGltYWdlIHdhcyBsYXN0IGxvYWRlZCwgYW5kIGZvciBhIGRhdGFzZXQgdGhhdFxuICAgKiByZWdpc3RlcnMgb250byBub25lIHRoYXQgcGljdHVyZSBiZWxvbmdzIHRvIHNvbWV0aGluZyBlbHNlIGVudGlyZWx5IOKAlCB0aGUgZXhhbXBsZSdzXG4gICAqIGRlZmF1bHQgc2xpZGUsIHNheS4gSXQgaXMgbm90IG1lcmVseSBpcnJlbGV2YW50OiB0aGUgdHdvIGxpdmUgaW4gZGlmZmVyZW50IGNvb3JkaW5hdGVcbiAgICogc3BhY2VzIChpbWFnZSBwaXhlbHMgYWdhaW5zdCB0aGUgZW1iZWRkaW5nJ3Mgb3duIHVuaXRzKSwgc28gdGhlIGxlZnRvdmVyIGlzIG1hZ25pZmllZFxuICAgKiByb3VnaGx5IGEgaHVuZHJlZGZvbGQuIEF0IHRoZSBmaXR0ZWQgem9vbSB0aGUgY2FtZXJhIHNpdHMgaW5zaWRlIGl0cyBjb3JuZXIsIHdoZXJlIGl0XG4gICAqIHJlYWRzIGFzIGJsYW5rIGJhY2tncm91bmQsIGFuZCBpdCBhcHBlYXJzIG9ubHkgb25jZSB5b3Ugem9vbSBvdXQgZmFyIGVub3VnaCB0byBmaW5kXG4gICAqIGl0IOKAlCB3aGljaCBpcyBleGFjdGx5IGhvdyBpdCBnZXRzIG5vdGljZWQuXG4gICAqXG4gICAqIEhpZGRlbiByYXRoZXIgdGhhbiByZW1vdmVkLCBhbmQgaGlkZGVuIEhFUkUgcmF0aGVyIHRoYW4gYnkgY2xlYXJpbmcgdGhlIGhvc3QncyBpbWFnZVxuICAgKiBzdGF0ZTogdGhhdCBzdGF0ZSBkcml2ZXMgdGhlIHdob2xlIHJlbmRlciBwaXBlbGluZSwgaW5jbHVkaW5nIGEgUGxvdGx5IGJhY2tlbmQgd2hvc2VcbiAgICogZmllbGRzIGFyZSBkZWNsYXJlZCB3aXRoIGRlZmluaXRlLWFzc2lnbm1lbnQgYXNzZXJ0aW9ucywgc28gZW1wdHlpbmcgaXQgdGhyb3dzIGZyb21cbiAgICogd2hpY2hldmVyIGZpZWxkIHRoZSBuZXh0IHBhdGggaGFwcGVucyB0byByZWFkLiBUaGlzIHRvdWNoZXMgb25lIGxheWVyJ3MgdmlzaWJpbGl0eVxuICAgKiBhbmQgbm90aGluZyBlbHNlLlxuICAgKi9cbiAgcHJpdmF0ZSBoaWRlRm9yZWlnbkltYWdlKHZpZXdlcjogVmlld2VyLCBkYXRhc2V0SGFzUGl4ZWxzOiBib29sZWFuKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBsYXllciBvZiB2aWV3ZXIubGF5ZXJzLml0ZW1zKSB7XG4gICAgICBpZiAobGF5ZXIua2luZCAhPT0gJ2ltYWdlJykgY29udGludWU7XG4gICAgICAvLyBSZS1zaG93biB3aGVuIGEgZGF0YXNldCB0aGF0IG93bnMgYW4gaW1hZ2UgY29tZXMgYmFjaywgc28gc3dpdGNoaW5nIGJldHdlZW5cbiAgICAgIC8vIGRhdGFzZXRzIGRvZXMgbm90IGxlYXZlIHRoZSB0aXNzdWUgcGVybWFuZW50bHkgaGlkZGVuLlxuICAgICAgbGF5ZXIudmlzaWJsZSA9IGRhdGFzZXRIYXNQaXhlbHM7XG4gICAgfVxuICAgIHZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICBwcml2YXRlIGZyYW1lU3BhdGlhbFBvaW50c09uY2UoXG4gICAgdmlld2VyOiBWaWV3ZXIsIGRhdGFzZXRJZDogc3RyaW5nLCBwb3NpdGlvbnM6IEZsb2F0MzJBcnJheSwgcmVnaXN0ZXJlZDogYm9vbGVhbixcbiAgKTogdm9pZCB7XG4gICAgLy8gR2F0ZWQgb24gd2hldGhlciBUSElTIGRhdGFzZXQgcmVnaXN0ZXJzIG9udG8gYW4gaW1hZ2UsIG5vdCBvbiBgaW1hZ2VXYC9gaW1hZ2VIYDpcbiAgICAvLyB0aG9zZSBrZWVwIHRoZSBsYXN0IHBsb3R0ZWQgaW1hZ2UncyBkaW1lbnNpb25zIGFmdGVyIHRoZSBob3N0IGNsZWFycyBpdCwgc28gYVxuICAgIC8vIHN0YWxlIDUxMngzODMgcmVhZCBhcyBcInRoZXJlIGlzIGFuIGltYWdlXCIgYW5kIHNraXBwZWQgdGhlIGZyYW1pbmcgZW50aXJlbHkuXG4gICAgaWYgKHJlZ2lzdGVyZWQpIHJldHVybjtcbiAgICAvLyBPbmNlIHBlciBkYXRhc2V0LCBhcyBuYXBhcmktanMncyBgZml0M2Q6ICdvbmNlJ2AgZG9lcyBmb3IgdGhlIGNsb3VkOiByZS1jb2xvdXJpbmcsIHNsaWNpbmdcbiAgICAvLyBvciBwaWNraW5nIGEgZ2VuZSByZS1hZGRzIHRoaXMgbGF5ZXIsIGFuZCByZS1mcmFtaW5nIG9uIHRob3NlIHdvdWxkIG1vdmUgdGhlXG4gICAgLy8gY2FtZXJhIHVuZGVyIHRoZSB1c2VyIOKAlCB0aGUgY2FtZXJhIHRvb2xzIGFuZCB0aGUgY2FudmFzIGRyYWcgYXJlIG1lYW50IHRvIGJlIHRoZVxuICAgIC8vIG9ubHkgdGhpbmdzIHRoYXQgZG8uXG4gICAgaWYgKHRoaXMuc3BhdGlhbDJkRnJhbWVkPy52aWV3ZXIgPT09IHZpZXdlclxuICAgICAgJiYgdGhpcy5zcGF0aWFsMmRGcmFtZWQuZGF0YXNldElkID09PSBkYXRhc2V0SWQpIHJldHVybjtcblxuICAgIGNvbnN0IGZpdCA9IGZyYW1lUG9zaXRpb25zKFxuICAgICAgcG9zaXRpb25zLCB0aGlzLmNhbnZhcz8uY2xpZW50V2lkdGggPz8gMCwgdGhpcy5jYW52YXM/LmNsaWVudEhlaWdodCA/PyAwLFxuICAgICk7XG4gICAgLy8gTnVsbCBtZWFucyB0aGVyZSBpcyBub3RoaW5nIHRvIGZyYW1lIG9uOyBsZWF2ZSB0aGUgY2FtZXJhIHdoZXJlIGl0IGlzIHJhdGhlclxuICAgIC8vIHRoYW4gbW92aW5nIHRoZSB2aWV3IGZvciBhIGRhdGFzZXQgd2UgY2Fubm90IGZpdC5cbiAgICBpZiAoIWZpdCkgcmV0dXJuO1xuICAgIHZpZXdlci5jYW1lcmEuc2V0KGZpdC5jZW50ZXIsIGZpdC56b29tID8/IHZpZXdlci5jYW1lcmEuem9vbSk7XG4gICAgdGhpcy5zcGF0aWFsMmRGcmFtZWQgPSB7IHZpZXdlciwgZGF0YXNldElkIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlICoqZ2VuZSBtYXAqKjogdGhlIGFjdGl2ZSBnZW5lJ3MgZXhwcmVzc2lvbiBhcyBhIGNvbnRpbnVvdXMgZmllbGQgZHJhd24gdW5kZXJcbiAgICogdGhlIGNlbGxzLlxuICAgKlxuICAgKiBBIHNjYXR0ZXIgY29sb3VyZWQgYnkgYSBnZW5lIHNheXMgd2hpY2ggY2VsbHMgZXhwcmVzcyBpdDsgaXQgY2Fubm90IHNheSB3aGVyZSxcbiAgICogYmVjYXVzZSB0aGUgZXllIHdpbGwgbm90IGludGVncmF0ZSB0aG91c2FuZHMgb2YgZG90cyBpbnRvIGEgdGVycml0b3J5LiBUaGUgZmllbGRcbiAgICogaXMgYSBrZXJuZWwtd2VpZ2h0ZWQgTUVBTiBwZXIgY2VsbCAoc2VlIGBzcGF0aWFsLWV4cHJlc3Npb24udHNgKSwgc28gYSBkZW5zZVxuICAgKiByZWdpb24gZG9lcyBub3QgZ2xvdyBtZXJlbHkgZm9yIGJlaW5nIGRlbnNlLCBhbmQgaXQgaXMgdHJhbnNwYXJlbnQgd2hlcmV2ZXIgbm9cbiAgICogY2VsbCB3YXMgbWVhc3VyZWQg4oCUIGFuIHVuc2FtcGxlZCBnYXAgbXVzdCBub3QgcmVhZCBhcyBcIm5vdCBleHByZXNzZWRcIi5cbiAgICpcbiAgICogSXQgc2hhcmVzIHRoZSBwb2ludHMnIExVVCwgcGVyY2VudGlsZSB3aW5kb3cgYW5kIGxvZyBmbGFnLCBzbyB0aGUgbGF5ZXIgdW5kZXJcbiAgICogdGhlIGNlbGxzIGFuZCB0aGUgY2VsbHMgdGhlbXNlbHZlcyBjYW5ub3QgZGlzYWdyZWUgYWJvdXQgd2hhdCBhIGNvbG91ciBtZWFucy5cbiAgICpcbiAgICogRXN0aW1hdGVkIG9uIHRoZSBESVNQTEFZRUQgaW1hZ2UncyBwaXhlbCBncmlkLCBjb2Fyc2VuZWQgc28gdGhlIGxvbmcgc2lkZSBpcyBhdFxuICAgKiBtb3N0IHtAbGluayBHRU5FX01BUF9NQVhfU0lERX06IGEgc21vb3RoIGZpZWxkIGdhaW5zIG5vdGhpbmcgZnJvbSBhIHNsaWRlJ3MgZnVsbFxuICAgKiByZXNvbHV0aW9uLiBGb3IgYSB2b2x1bWUtYmFja2VkIGRhdGFzZXQgdGhhdCBncmlkIGlzIHRoZSBjdXJyZW50IHNsaWNlLCBhbmQgb25seVxuICAgKiB0aGF0IHBsYW5lJ3Mgb2JzZXJ2YXRpb25zIGFyZSBpbmNsdWRlZCDigJQgdGhlIHNhbWUgcnVsZSB0aGUgbWFya2VycyBmb2xsb3cuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZUdlbmVNYXAoXG4gICAgdmlld2VyOiBWaWV3ZXIsIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gICAgc2xhYjogeyByZWY6IFNwYXRpYWxJbWFnZVJlZjsgaW5kaWNlczogVWludDMyQXJyYXk7IHNsaWNlOiBudW1iZXIgfSB8IG51bGwsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGdlbmUgPSB2aWV3LmdlbmVNYXAgJiYgdmlldy5jb2xvckJ5Py5raW5kID09PSAnZmVhdHVyZScgPyB2aWV3LmNvbG9yQnkubmFtZSA6IG51bGw7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc3BhdGlhbERhdGE7XG4gICAgY29uc3Qgc21vb3RoaW5nID0gdmlldy5nZW5lTWFwU21vb3RoaW5nID4gMCA/IHZpZXcuZ2VuZU1hcFNtb290aGluZyA6IDE7XG4gICAgY29uc3QgY2xpcCA9IHZpZXcucGVyY2VudGlsZUNsaXAgPz8gWzAuMDEsIDAuOTldO1xuXG4gICAgLy8gVHdvIGNsb2NrczogdGhlIEZJRUxEIGRlcGVuZHMgb24gdGhlIGdlbmUsIHRoZSBwbGFuZSBhbmQgdGhlIGJhbmR3aWR0aCwgd2hpbGVcbiAgICAvLyB0aGUgY29sb3VycyBkZXBlbmQgb24gdGhlIHdpbmRvdywgdGhlIGxvZyBmbGFnIGFuZCB0aGUgb3BhY2l0eS4gUmVjb2xvdXJpbmcgYVxuICAgIC8vIGNhY2hlZCBmaWVsZCBpcyBhIGZyYWN0aW9uIG9mIGVzdGltYXRpbmcgb25lLlxuICAgIGNvbnN0IGZpZWxkS2V5ID0gZ2VuZVxuICAgICAgPyBbZGF0YXNldC5pZCwgZ2VuZSwgc2xhYj8uc2xpY2UgPz8gJycsIHNtb290aGluZywgdGhpcy5zZWxlY3Rpb25SZXYoc2VsZWN0aW9uKV0uam9pbignfCcpXG4gICAgICA6IG51bGw7XG4gICAgY29uc3Qga2V5ID0gZmllbGRLZXlcbiAgICAgID8gW1xuICAgICAgICBmaWVsZEtleSwgY2xpcC5qb2luKCcsJyksIHZpZXcubG9nU2NhbGUgPyAnbG9nJyA6ICdsaW4nLCB2aWV3LmdlbmVNYXBPcGFjaXR5LFxuICAgICAgICB0aGlzLmNvbnRpbnVvdXNDb2xvcm1hcEtleSh2aWV3KSxcbiAgICAgIF0uam9pbignfCcpXG4gICAgICA6IG51bGw7XG4gICAgaWYgKGtleSA9PT0gdGhpcy5nZW5lTWFwS2V5KSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5nZW5lTWFwTGF5ZXIpIHtcbiAgICAgIHZpZXdlci5sYXllcnMucmVtb3ZlKHRoaXMuZ2VuZU1hcExheWVyKTtcbiAgICAgIHRoaXMuZ2VuZU1hcExheWVyID0gbnVsbDtcbiAgICB9XG4gICAgLy8gQU5ZIGNoYW5nZSBoZXJlIGNoYW5nZXMgdGhlIG9yZGVyIHRoZSBjZWxscyBoYXZlIHRvIHNpdCBhYm92ZSDigJQgaW5jbHVkaW5nIHRoZVxuICAgIC8vIGZpcnN0IG9uZSwgd2hlcmUgdGhlcmUgaXMgbm8gcHJldmlvdXMgbGF5ZXIgdG8gcmVtb3ZlIOKAlCBhbmQgdGhlIGxheWVyIGxpc3QgaXNcbiAgICAvLyBhcHBlbmQtb25seS4gU28gZHJvcCB0aGUgbWFya2VycyB1bmNvbmRpdGlvbmFsbHkgYW5kIGxldCB0aGUgcmVidWlsZCBiZWxvdyBwdXRcbiAgICAvLyB0aGVtIGJhY2sgb24gdG9wOyBvdGhlcndpc2UgdGhlIGZpZWxkIGlzIGFwcGVuZGVkIG92ZXIgdGhlIG1lYXN1cmVtZW50LlxuICAgIGlmICh0aGlzLnNwYXRpYWxQb2ludHMpIHtcbiAgICAgIHZpZXdlci5sYXllcnMucmVtb3ZlKHRoaXMuc3BhdGlhbFBvaW50cyk7XG4gICAgICB0aGlzLnNwYXRpYWxQb2ludHMgPSBudWxsO1xuICAgICAgdGhpcy5zcGF0aWFsTGF5ZXJLZXkgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmdlbmVNYXBLZXkgPSBrZXk7XG4gICAgaWYgKCFrZXkgfHwgIWdlbmUgfHwgIXBvcnQpIHtcbiAgICAgIHRoaXMuZ2VuZU1hcEZpZWxkID0gbnVsbDtcbiAgICAgIHRoaXMuZ2VuZU1hcEZpZWxkS2V5ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUaGUgcmFzdGVyIGNvdmVycyB0aGUgZGlzcGxheWVkIGltYWdlOyB3aXRob3V0IG9uZSB0aGVyZSBpcyBub3RoaW5nIHRvXG4gICAgLy8gb3ZlcmxheSBhbmQgdGhlIGNsb3VkIGlzIHRoZSAzRCBtb2RlJ3MgYnVzaW5lc3MsIG5vdCB0aGlzIG9uZSdzLlxuICAgIGNvbnN0IGltYWdlVyA9IHNsYWIgPyBkYXRhc2V0LnZvbHVtZSEud2lkdGggOiB0aGlzLmltYWdlVztcbiAgICBjb25zdCBpbWFnZUggPSBzbGFiID8gZGF0YXNldC52b2x1bWUhLmhlaWdodCA6IHRoaXMuaW1hZ2VIO1xuICAgIGlmICghaW1hZ2VXIHx8ICFpbWFnZUgpIHJldHVybjtcbiAgICBjb25zdCBzdGVwID0gTWF0aC5tYXgoXG4gICAgICAxLFxuICAgICAgTWF0aC5jZWlsKE1hdGgubWF4KGltYWdlVywgaW1hZ2VIKSAvIE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLkdFTkVfTUFQX01BWF9TSURFKSxcbiAgICApO1xuXG4gICAgaWYgKGZpZWxkS2V5ICE9PSB0aGlzLmdlbmVNYXBGaWVsZEtleSkge1xuICAgICAgbGV0IHZhbHVlczogRmxvYXQzMkFycmF5O1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFsdWVzID0gYXdhaXQgcG9ydC5nZXRGZWF0dXJlVmVjdG9yKGdlbmUpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgW25hcGFyaS1qc10gZ2VuZSBtYXA6IFwiJHtnZW5lfVwiIHVuYXZhaWxhYmxlYCwgZXJyKTtcbiAgICAgICAgdGhpcy5nZW5lTWFwS2V5ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMudmlld2VyICE9PSB2aWV3ZXIgfHwgdGhpcy5nZW5lTWFwS2V5ICE9PSBrZXkpIHJldHVybjtcbiAgICAgIGNvbnN0IGluU2VsZWN0aW9uID0gc2VsZWN0aW9uLmNvdW50ID4gMCA/IG1hc2tUb0luZGljZXMoc2VsZWN0aW9uLm1hc2spIDogdW5kZWZpbmVkO1xuICAgICAgdGhpcy5nZW5lTWFwRmllbGQgPSBleHByZXNzaW9uRmllbGQoZGF0YXNldC5vYnNlcnZhdGlvbnMsIHtcbiAgICAgICAgcmVmOiBzbGFiPy5yZWYgPz8gZGF0YXNldC5pbWFnZVJlZixcbiAgICAgICAgd2lkdGg6IE1hdGguY2VpbChpbWFnZVcgLyBzdGVwKSxcbiAgICAgICAgaGVpZ2h0OiBNYXRoLmNlaWwoaW1hZ2VIIC8gc3RlcCksXG4gICAgICAgIHN0ZXAsXG4gICAgICAgIHNpZ21hOiBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5HRU5FX01BUF9TSUdNQSAqIHNtb290aGluZyxcbiAgICAgICAgdmFsdWVzLFxuICAgICAgICAvLyBBIHBsYW5lIHdpbnMgb3ZlciBhIHNlbGVjdGlvbjogdGhlIDJEIHZpZXcgaXMgc2hvd2luZyBvbmUgc2VjdGlvbiwgc28gYVxuICAgICAgICAvLyBmaWVsZCBzcGFubmluZyB0aGUgc3BlY2ltZW4ncyBkZXB0aCB3b3VsZCBub3QgYmUgdGhlIHRoaW5nIG9uIHNjcmVlbi5cbiAgICAgICAgaW5kaWNlczogc2xhYj8uaW5kaWNlcyA/PyBpblNlbGVjdGlvbixcbiAgICAgIH0pO1xuICAgICAgdGhpcy5nZW5lTWFwRmllbGRLZXkgPSBmaWVsZEtleTtcbiAgICB9XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmdlbmVNYXBGaWVsZDtcbiAgICBpZiAoIWZpZWxkKSByZXR1cm47XG5cbiAgICBjb25zdCBub2RlID0gdGhpcy5jdXJyZW50Q29sb3JtYXAgYXMgeyBkYXRhPzogeyB2YWx1ZT86IHVua25vd24gfSB9IHwgbnVsbDtcbiAgICBjb25zdCBsdXQgPSBzcGF0aWFsQ29udGludW91c0x1dChcbiAgICAgIG5vZGU/LmRhdGE/LnZhbHVlLCB0aGlzLmN1cnJlbnRSZXZlcnNlLCB2aWV3LmNvbnRpbnVvdXNDb2xvcm1hcCxcbiAgICApO1xuICAgIGNvbnN0IFtsbywgaGldID0gY29udHJhc3RXaW5kb3coZmllbGQubWVhbiwgY2xpcFswXSwgY2xpcFsxXSk7XG4gICAgY29uc3QgcmdiYSA9IGNvbG9yRXhwcmVzc2lvbkZpZWxkKGZpZWxkLCBsdXQsIFtsbywgaGldLCB7XG4gICAgICBsb2c6IHZpZXcubG9nU2NhbGUsXG4gICAgICAvLyBUaGUgTUFQJ3Mgb3duIG9wYWNpdHk6IHJlYWRpbmcgYSBmaWVsZCB1bmRlciB0aGUgY2VsbHMgbWVhbnMgdHVybmluZyB0aGVcbiAgICAgIC8vIGNlbGxzIGRvd24sIHdoaWNoIG11c3Qgbm90IHRha2UgdGhlIGZpZWxkIHdpdGggdGhlbS5cbiAgICAgIG9wYWNpdHk6IHZpZXcuZ2VuZU1hcE9wYWNpdHksXG4gICAgfSk7XG4gICAgdGhpcy5nZW5lTWFwTGF5ZXIgPSB2aWV3ZXIuYWRkSW1hZ2UoXG4gICAgICB7IGtpbmQ6ICd0eXBlZCcsIHdpZHRoOiBmaWVsZC53aWR0aCwgaGVpZ2h0OiBmaWVsZC5oZWlnaHQsIGNoYW5uZWxzOiA0LCBkdHlwZTogJ3VpbnQ4JywgZGF0YTogcmdiYSB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiBgZ2VuZSBtYXAgwrcgJHtnZW5lfWAsXG4gICAgICAgIHNjYWxlOiBbc3RlcCwgc3RlcF0sXG4gICAgICAgIHRyYW5zbGF0ZTogWzAsIDBdLFxuICAgICAgICBibGVuZGluZzogJ3RyYW5zbHVjZW50JyxcbiAgICAgIH0sXG4gICAgKTtcbiAgICB2aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwbGFuZSBhIHZvbHVtZS1iYWNrZWQgZGF0YXNldCBpcyBjdXJyZW50bHkgc2hvd2luZzogaXRzIHBpeGVsIGFmZmluZSwgdGhlXG4gICAqIG9ic2VydmF0aW9ucyB0aGF0IGZhbGwgaW4gaXQsIGFuZCB0aGUgbWFya2VyIGZsb29yIHRoYXQgZ3JpZCBuZWVkcy5cbiAgICpcbiAgICogTnVsbCBmb3IgYSBkYXRhc2V0IHdpdGggYSByZWFsIGBpbWFnZVJlZmAgKGl0cyBjb29yZGluYXRlcyBhcmUgYWxyZWFkeSB0aGVcbiAgICogaW1hZ2UncyBwaXhlbHMgYW5kIGV2ZXJ5IG9ic2VydmF0aW9uIGJlbG9uZ3MgdG8gdGhlIG9uZSBzZWN0aW9uKSBhbmQgZm9yIG9uZVxuICAgKiB3aXRoIG5vIHZvbHVtZSBhdCBhbGwg4oCUIGJvdGggb2Ygd2hpY2ggZHJhdyBleGFjdGx5IGFzIGJlZm9yZS5cbiAgICovXG4gIHByaXZhdGUgc3BhdGlhbFNsYWIoZGF0YXNldDogU3BhdGlhbERhdGFzZXQpOiB7XG4gICAgcmVmOiBTcGF0aWFsSW1hZ2VSZWY7IGluZGljZXM6IFVpbnQzMkFycmF5OyBzbGljZTogbnVtYmVyOyBtaW5EaWFtZXRlcjogbnVtYmVyO1xuICB9IHwgbnVsbCB7XG4gICAgY29uc3Qgdm9sdW1lID0gZGF0YXNldC52b2x1bWU7XG4gICAgaWYgKGRhdGFzZXQuaW1hZ2VSZWYgfHwgIXZvbHVtZSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgc2xpY2UgPSB0aGlzLmxvYWRlZD8ueiA/PyAwO1xuICAgIHJldHVybiB7XG4gICAgICByZWY6IHZvbHVtZUltYWdlUmVmKHZvbHVtZSwgZGF0YXNldC5taWNyb25zUGVyVW5pdCksXG4gICAgICBpbmRpY2VzOiBvYnNlcnZhdGlvbnNJblNsaWNlKGRhdGFzZXQub2JzZXJ2YXRpb25zLCB2b2x1bWUsIHNsaWNlKSxcbiAgICAgIHNsaWNlLFxuICAgICAgbWluRGlhbWV0ZXI6IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLlNQQVRJQUxfU0xJQ0VfTUlOX0RJQU1FVEVSX1BYICogdm9sdW1lLnZveGVsU2l6ZVswXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFBlci1wb2ludCBjb2xvdXJzIGZvciB0aGUgZHJhd24gc3Vic2V0LiBBIGJyb2FkY2FzdCB0dXBsZSBzdGF5cyBicm9hZGNhc3Qg4oCUXG4gICAqICBpdCBpcyBvbmUgY29sb3VyIGZvciBldmVyeSBwb2ludCBlaXRoZXIgd2F5LiAqL1xuICBwcml2YXRlIGdhdGhlckNvbG9yczxUPihjb2xvcnM6IFRbXSB8IFQsIGluZGljZXM/OiBVaW50MzJBcnJheSk6IFRbXSB8IFQge1xuICAgIGlmICghaW5kaWNlcyB8fCAhQXJyYXkuaXNBcnJheShjb2xvcnMpKSByZXR1cm4gY29sb3JzO1xuICAgIGNvbnN0IG91dDogVFtdID0gbmV3IEFycmF5KGluZGljZXMubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpKyspIG91dFtpXSA9IGNvbG9yc1tpbmRpY2VzW2ldXTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZHJhdyB0aGUgb2JzZXJ2YXRpb24gbWFya2VycyBvdmVyIGEgZnJlc2hseSByZW5kZXJlZCBpbWFnZS5cbiAgICpcbiAgICogVHdvIHJlYXNvbnMsIGJvdGggaW52aXNpYmxlIGZyb20gdGhlIHNwYXRpYWwgc3RvcmUg4oCUIHdoaWNoIGlzIHdoeSBhIHNjcnViIG9yIGFcbiAgICogcmUtcmVuZGVyIG5ldmVyIHJlYWNoZWQgdGhlIG1hcmtlcnMgb24gaXRzIG93bjpcbiAgICogIC0gdGhlIGltYWdlIHJlbmRlciBDTEVBUlMgdGhlIGxheWVyIGxpc3QsIHRha2luZyB0aGUgbWFya2VycyB3aXRoIGl0O1xuICAgKiAgLSBvdmVyIGEgdm9sdW1lLWJhY2tlZCBkYXRhc2V0IHRoZSBkaXNwbGF5ZWQgcGxhbmUgZGVjaWRlcyB3aGljaFxuICAgKiAgICBvYnNlcnZhdGlvbnMgYmVsb25nIG9uIHNjcmVlbiBhdCBhbGwsIHNvIHRoZSBjZWxscyBoYXZlIHRvIG1vdmUgd2l0aCB0aGVcbiAgICogICAgc2VjdGlvbiByYXRoZXIgdGhhbiBoYW5nIG92ZXIgYSBkaWZmZXJlbnQgb25lLlxuICAgKlxuICAgKiBVc2VzIHRoZSBsYXRlc3QgdmFsdWVzIHRoZSBtYXJrZXIgc3Vic2NyaXB0aW9uIHNhdzsgYSBuby1vcCB1bnRpbCBpdCBoYXMgc2VlblxuICAgKiBhbnksIGluIHRoZSAzRCBjbG91ZCAobm8gaW1hZ2UsIG5vIHBsYW5lKSwgYW5kIHdpdGggbm8gZGF0YXNldCB0byBkcmF3LlxuICAgKi9cbiAgcHJpdmF0ZSByZWRyYXdTcGF0aWFsTWFya2VycygpOiB2b2lkIHtcbiAgICBjb25zdCBsYXRlc3QgPSB0aGlzLnNwYXRpYWxMYXRlc3Q7XG4gICAgaWYgKCFsYXRlc3Q/LlswXSB8fCBpc1NwYXRpYWxPbWljczNkKHRoaXMuY3VycmVudFBsb3RUeXBlKSkgcmV0dXJuO1xuICAgIHZvaWQgdGhpcy5yZWJ1aWxkU3BhdGlhbFBvaW50cyguLi5sYXRlc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdW50IHRoZSBTUEFUSUFMX09NSUNTXzNEIHZpZXc6IG9ic2VydmF0aW9ucyBhcyBhIDNEIHBvaW50IGNsb3VkIHVuZGVyIHRoZSBvcmJpdCBjYW1lcmEuXG4gICAqXG4gICAqIERlbGliZXJhdGVseSBtdWNoIHRoaW5uZXIgdGhhbiB0aGUgMkQgbW91bnQuIFRoZXJlIGlzIG5vIHRpc3N1ZSBpbWFnZSB0byByZW5kZXIgKGEgcmVnaXN0ZXJlZFxuICAgKiB2b2x1bWUgbGlrZSB0aGUgQWxsZW4gQ0NGIGhhcyBubyBzaW5nbGUgcmVmZXJlbmNlIHBsYW5lKSwgc28gbm8gc2NhbGUgYmFyLCBubyByZWFkYmFjaywgYW5kIG5vXG4gICAqIDJEIGludGVyYWN0aW9uIHN0YWNrIOKAlCB0aGUgcmVnaW9uIHRvb2xzIGRyYXcgaW4gc2NyZWVuIHNwYWNlIGFuZCBoYXZlIG5vIG1lYW5pbmcgYWdhaW5zdCBhblxuICAgKiBvcmJpdGluZyBjYW1lcmEsIHdoaWNoIGlzIHdoeSBgU2VsZWN0IGZyb20gUk9Jc2AgaXMgaGlkZGVuIGluIHRoaXMgbW9kZS4gYGFkZFBvaW50czNEYCBwdXRzXG4gICAqIHRoZSB2aWV3ZXIgaW4gM0QgYW5kIGZyYW1lcyB0aGUgY2FtZXJhIG9uIHRoZSBjbG91ZCBpdHNlbGYuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG1vdW50U3BhdGlhbE9taWNzM2Qodmlld2VyOiBWaWV3ZXIsIGhvc3Q6IEhUTUxFbGVtZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5pbnN0YWxsM2RJbnRlcmFjdGlvbih2aWV3ZXIsIGhvc3QpO1xuICAgIHRoaXMuaW5zdGFsbFNwYXRpYWxIb3Zlcihob3N0KTtcbiAgICB0aGlzLnN1YnNjcmliZVNwYXRpYWwoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTY2FsZSBiYXIgZm9yIHRoZSAzRCBjbG91ZCwgbWVhc3VyZWQgYXQgdGhlIE9SQklUIFBJVk9ULlxuICAgKlxuICAgKiBBIHBlcnNwZWN0aXZlIGNhbWVyYSBoYXMgbm8gc2luZ2xlIHNjYWxlIOKAlCB0aGluZ3MgZmFydGhlciBhd2F5IGFyZSBzbWFsbGVyIOKAlCBzbyBhIGJhciBjYW5cbiAgICogb25seSBiZSB0cnVlIGF0IG9uZSBkZXB0aC4gVGhlIHBpdm90IGlzIHRoZSBob25lc3QgY2hvaWNlOiBpdCBpcyB3aGF0IHRoZSBjYW1lcmEgaXMgZnJhbWluZyxcbiAgICogd2hhdCBhIHpvb20gbW92ZXMgdG93YXJkcywgYW5kIHdoZXJlIHRoZSBleWUgaXMgYW55d2F5LiBuYXBhcmkncyBvd24gM0Qgc2NhbGUgYmFyIHdvcmtzIHRoZVxuICAgKiBzYW1lIHdheS5cbiAgICpcbiAgICogYE5hcGFyaVNjYWxlQmFyYCBuZWVkcyBDU1MgcHggcGVyIHdvcmxkIHVuaXQsIHdoaWNoIGFuIG9yYml0IGNhbWVyYSBkb2VzIG5vdCBleHBvc2UsIGJ1dCBhdFxuICAgKiB0aGUgcGl2b3QgaXQgaXMgZXhhY3RseSBgdmlld3BvcnRIZWlnaHQgLyAoMiAqIGRpc3RhbmNlICogdGFuKGZvdiAvIDIpKWAg4oCUIHRoZSBzYW1lXG4gICAqIHJlbGF0aW9uc2hpcCBgQ2FtZXJhM0QucGFuYCB1c2VzIHRvIHRyYWNrIHRoZSBjdXJzb3IuIFRoZSBiYXIgdGhlbiBjb252ZXJ0cyB0aHJvdWdoXG4gICAqIGBtaWNyb25zUGVyVW5pdGAsIGFuZCBkcmF3cyBub3RoaW5nIGF0IGFsbCB3aGVuIHRoZSBkYXRhc2V0IGRvZXMgbm90IGRlY2xhcmUgb25lLCBiZWNhdXNlIGFcbiAgICogYmFyIGxhYmVsbGVkIGluIG1pY3JvbnMgb3ZlciB1bmtub3duIHVuaXRzIHdvdWxkIHJlYWQgYXMgYSBtZWFzdXJlbWVudC5cbiAgICovXG4gIHByaXZhdGUgaW5zdGFsbFNwYXRpYWwzZFNjYWxlQmFyKHZpZXdlcjogVmlld2VyLCBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnNjYWxlQmFyPy5kZXN0cm95KCk7XG4gICAgdGhpcy5zY2FsZUJhciA9IG51bGw7XG4gICAgY29uc3QgbWljcm9uc1BlclVuaXQgPSBkYXRhc2V0Py5taWNyb25zUGVyVW5pdDtcbiAgICBpZiAoIXRoaXMuaG9zdCB8fCAhbWljcm9uc1BlclVuaXQgfHwgbWljcm9uc1BlclVuaXQgPD0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY2FudmFzID0gdGhpcy5jYW52YXM7XG4gICAgY29uc3QgY2FtID0gdmlld2VyLmNhbWVyYTNkO1xuICAgIGNvbnN0IHNoaW06IFNjYWxlQmFyQ2FtZXJhID0ge1xuICAgICAgZ2V0IHpvb20oKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgaCA9IGNhbnZhcz8uY2xpZW50SGVpZ2h0IHx8IGNhbnZhcz8uaGVpZ2h0IHx8IDA7XG4gICAgICAgIGNvbnN0IHdvcmxkUGVyUHggPSAoMiAqIGNhbS5kaXN0YW5jZSAqIE1hdGgudGFuKGNhbS5mb3YgLyAyKSkgLyAoaCB8fCAxKTtcbiAgICAgICAgcmV0dXJuIHdvcmxkUGVyUHggPiAwID8gMSAvIHdvcmxkUGVyUHggOiAwO1xuICAgICAgfSxcbiAgICAgIGNoYW5nZWQ6IGNhbS5jaGFuZ2VkLFxuICAgIH07XG4gICAgdGhpcy5zY2FsZUJhciA9IG5ldyBOYXBhcmlTY2FsZUJhcih0aGlzLmhvc3QsIHNoaW0sIG1pY3JvbnNQZXJVbml0KTtcbiAgfVxuXG4gIC8qKiBCYXNlIG1hcmtlciBkaWFtZXRlciBmb3IgdGhlIDNEIGNsb3VkLCBpbiBTQ1JFRU4gcGl4ZWxzICh0aGUgbGF5ZXIncyB1bml0KS4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU1BBVElBTF8zRF9CQVNFX1NJWkUgPSAzO1xuXG4gIC8qKiAoUmUpYnVpbGQgdGhlIDNEIHBvaW50IGNsb3VkIGZvciB0aGUgY3VycmVudCBkYXRhc2V0ICsgdmlldyBzdGF0ZS4gKi9cbiAgcHJpdmF0ZSBhc3luYyByZWJ1aWxkU3BhdGlhbFBvaW50czNkKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrID0gZW1wdHlTZWxlY3Rpb24oKSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgdmlld2VyID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2aWV3ZXIpIHJldHVybjtcbiAgICBjb25zdCB0b2tlbiA9ICsrdGhpcy5zcGF0aWFsUmVidWlsZFRva2VuO1xuXG4gICAgLy8gUmVzb2x2ZSB0aGUgc2NhbGFyIGVuY29kaW5nIEJFRk9SRSB0b3VjaGluZyB0aGUgc2NlbmUsIGZvciB0aGUgc2FtZSByZWFzb25cbiAgICAvLyB0aGUgMkQgcGF0aCBkb2VzOiBhIGdlbmUgZmV0Y2ggY2FuIGZhaWwgb3IgYmUgc3VwZXJzZWRlZCwgYW5kIGRyb3BwaW5nIHRoZVxuICAgIC8vIGxheWVyIGZpcnN0IHdvdWxkIGJsYW5rIHRoZSB2aWV3LlxuICAgIGxldCBlbmM6IFNwYXRpYWwzZEVuY29kaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKGRhdGFzZXQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGVuYyA9IGF3YWl0IHRoaXMuc3BhdGlhbFNjYWxhcjNkKGRhdGFzZXQsIHZpZXcpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gc3BhdGlhbCAzRCBjb2xvdXJpbmcgZmFpbGVkIOKAlCBmYWxsaW5nIGJhY2sgdG8gYSBmbGF0IGNvbG91cicsIGVycik7XG4gICAgICAgIGVuYyA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0b2tlbiAhPT0gdGhpcy5zcGF0aWFsUmVidWlsZFRva2VuIHx8IHRoaXMudmlld2VyICE9PSB2aWV3ZXIpIHJldHVybjtcblxuICAgIGNvbnN0IG9icyA9IGRhdGFzZXQ/Lm9ic2VydmF0aW9ucztcbiAgICAvLyBObyB6IG1lYW5zIG5vdGhpbmcgdG8gZHJhdyBpbiAzRC4gVGhlIHBsb3QgdHlwZSBpcyBnYXRlZCBvbiBgcmVxdWlyZXNTcGF0aWFsM2RgXG4gICAgLy8gc28gdGhpcyBzaG91bGQgYmUgdW5yZWFjaGFibGUgZnJvbSB0aGUgVUksIGJ1dCBhIGhvc3QgY2FuIHNldCB0aGUgdHlwZSBkaXJlY3RseS5cbiAgICBpZiAoIWRhdGFzZXQgfHwgIW9icyB8fCBvYnMuY291bnQgPT09IDAgfHwgIW9icy56KSB7XG4gICAgICB0aGlzLnJlbW92ZVNwYXRpYWwzZExheWVycyh2aWV3ZXIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFuYXRvbXkgZmlyc3Q6IG9uIGEgc2NlbmUncyBGSVJTVCBsYXllciBuYXBhcmkgZnJhbWVzIHRoZSBvcmJpdCBjYW1lcmEsIGFuZFxuICAgIC8vIHRoZSByZWZlcmVuY2Ugdm9sdW1lIGlzIHRoZSBmcmFtaW5nIHdlIHdhbnQg4oCUIHRoZSBicmFpbiwgbm90IHRoZSBvdXRlcm1vc3RcbiAgICAvLyBzdHJheSBzZWdtZW50YXRpb24uIEV2ZXJ5IGxhdGVyIGFkZCBrZWVwcyB0aGUgcG9zZSBpbnN0ZWFkIChuYXBhcmktanMgYGZpdDNkOiAnb25jZSdgKS5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZVNwYXRpYWxWb2x1bWUodmlld2VyLCBkYXRhc2V0LCB2aWV3KTtcbiAgICBpZiAodG9rZW4gIT09IHRoaXMuc3BhdGlhbFJlYnVpbGRUb2tlbiB8fCB0aGlzLnZpZXdlciAhPT0gdmlld2VyKSByZXR1cm47XG4gICAgLy8gVGhlbiB0aGUgY2x1c3RlciBkZW5zaXR5IHZvbHVtZXMsIHdoaWNoIGNhbiBzZXQgdGhlIGNlbnRyaW5nIG9mZnNldCB3aGVuXG4gICAgLy8gdGhlcmUgaXMgbm8gcmVmZXJlbmNlIHZvbHVtZSDigJQgc28gYmVmb3JlIGFueSBwb3NpdGlvbiBpcyBjb21wdXRlZCBmcm9tIGl0LlxuICAgIGF3YWl0IHRoaXMuZW5zdXJlRGVuc2l0eVZvbHVtZXModmlld2VyLCBkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24pO1xuICAgIGlmICh0b2tlbiAhPT0gdGhpcy5zcGF0aWFsUmVidWlsZFRva2VuIHx8IHRoaXMudmlld2VyICE9PSB2aWV3ZXIpIHJldHVybjtcbiAgICAvLyBUaGVuIHRoZSBnZW5lIG1hcCwgd2hpY2ggc2hhcmVzIHRoZSByZWZlcmVuY2Ugdm9sdW1lJ3MgbGF0dGljZSDigJQgc28gaXQgZ29lc1xuICAgIC8vIGFmdGVyIGFueXRoaW5nIHRoYXQgY2FuIHN0aWxsIG1vdmUgdGhlIGNlbnRyaW5nIG9mZnNldC5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZUdlbmVNYXBWb2x1bWUodmlld2VyLCBkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24pO1xuICAgIGlmICh0b2tlbiAhPT0gdGhpcy5zcGF0aWFsUmVidWlsZFRva2VuIHx8IHRoaXMudmlld2VyICE9PSB2aWV3ZXIpIHJldHVybjtcbiAgICAvLyBTY2FsZSBkZXBlbmRzIG9uIHRoZSBkYXRhc2V0J3MgZGVjbGFyZWQgdW5pdCwgc28gaXQgd2FpdHMgZm9yIHRoZSBkYXRhc2V0XG4gICAgLy8gcmF0aGVyIHRoYW4gYmVpbmcgc2V0IHVwIGF0IG1vdW50IHRpbWUuXG4gICAgaWYgKGRhdGFzZXQuaWQgIT09IHRoaXMuc3BhdGlhbFNjYWxlQmFyS2V5KSB7XG4gICAgICB0aGlzLnNwYXRpYWxTY2FsZUJhcktleSA9IGRhdGFzZXQuaWQ7XG4gICAgICB0aGlzLmluc3RhbGxTcGF0aWFsM2RTY2FsZUJhcih2aWV3ZXIsIGRhdGFzZXQpO1xuICAgIH1cblxuICAgIC8vIFRoZSByZWZlcmVuY2Ugdm9sdW1lIGlzIGhpZGRlbiwgbm90IHJlbW92ZWQ6IGl0IGFsc28gZml4ZXMgdGhlIGNlbnRyaW5nXG4gICAgLy8gb2Zmc2V0IGV2ZXJ5IHBvc2l0aW9uIGlzIGNvbXB1dGVkIGZyb20sIGFuZCByZS1mZXRjaGluZyBhIDEwMCBNQiB0ZW1wbGF0ZVxuICAgIC8vIHRvIHVuLWhpZGUgaXQgd291bGQgbWFrZSBhIGNoZWNrYm94IGZlZWwgbGlrZSBhIGxvYWQuXG4gICAgaWYgKHRoaXMuc3BhdGlhbFZvbHVtZSkge1xuICAgICAgdGhpcy5zcGF0aWFsVm9sdW1lLnZpc2libGUgPSB2aWV3LnNob3dWb2x1bWU7XG4gICAgICB0aGlzLnNwYXRpYWxWb2x1bWUub3BhY2l0eSA9IHZpZXcudm9sdW1lT3BhY2l0eTtcbiAgICB9XG5cbiAgICBjb25zdCBzY2FsZSA9IHZpZXcucG9pbnRTY2FsZSA+IDAgPyB2aWV3LnBvaW50U2NhbGUgOiAxO1xuICAgIGNvbnN0IHNpemUgPSBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5TUEFUSUFMXzNEX0JBU0VfU0laRSAqIHNjYWxlO1xuICAgIGNvbnN0IHNjYWxhcnMgPSBlbmM/LnZhbHVlcyA/PyBuZXcgRmxvYXQzMkFycmF5KG9icy5jb3VudCk7XG4gICAgY29uc3QgY29sb3JtYXAgPSBlbmM/LmNvbG9ybWFwID8/IHRoaXMuc3BhdGlhbEZsYXRDb2xvcm1hcCgpO1xuICAgIGNvbnN0IGNvbnRyYXN0TGltaXRzOiBbbnVtYmVyLCBudW1iZXJdID0gZW5jPy5jb250cmFzdExpbWl0cyA/PyBbMCwgMV07XG5cbiAgICAvLyBPbmUgaW1hZ2VkIHNlY3Rpb24sIG9yIHRoZSB3aG9sZSBzdGFjay4gVGhlIHN1YnNldCBJUyB0aGUgZ2VvbWV0cnksIHNvIGl0XG4gICAgLy8gYmVsb25ncyBpbiB0aGUgZ2VvbWV0cnkga2V5IHJhdGhlciB0aGFuIGJlaW5nIHJlLWRlcml2ZWQgcGVyIGZyYW1lIOKAlCBhbmQgYW5cbiAgICAvLyBvdXQtb2YtcmFuZ2UgaW5kZXggaXMgY2xhbXBlZCByYXRoZXIgdGhhbiBkcm9wcGluZyB0aGUgY2xvdWQsIGJlY2F1c2UgdGhlXG4gICAgLy8gc2VjdGlvbiBjb3VudCBjaGFuZ2VzIHdpdGggdGhlIGRhdGFzZXQgd2hpbGUgdGhlIHZpZXcgc3RhdGUgcGVyc2lzdHMuXG4gICAgY29uc3Qgc2VjdGlvbnMgPSBzZWN0aW9uc09mKG9icyk7XG4gICAgY29uc3Qgc2VjdGlvbiA9XG4gICAgICB2aWV3LnBvaW50U2VjdGlvbiAhPSBudWxsICYmIHNlY3Rpb25zICYmIHNlY3Rpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgPyBzZWN0aW9uc1tNYXRoLm1heCgwLCBNYXRoLm1pbihzZWN0aW9ucy5sZW5ndGggLSAxLCB2aWV3LnBvaW50U2VjdGlvbikpXVxuICAgICAgICA6IG51bGw7XG4gICAgY29uc3Qgc2hvd24gPSBzZWN0aW9uICE9IG51bGwgPyBvYnNlcnZhdGlvbnNJblNlY3Rpb24ob2JzLCBzZWN0aW9uKSA6IG51bGw7XG4gICAgY29uc3Qgc2hvd25Db3VudCA9IHNob3duID8gc2hvd24ubGVuZ3RoIDogb2JzLmNvdW50O1xuXG4gICAgY29uc3Qga2V5ID0gYCR7ZGF0YXNldC5pZH06JHtvYnMuY291bnR9OiR7c2VjdGlvbiA/PyAnYWxsJ31gO1xuICAgIC8vIGBQb2ludHMzRExheWVyLnZhbHVlc2AgaXMgcmVhZG9ubHkgYW5kIHRoZSBsYXllciBleHBvc2VzIG5vIGRhdGFWZXJzaW9uIHRvXG4gICAgLy8gYnVtcCwgc28gdW5saWtlIHRoZSAyRCBwYXRoIGEgY2hhbmdlIG9mIGNvbG91ciBTT1VSQ0UgY2Fubm90IGJlIG11dGF0ZWQgaW5cbiAgICAvLyDigJQgdGhlIGxheWVyIGhhcyB0byBiZSByZWJ1aWx0LiBPbmx5IHRoZSBzaXplL29wYWNpdHkvY29sb3JtYXAga25vYnMgYXJlXG4gICAgLy8gZ2VudWluZWx5IGRpc3BsYXktb25seS4gU28gdHJhY2sgdGhlIHNjYWxhcnMnIGlkZW50aXR5IHNlcGFyYXRlbHkgZnJvbSB0aGVcbiAgICAvLyBnZW9tZXRyeSdzOiBgY29sb3JCeWAgcGx1cyB0aGUgdHJhbnNmb3JtcyBmZWVkaW5nIHRoZSBlbmNvZGluZy5cbiAgICBjb25zdCBjbGlwID0gdmlldy5wZXJjZW50aWxlQ2xpcCA/PyBbMC4wMSwgMC45OV07XG4gICAgY29uc3Qgc2NhbGFyS2V5ID0gW1xuICAgICAga2V5LFxuICAgICAgdmlldy5jb2xvckJ5ID8gYCR7dmlldy5jb2xvckJ5LmtpbmR9OiR7dmlldy5jb2xvckJ5Lm5hbWV9YCA6ICdmbGF0JyxcbiAgICAgIHZpZXcubG9nU2NhbGUgPyAnbG9nJyA6ICdsaW4nLFxuICAgICAgY2xpcC5qb2luKCcsJyksXG4gICAgXS5qb2luKCd8Jyk7XG5cbiAgICBpZiAoa2V5ICE9PSB0aGlzLnNwYXRpYWxMYXllcktleTNkKSB7XG4gICAgICAvLyBOZXcgZ2VvbWV0cnk6IGludGVybGVhdmUgeCx5LHogKHRoZSBsYXllcidzIGRvY3VtZW50ZWQgbGF5b3V0LCB4LWZhc3Rlc3QpXG4gICAgICAvLyBhbmQgY2FjaGUgaXQsIHNvIGxhdGVyIGNvbG91ciBjaGFuZ2VzIHJlYnVpbGQgdGhlIGxheWVyIHdpdGhvdXQgd2Fsa2luZ1xuICAgICAgLy8gdGhlIG9ic2VydmF0aW9ucyBhZ2Fpbi5cbiAgICAgIGNvbnN0IFtveCwgb3ksIG96XSA9IHRoaXMuc3BhdGlhbE9yaWdpbjNkO1xuICAgICAgY29uc3QgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJBcnJheShzaG93bkNvdW50ICogMyk7XG4gICAgICBmb3IgKGxldCBrID0gMDsgayA8IHNob3duQ291bnQ7IGsrKykge1xuICAgICAgICBjb25zdCBpID0gc2hvd24gPyBzaG93bltrXSA6IGs7XG4gICAgICAgIHBvc2l0aW9uc1trICogM10gPSBvYnMueFtpXSArIG94O1xuICAgICAgICBwb3NpdGlvbnNbayAqIDMgKyAxXSA9IG9icy55W2ldICsgb3k7XG4gICAgICAgIHBvc2l0aW9uc1trICogMyArIDJdID0gb2JzLnpbaV0gKyBvejtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3BhdGlhbFBvc2l0aW9uczNkID0gcG9zaXRpb25zO1xuICAgICAgdGhpcy5zcGF0aWFsRHJhd24zZCA9IHNob3duO1xuICAgIH1cblxuICAgIC8vIFRoZSBzY2FsYXJzIGhhdmUgdG8gZm9sbG93IHRoZSBnZW9tZXRyeTogYSBwZXItb2JzZXJ2YXRpb24gdmVjdG9yIGFnYWluc3Qgb25lXG4gICAgLy8gc2VjdGlvbidzIHBvc2l0aW9ucyB3b3VsZCBjb2xvdXIgZWFjaCBjZWxsIGJ5IGEgc3RyYW5nZXIncyB2YWx1ZS5cbiAgICBjb25zdCB2YWx1ZXNGb3IgPSAoKSA9PiAoc2hvd24gPyBGbG9hdDMyQXJyYXkuZnJvbShzaG93biwgKGkpID0+IHNjYWxhcnNbaV0pIDogc2NhbGFycyk7XG5cbiAgICBpZiAoIXRoaXMuc3BhdGlhbFBvaW50czNkIHx8IGtleSAhPT0gdGhpcy5zcGF0aWFsTGF5ZXJLZXkzZCkge1xuICAgICAgLy8gTmV3IEdFT01FVFJZIOKAlCBhIGRpZmZlcmVudCBkYXRhc2V0LCBvciBhIGRpZmZlcmVudCBzZWN0aW9uIOKAlCBzbyBhIG5ldyBsYXllci5cbiAgICAgIGlmICh0aGlzLnNwYXRpYWxQb2ludHMzZCkgdmlld2VyLmxheWVycy5yZW1vdmUodGhpcy5zcGF0aWFsUG9pbnRzM2QpO1xuICAgICAgdGhpcy5zcGF0aWFsTGF5ZXJLZXkzZCA9IGtleTtcbiAgICAgIHRoaXMuc3BhdGlhbFNjYWxhcktleTNkID0gc2NhbGFyS2V5O1xuICAgICAgdGhpcy5zcGF0aWFsUG9pbnRzM2QgPSB2aWV3ZXIuYWRkUG9pbnRzM0QodGhpcy5zcGF0aWFsUG9zaXRpb25zM2QhLCB2YWx1ZXNGb3IoKSwge1xuICAgICAgICBuYW1lOiAnb2JzZXJ2YXRpb25zJyxcbiAgICAgICAgY29sb3JtYXAsXG4gICAgICAgIGNvbnRyYXN0TGltaXRzLFxuICAgICAgICBzaXplLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzY2FsYXJLZXkgIT09IHRoaXMuc3BhdGlhbFNjYWxhcktleTNkKSB7XG4gICAgICAgIC8vIEEgY2hhbmdlIG9mIGNvbG91ciBTT1VSQ0UsIHdoaWNoIHVzZWQgdG8gbWVhbiBkaXNjYXJkaW5nIHRoZSBsYXllciBhbmQgYnVpbGRpbmdcbiAgICAgICAgLy8gYW5vdGhlciDigJQgYW5kLCBiZWNhdXNlIGFkZGluZyBhIDNEIGxheWVyIHJlZnJhbWVzLCBhIGNhbWVyYSBqdW1wIHRvIHVuZG8gYXMgd2VsbC5cbiAgICAgICAgLy8gbmFwYXJpLWpzIOKJpSAwLjE0IGxldHMgdGhlIHNjYWxhcnMgYmUgcmVwbGFjZWQgaW4gcGxhY2Ug4oCUIHRoZSBzZXR0ZXIgYnVtcHMgdGhlXG4gICAgICAgIC8vIGxheWVyJ3MgZGF0YVZlcnNpb24gc28gdGhlIHZpc3VhbCByZS11cGxvYWRzIOKAlCBhbmQgdGhlIHBvc2l0aW9ucyBoYXZlIG5vdCBtb3ZlZCxcbiAgICAgICAgLy8gc28gdGhlcmUgaXMgbm90aGluZyBmb3IgdGhlIGNhbWVyYSB0byByZWZyYW1lLlxuICAgICAgICB0aGlzLnNwYXRpYWxTY2FsYXJLZXkzZCA9IHNjYWxhcktleTtcbiAgICAgICAgdGhpcy5zcGF0aWFsUG9pbnRzM2QudmFsdWVzID0gdmFsdWVzRm9yKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNwYXRpYWxQb2ludHMzZC5jb2xvcm1hcCA9IGNvbG9ybWFwO1xuICAgICAgdGhpcy5zcGF0aWFsUG9pbnRzM2QuY29udHJhc3RMaW1pdHMgPSBjb250cmFzdExpbWl0cztcbiAgICAgIHRoaXMuc3BhdGlhbFBvaW50czNkLnNpemUgPSBzaXplO1xuICAgIH1cblxuICAgIC8vIFNlbGVjdGlvbiBpcyBhIFBFUi1QT0lOVCBhbHBoYSwgaW4gdGhlIG9uZSBsYXllci5cbiAgICAvL1xuICAgIC8vIEl0IHVzZWQgdG8gYmUgYSBzZWNvbmQgbGF5ZXI6IHdpdGggYSBzaW5nbGUgb3BhY2l0eSBmb3IgdGhlIHdob2xlIGNsb3VkLCB0aGUgb25seSB3YXlcbiAgICAvLyB0byBoaWdobGlnaHQgYSBzdWJzZXQgd2FzIHRvIGRyYXcgaXQgYWdhaW4gb24gdG9wIGF0IGZ1bGwgb3BhY2l0eSB3aGlsZSB0aGUgcGFyZW50XG4gICAgLy8gZHJvcHBlZCB0byB0aGUgbXV0ZWQgbGV2ZWwuIFRoYXQgc2Vjb25kIGxheWVyIGhhZCB0byBiZSBrZXB0IGluIHN0ZXAgdGhyb3VnaCBldmVyeVxuICAgIC8vIGNvbG9ybWFwLCB3aW5kb3cgYW5kIHNpemUgY2hhbmdlLCBhbmQgdGhlIHR3byB0aGVuIGRlcHRoLXNvcnRlZCBhZ2FpbnN0IGVhY2ggb3RoZXIgYXNcbiAgICAvLyBzZXBhcmF0ZSBkcmF3cy4gUGVyLXBvaW50IGFscGhhcyBhbmQgc2l6ZXMgZ2l2ZSB0aGUgc2FtZSByZWFkaW5nIOKAlCBtdXRlZCBjbG91ZCwgYnJpZ2h0XG4gICAgLy8gc2VsZWN0aW9uLCBzbGlnaHRseSBsYXJnZXIgc28gYSBzbWFsbCBvbmUgaXMgZmluZGFibGUgaW5zaWRlIDMuN00gcG9pbnRzIOKAlCBpbiBvbmUuXG4gICAgY29uc3QgaGFzU2VsZWN0aW9uID0gc2VsZWN0aW9uLmNvdW50ID4gMCAmJiBzZWxlY3Rpb24ubWFzay5sZW5ndGggPT09IG9icy5jb3VudDtcbiAgICBjb25zdCBjbG91ZCA9IHRoaXMuc3BhdGlhbFBvaW50czNkO1xuICAgIGlmIChjbG91ZCkge1xuICAgICAgY2xvdWQub3BhY2l0eSA9IHZpZXcub3BhY2l0eTtcbiAgICAgIGlmICghaGFzU2VsZWN0aW9uKSB7XG4gICAgICAgIGNsb3VkLmFscGhhcyA9IG51bGw7XG4gICAgICAgIGNsb3VkLnNpemVzID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGFscGhhcyA9IG5ldyBGbG9hdDMyQXJyYXkoc2hvd25Db3VudCk7XG4gICAgICAgIGNvbnN0IHNpemVzID0gbmV3IEZsb2F0MzJBcnJheShzaG93bkNvdW50KTtcbiAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBzaG93bkNvdW50OyBrKyspIHtcbiAgICAgICAgICBjb25zdCBpID0gc2hvd24gPyBzaG93bltrXSA6IGs7XG4gICAgICAgICAgY29uc3QgcGlja2VkID0gISFzZWxlY3Rpb24ubWFza1tpXTtcbiAgICAgICAgICBhbHBoYXNba10gPSBwaWNrZWQgPyAxIDogREVGQVVMVF9NVVRFRF9PUEFDSVRZO1xuICAgICAgICAgIHNpemVzW2tdID0gcGlja2VkID8gTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuU1BBVElBTF9TRUxFQ1RFRF9TSVpFX1NDQUxFIDogMTtcbiAgICAgICAgfVxuICAgICAgICBjbG91ZC5hbHBoYXMgPSBhbHBoYXM7XG4gICAgICAgIGNsb3VkLnNpemVzID0gc2l6ZXM7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIExhc3QsIHNvIGl0IGFsc28gY292ZXJzIGEgbGF5ZXIgdGhpcyBwYXNzIGp1c3QgY3JlYXRlZC5cbiAgICBpZiAodGhpcy5zcGF0aWFsUG9pbnRzM2QpIHRoaXMuc3BhdGlhbFBvaW50czNkLnZpc2libGUgPSB2aWV3LnNob3dQb2ludHM7XG4gICAgdmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgKiozRCBnZW5lIG1hcCoqOiB0aGUgYWN0aXZlIGdlbmUncyBleHByZXNzaW9uIG92ZXIgdGhlIHdob2xlIHNlY3Rpb25lZFxuICAgKiBzcGVjaW1lbiwgYXMgb25lIHJheW1hcmNoZWQgdm9sdW1lLlxuICAgKlxuICAgKiBUd28gdGhpbmdzIGl0IGNhbiBiZSwgYW5kIHRoZSBwYW5lbCdzIGBWb2x1bWUgcmVuZGVyaW5nYCB0b2dnbGUgcGlja3Mgd2hpY2g6XG4gICAqXG4gICAqICAtICoqc2hlZXRzKiog4oCUIGV4YWN0bHkgdGhlIHBsYW5lcyB0aGF0IHdlcmUgaW1hZ2VkLCBlYWNoIGNhcnJ5aW5nIHRoYXRcbiAgICogICAgc2xpZGUncyBvd24gMkQgZ2VuZSBtYXAsIHdpdGggdGhlIGdhcHMgYmV0d2VlbiBzZWN0aW9ucyBlbXB0eS4gQSBzdGFjayBvZlxuICAgKiAgICBtZWFzdXJlZCBmaWVsZHMsIGF0IHRoZWlyIHRydWUgei5cbiAgICogIC0gKip2b2x1bWUqKiDigJQgdGhlIHNhbWUgZmllbGRzIHNtb290aGVkIGFsb25nIHosIHNvIHRoZSBwbGFuZXMgYmV0d2VlbiB0aGVcbiAgICogICAgc2VjdGlvbnMgY2FycnkgYW4gaW50ZXJwb2xhdGVkIHZhbHVlLiBBbiBlc3RpbWF0ZSwgYW5kIGRyYXduIGFzIGFcbiAgICogICAgdHJhbnNsdWNlbnQgY2xvdWQgZm9yIHRoZSBzYW1lIHJlYXNvbiB0aGUgZGVuc2l0eSB2b2x1bWVzIGFyZS5cbiAgICpcbiAgICogT25lIGBWb2x1bWVMYXllcmAgcmF0aGVyIHRoYW4gYSB0ZXh0dXJlZCBxdWFkIHBlciBzZWN0aW9uOiBhbiBgSW1hZ2VMYXllcmBcbiAgICogcmVuZGVycyBvbmx5IGF0IGBuZGlzcGxheSA9PT0gMmAsIHNvIDUzIHNoZWV0cyBpbiB0aGUgb3JiaXQgdmlldyB3b3VsZCBuZWVkIGFcbiAgICogbmV3IGxheWVyIHR5cGUgdXBzdHJlYW0g4oCUIHdoaWxlIGEgc2NhbGFyIHZvbHVtZSB3aG9zZSB6IHNhbXBsaW5nIGFscmVhZHkgSVNcbiAgICogdGhlIHNlY3Rpb24gc3BhY2luZyBleHByZXNzZXMgdGhlIHNoZWV0cyBleGFjdGx5LCBhbmQgdGhlIHNhbWUgbGF0dGljZSB0aGVuXG4gICAqIGdpdmVzIHRoZSBpbnRlcnBvbGF0ZWQgdmVyc2lvbiBmb3IgZnJlZS5cbiAgICpcbiAgICogRXN0aW1hdGVkIG9uIHRoZSByZWZlcmVuY2Ugdm9sdW1lJ3Mgb3duIGxhdHRpY2UgKGBkZW5zaXR5R3JpZGAgYXQgc3RyaWRlIDEpLFxuICAgKiBzbyB0aGUgZmllbGQgbGFuZHMgdm94ZWwtZm9yLXZveGVsIG9uIHRoZSBhbmF0b215IGFuZCBuZWVkcyBubyBvZmZzZXQg4oCUIGFcbiAgICogYFZvbHVtZUxheWVyYCBoYXMgbm8gdHJhbnNsYXRlLCBhbmQgbmFwYXJpIGNlbnRyZXMgYm90aCBib3hlcyBvbiB0aGUgd29ybGRcbiAgICogb3JpZ2luLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVHZW5lTWFwVm9sdW1lKFxuICAgIHZpZXdlcjogVmlld2VyLCBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBnZW5lID0gdmlldy5nZW5lTWFwICYmIHZpZXcuY29sb3JCeT8ua2luZCA9PT0gJ2ZlYXR1cmUnID8gdmlldy5jb2xvckJ5Lm5hbWUgOiBudWxsO1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnNwYXRpYWxEYXRhO1xuICAgIGNvbnN0IHNtb290aGluZyA9IHZpZXcuZ2VuZU1hcFNtb290aGluZyA+IDAgPyB2aWV3LmdlbmVNYXBTbW9vdGhpbmcgOiAxO1xuICAgIGNvbnN0IGNsaXAgPSB2aWV3LnBlcmNlbnRpbGVDbGlwID8/IFswLjAxLCAwLjk5XTtcbiAgICBjb25zdCBvYnMgPSBkYXRhc2V0Lm9ic2VydmF0aW9ucztcbiAgICAvLyBBIHZvbHVtZSBidWlsdCBmcm9tIE9ORSBzZWN0aW9uIHdvdWxkIHNtZWFyIHRoYXQgc2xpZGUgdGhyb3VnaCB0aGUgd2hvbGVcbiAgICAvLyBkZXB0aCwgc28gdGhlIHNlY3Rpb24gcmVzdHJpY3Rpb24gb25seSBhcHBsaWVzIHRvIHRoZSBzaGVldHMuXG4gICAgY29uc3QgaW50ZXJwb2xhdGUgPSAhIXZpZXcuZ2VuZU1hcFZvbHVtZTtcbiAgICBjb25zdCBzZWN0aW9ucyA9IHNlY3Rpb25zT2Yob2JzKTtcbiAgICBjb25zdCBzZWN0aW9uID1cbiAgICAgICFpbnRlcnBvbGF0ZSAmJiB2aWV3LmdlbmVNYXBTZWN0aW9uICE9IG51bGwgJiYgc2VjdGlvbnMgJiYgc2VjdGlvbnMubGVuZ3RoID4gMFxuICAgICAgICA/IHNlY3Rpb25zW01hdGgubWF4KDAsIE1hdGgubWluKHNlY3Rpb25zLmxlbmd0aCAtIDEsIHZpZXcuZ2VuZU1hcFNlY3Rpb24pKV1cbiAgICAgICAgOiBudWxsO1xuXG4gICAgY29uc3QgZmllbGRLZXkgPSBnZW5lXG4gICAgICA/IFtcbiAgICAgICAgZGF0YXNldC5pZCwgZ2VuZSwgc21vb3RoaW5nLCBzZWN0aW9uID8/ICdhbGwnLCBpbnRlcnBvbGF0ZSA/ICd2b2wnIDogJ3NoZWV0cycsXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uUmV2KHNlbGVjdGlvbiksXG4gICAgICBdLmpvaW4oJ3wnKVxuICAgICAgOiBudWxsO1xuICAgIGNvbnN0IGtleSA9IGZpZWxkS2V5XG4gICAgICA/IFtcbiAgICAgICAgZmllbGRLZXksIGNsaXAuam9pbignLCcpLCB2aWV3LmxvZ1NjYWxlID8gJ2xvZycgOiAnbGluJywgdmlldy5nZW5lTWFwT3BhY2l0eSxcbiAgICAgICAgdGhpcy5jb250aW51b3VzQ29sb3JtYXBLZXkodmlldyksXG4gICAgICBdLmpvaW4oJ3wnKVxuICAgICAgOiBudWxsO1xuICAgIGlmIChrZXkgPT09IHRoaXMuZ2VuZU1hcFZvbHVtZUtleSkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuZ2VuZU1hcFZvbHVtZUxheWVyKSB7XG4gICAgICB2aWV3ZXIubGF5ZXJzLnJlbW92ZSh0aGlzLmdlbmVNYXBWb2x1bWVMYXllcik7XG4gICAgICB0aGlzLmdlbmVNYXBWb2x1bWVMYXllciA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuZ2VuZU1hcFZvbHVtZUtleSA9IGtleTtcbiAgICBpZiAoIWtleSB8fCAhZ2VuZSB8fCAhcG9ydCkge1xuICAgICAgdGhpcy5nZW5lTWFwVm9sdW1lRmllbGQgPSBudWxsO1xuICAgICAgdGhpcy5nZW5lTWFwVm9sdW1lRmllbGRLZXkgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENvYXJzZW5lZCBpbi1wbGFuZSBidXQgTk9UIGFsb25nIHo6IHRoZSBzaGVldHMgbmVlZCBvbmUgcGxhbmUgcGVyIGltYWdlZFxuICAgIC8vIHNlY3Rpb24sIHdoaWxlIHRoZSBmaWVsZCB0aGV5IGNhcnJ5IGlzIHNtb290aCBieSBjb25zdHJ1Y3Rpb24gYW5kIGdhaW5zXG4gICAgLy8gbm90aGluZyBmcm9tIHRoZSB0ZW1wbGF0ZSdzIDQwIMK1bSBkZXRhaWwuIEF0IGZ1bGwgcmVzb2x1dGlvbiB0aGUgZXN0aW1hdGUgaXNcbiAgICAvLyBhIDUuN00tdm94ZWwgcGFpciBvZiBibHVycyBvbiB0aGUgbWFpbiB0aHJlYWQg4oCUIHNlY29uZHMgb2YgZnJvemVuIFVJIGZvciBhXG4gICAgLy8gY2hlY2tib3g7IGFuIGVpZ2h0aCBvZiB0aGUgdm94ZWxzIGlzIGFuIGVpZ2h0aCBvZiB0aGUgd29yay5cbiAgICBjb25zdCBncmlkID0gZGVuc2l0eUdyaWQoZGF0YXNldCwgR0VORV9NQVBfVk9MVU1FX1NUUklERSwgMTI4LCAxKTtcbiAgICBpZiAoIWdyaWQpIHJldHVybjtcblxuICAgIGlmIChmaWVsZEtleSAhPT0gdGhpcy5nZW5lTWFwVm9sdW1lRmllbGRLZXkpIHtcbiAgICAgIGxldCB2YWx1ZXM6IEZsb2F0MzJBcnJheTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbHVlcyA9IGF3YWl0IHBvcnQuZ2V0RmVhdHVyZVZlY3RvcihnZW5lKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLndhcm4oYFtuYXBhcmktanNdIDNEIGdlbmUgbWFwOiBcIiR7Z2VuZX1cIiB1bmF2YWlsYWJsZWAsIGVycik7XG4gICAgICAgIHRoaXMuZ2VuZU1hcFZvbHVtZUtleSA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnZpZXdlciAhPT0gdmlld2VyIHx8IHRoaXMuZ2VuZU1hcFZvbHVtZUtleSAhPT0ga2V5KSByZXR1cm47XG4gICAgICBjb25zdCBpblNlbGVjdGlvbiA9IHNlbGVjdGlvbi5jb3VudCA+IDAgPyBtYXNrVG9JbmRpY2VzKHNlbGVjdGlvbi5tYXNrKSA6IHVuZGVmaW5lZDtcbiAgICAgIC8vIEluLXBsYW5lIGJhbmR3aWR0aCBpcyB0aGUgMkQgbWFwJ3MsIGluIHRoaXMgbGF0dGljZSdzIHVuaXRzLCBzbyBhIHNoZWV0XG4gICAgICAvLyBhbmQgdGhlIDJEIHZpZXcgb2YgdGhlIHNhbWUgc2VjdGlvbiBhcmUgdGhlIHNhbWUgZmllbGQuIEFsb25nIHogaXQgaXMgdGhlXG4gICAgICAvLyBkZW5zaXR5IHBhdGgncyAxLjUgdm94ZWxzIOKAlCB0aGUgc21hbGxlc3Qgz4MgdGhhdCBicmlkZ2VzIG9uZSBzZWN0aW9uIGdhcC5cbiAgICAgIC8vIEluLXBsYW5lIM+DIGlzIGEgUEhZU0lDQUwgYmFuZHdpZHRoLCBhbmNob3JlZCB0byB0aGUgcmVmZXJlbmNlIHZvbHVtZSdzIG93blxuICAgICAgLy8gdm94ZWwg4oCUIHRoZSByZXNvbHV0aW9uIHRoZSAyRCBtYXAgZXN0aW1hdGVzIGF0IOKAlCBzbyBhIHNoZWV0IGFuZCB0aGUgMkRcbiAgICAgIC8vIHZpZXcgb2YgdGhlIHNhbWUgc2VjdGlvbiBhcmUgdGhlIHNhbWUgZmllbGQgd2hhdGV2ZXIgbGF0dGljZSB0aGlzIGlzXG4gICAgICAvLyByYXN0ZXJpc2VkIG9uLiBBbG9uZyB6IGl0IGlzIHRoZSBkZW5zaXR5IHBhdGgncyAxLjUgdm94ZWxzOiB0aGUgc21hbGxlc3Qgz4NcbiAgICAgIC8vIHRoYXQgYnJpZGdlcyBvbmUgc2VjdGlvbiBnYXAuXG4gICAgICBjb25zdCBpblBsYW5lID0gZGF0YXNldC52b2x1bWU/LnZveGVsU2l6ZSA/PyBncmlkLnZveGVsU2l6ZTtcbiAgICAgIHRoaXMuZ2VuZU1hcFZvbHVtZUZpZWxkID0gZXhwcmVzc2lvblZvbHVtZShvYnMsIGdyaWQsIHtcbiAgICAgICAgc2lnbWE6IFtcbiAgICAgICAgICBpblBsYW5lWzBdICogTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuR0VORV9NQVBfU0lHTUEgKiBzbW9vdGhpbmcsXG4gICAgICAgICAgaW5QbGFuZVsxXSAqIE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLkdFTkVfTUFQX1NJR01BICogc21vb3RoaW5nLFxuICAgICAgICAgIGdyaWQudm94ZWxTaXplWzJdICogMS41ICogc21vb3RoaW5nLFxuICAgICAgICBdLFxuICAgICAgICB2YWx1ZXMsXG4gICAgICAgIGluZGljZXM6IHNlY3Rpb24gIT0gbnVsbCA/IG9ic2VydmF0aW9uc0luU2VjdGlvbihvYnMsIHNlY3Rpb24pIDogaW5TZWxlY3Rpb24sXG4gICAgICAgIGludGVycG9sYXRlLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmdlbmVNYXBWb2x1bWVGaWVsZEtleSA9IGZpZWxkS2V5O1xuICAgIH1cbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuZ2VuZU1hcFZvbHVtZUZpZWxkO1xuICAgIGlmICghZmllbGQpIHJldHVybjtcblxuICAgIGNvbnN0IFtsbywgaGldID0gY29udHJhc3RXaW5kb3coZmllbGQubWVhbiwgY2xpcFswXSwgY2xpcFsxXSk7XG4gICAgY29uc3QgZGF0YSA9IGVuY29kZUV4cHJlc3Npb25Wb2x1bWUoZmllbGQsIFtsbywgaGldLCB7IGxvZzogdmlldy5sb2dTY2FsZSB9KTtcbiAgICBjb25zdCBub2RlID0gdGhpcy5jdXJyZW50Q29sb3JtYXAgYXMgeyBkYXRhPzogeyB2YWx1ZT86IHVua25vd24gfSB9IHwgbnVsbDtcbiAgICBjb25zdCBsdXQgPSBzcGF0aWFsQ29udGludW91c0x1dChcbiAgICAgIG5vZGU/LmRhdGE/LnZhbHVlLCB0aGlzLmN1cnJlbnRSZXZlcnNlLCB2aWV3LmNvbnRpbnVvdXNDb2xvcm1hcCxcbiAgICApO1xuICAgIHRoaXMuZ2VuZU1hcFZvbHVtZUxheWVyID0gdmlld2VyLmFkZFZvbHVtZShcbiAgICAgIGRhdGEsIGZpZWxkLndpZHRoLCBmaWVsZC5oZWlnaHQsIGZpZWxkLmRlcHRoLFxuICAgICAge1xuICAgICAgICBuYW1lOiBgZ2VuZSBtYXAgwrcgJHtnZW5lfSR7aW50ZXJwb2xhdGUgPyAnIMK3IHZvbHVtZScgOiAnJ31gLFxuICAgICAgICBjb2xvcm1hcDogY29sb3JtYXBGcm9tTHV0KGBnZW5lLW1hcC0ke2dlbmV9YCwgbHV0KSxcbiAgICAgICAgLy8gVGhlIGVuY29kaW5nIGFscmVhZHkgYXBwbGllZCB0aGUgd2luZG93LCBzbyB0aGUgbGF5ZXIgbXVzdCBub3QgYXBwbHkgYVxuICAgICAgICAvLyBzZWNvbmQgb25lOiAwLi4yNTUgaXMgdGhlIHdob2xlIG9mIHdoYXQgaXQgd2FzIGdpdmVuLlxuICAgICAgICBjb250cmFzdExpbWl0czogWzAsIDI1NV0sXG4gICAgICAgIHJlbmRlcmluZzogJ3RyYW5zbHVjZW50JyxcbiAgICAgICAgLy8gQWRkaXRpdmUgbGlrZSB0aGUgZGVuc2l0eSB2b2x1bWVzLCBhbmQgZm9yIHRoZSBzYW1lIHJlYXNvbjogdGhlIHNoZWV0c1xuICAgICAgICAvLyBoYXZlIHRvIHJlYWQgVEhST1VHSCBlYWNoIG90aGVyIGFuZCB0aHJvdWdoIHRoZSBhbmF0b215LCB3aGljaCBhXG4gICAgICAgIC8vIHRyYW5zbHVjZW50IGJsZW5kIHdvdWxkIG9jY2x1ZGUgb25lIHNoZWV0IGF0IGEgdGltZS5cbiAgICAgICAgYmxlbmRpbmc6ICdhZGRpdGl2ZScsXG4gICAgICAgIG9wYWNpdHk6IHZpZXcuZ2VuZU1hcE9wYWNpdHksXG4gICAgICAgIHZveGVsU2l6ZTogZ3JpZC52b3hlbFNpemUsXG4gICAgICB9LFxuICAgICk7XG4gICAgdmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbHVzdGVyIGRlbnNpdHkgdm9sdW1lczogZWFjaCBjbHVzdGVyIHJhc3RlcmlzZWQgaW50byBhIHNtb290aCBzY2FsYXIgZmllbGQgYW5kXG4gICAqIHJheW1hcmNoZWQgYWxvbmdzaWRlIHRoZSBjbG91ZCwgdGludGVkIHdpdGggdGhlIGNsdXN0ZXIncyBvd24gbGVnZW5kIGNvbG91ci5cbiAgICpcbiAgICogVGhpcyBpcyB3aGF0IG1ha2VzIGEgc2VyaWFsbHkgc2VjdGlvbmVkIGRhdGFzZXQgcmVhZGFibGUgYXMgYW4gYW5hdG9taWNhbFxuICAgKiBkaXN0cmlidXRpb24uIFRoZSBjbG91ZCBzaG93cyBtZWFzdXJlZCBjZWxscyBhbmQgbm90aGluZyBlbHNlIOKAlCBidXQgYXQgMjAwIMK1bVxuICAgKiBzZWN0aW9uIHNwYWNpbmcgdGhlIGV5ZSBjYW5ub3QgaW50ZWdyYXRlIGEgc3RhY2sgb2YgZGlzY3MgaW50byBhIHNoYXBlLCBhbmRcbiAgICogZXZlcnkgZ2FwIHJlYWRzIGFzIGFic2VuY2UuIEEgZGVuc2l0eSBmaWVsZCBpcyBhIGRpZmZlcmVudCBvYmplY3QgZnJvbSBhIGNlbGw6XG4gICAqIGFuIGVzdGltYXRlLCBkZWZpbmVkIGJldHdlZW4gdGhlIGltYWdlZCBwbGFuZXMsIGRyYXduIGFzIGEgdHJhbnNsdWNlbnQgY2xvdWQgc29cbiAgICogaXQgY2Fubm90IGJlIG1pc3Rha2VuIGZvciBtZWFzdXJlbWVudC4gSW5kaXZpZHVhbCBjZWxscyBhcmUgbmV2ZXIgaW50ZXJwb2xhdGVkIOKAlFxuICAgKiBjb25zZWN1dGl2ZSBzZWN0aW9ucyBzYW1wbGUgZGlmZmVyZW50IGNlbGxzLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGludGVycG9sYXRlXG4gICAqIGFsb25nLlxuICAgKlxuICAgKiBPbmUgdm9sdW1lIHBlciBjbHVzdGVyIHJhdGhlciB0aGFuIG9uZSBmb3IgZXZlcnl0aGluZzogYWRkaXRpdmUgYmxlbmRpbmcgaXMgd2hhdFxuICAgKiBtYWtlcyB0d28gY2x1c3RlcnMnIHRlcnJpdG9yaWVzIGNvbXBhcmFibGUsIGFuZCBhIHNpbmdsZSBibGVuZGVkIGZpZWxkIHdvdWxkXG4gICAqIGFuc3dlciBubyBxdWVzdGlvbiBhbnlvbmUgYXNrcyBvZiBhIHRheG9ub215LiBDYXBwZWQgYXRcbiAgICoge0BsaW5rIERFTlNJVFlfTUFYX0NMVVNURVJTfSBieSBjZWxsIGNvdW50LlxuICAgKlxuICAgKiBLZXllZCBzbyBpdCByZWJ1aWxkcyBvbmx5IHdoZW4gdGhlIGZpZWxkIHdvdWxkIGFjdHVhbGx5IGRpZmZlciDigJQgdGhlIGRhdGFzZXQsXG4gICAqIHRoZSBjb2xvdXIgY29sdW1uLCB0aGUgYmFuZHdpZHRoLCBvciB0aGUgc2VsZWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVEZW5zaXR5Vm9sdW1lcyhcbiAgICB2aWV3ZXI6IFZpZXdlciwgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgb24gPSAhIXZpZXcuZGVuc2l0eVZvbHVtZSAmJiAhIWRhdGFzZXQub2JzZXJ2YXRpb25zLno7XG4gICAgY29uc3Qgc21vb3RoaW5nID0gdmlldy5kZW5zaXR5U21vb3RoaW5nID4gMCA/IHZpZXcuZGVuc2l0eVNtb290aGluZyA6IDE7XG4gICAgY29uc3QgY29sdW1uID0gdmlldy5jb2xvckJ5Py5raW5kID09PSAnY29sdW1uJyA/IHZpZXcuY29sb3JCeS5uYW1lIDogbnVsbDtcbiAgICAvLyBUaGUgc2VsZWN0aW9uIGVudGVycyB0aGUga2V5IGJ5IElERU5USVRZLCBub3QgYnkgY291bnQ6IHR3byBkaWZmZXJlbnQgUk9Jc1xuICAgIC8vIGhvbGRpbmcgdGhlIHNhbWUgbnVtYmVyIG9mIGNlbGxzIHdvdWxkIG90aGVyd2lzZSBsb29rIGxpa2UgdGhlIHNhbWUga2V5IGFuZFxuICAgIC8vIGxlYXZlIHRoZSBwcmV2aW91cyBST0kncyBmaWVsZHMgb24gc2NyZWVuLlxuICAgIGNvbnN0IGtleSA9IG9uXG4gICAgICA/IFtkYXRhc2V0LmlkLCBjb2x1bW4gPz8gJ2FsbCcsIHNtb290aGluZywgdGhpcy5zZWxlY3Rpb25SZXYoc2VsZWN0aW9uKV0uam9pbignfCcpXG4gICAgICA6IG51bGw7XG4gICAgaWYgKGtleSA9PT0gdGhpcy5kZW5zaXR5S2V5KSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMuZGVuc2l0eUxheWVycykgdmlld2VyLmxheWVycy5yZW1vdmUobGF5ZXIpO1xuICAgIHRoaXMuZGVuc2l0eUxheWVycyA9IFtdO1xuICAgIHRoaXMuZGVuc2l0eUtleSA9IGtleTtcbiAgICBpZiAoIWtleSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZ3JpZCA9IGRlbnNpdHlHcmlkKGRhdGFzZXQpO1xuICAgIGlmICghZ3JpZCkgcmV0dXJuO1xuICAgIC8vIFdpdGggbm8gcmVmZXJlbmNlIHZvbHVtZSB0aGVyZSBpcyBubyBvZmZzZXQgeWV0LCBhbmQgYSBWb2x1bWVMYXllciBoYXMgbm9cbiAgICAvLyB0cmFuc2xhdGUg4oCUIG5hcGFyaSBjZW50cmVzIGl0cyBib3ggb24gdGhlIHdvcmxkIG9yaWdpbi4gU28gdGhlIFBPSU5UUyBtb3ZlIGJ5XG4gICAgLy8gaGFsZiB0aGUgZGVuc2l0eSBib3gsIGV4YWN0bHkgYXMgdGhleSBkbyBmb3IgYSByZWZlcmVuY2Ugdm9sdW1lLCBhbmQgdGhlXG4gICAgLy8gY2FjaGVkIGdlb21ldHJ5IGlzIGludmFsaWRhdGVkIGJlY2F1c2UgdGhhdCBvZmZzZXQganVzdCBjaGFuZ2VkLlxuICAgIGlmICghdGhpcy5zcGF0aWFsVm9sdW1lKSB7XG4gICAgICB0aGlzLnNwYXRpYWxPcmlnaW4zZCA9IFtcbiAgICAgICAgLShncmlkLndpZHRoICogZ3JpZC52b3hlbFNpemVbMF0pIC8gMixcbiAgICAgICAgLShncmlkLmhlaWdodCAqIGdyaWQudm94ZWxTaXplWzFdKSAvIDIsXG4gICAgICAgIC0oZ3JpZC5kZXB0aCAqIGdyaWQudm94ZWxTaXplWzJdKSAvIDIsXG4gICAgICBdO1xuICAgICAgdGhpcy5zcGF0aWFsTGF5ZXJLZXkzZCA9IG51bGw7XG4gICAgfVxuXG4gICAgbGV0IGdyb3VwczogeyBuYW1lOiBzdHJpbmc7IGNvbG9yOiBzdHJpbmc7IGluZGljZXM/OiBVaW50MzJBcnJheSB9W107XG4gICAgdHJ5IHtcbiAgICAgIGdyb3VwcyA9IGF3YWl0IHRoaXMuZGVuc2l0eUdyb3VwcyhkYXRhc2V0LCBjb2x1bW4sIHNlbGVjdGlvbik7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIGRlbnNpdHkgdm9sdW1lczogY29sdW1uIHVuYXZhaWxhYmxlJywgZXJyKTtcbiAgICAgIHRoaXMuZGVuc2l0eUtleSA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnZpZXdlciAhPT0gdmlld2VyIHx8IHRoaXMuZGVuc2l0eUtleSAhPT0ga2V5KSByZXR1cm47XG5cbiAgICBjb25zdCBzaWdtYSA9IGRlZmF1bHRTaWdtYShncmlkLCBzbW9vdGhpbmcpO1xuICAgIC8vIEFkZGl0aXZlIGJsZW5kaW5nIFNVTVMsIHNvIGEgZml4ZWQgcGVyLWxheWVyIG9wYWNpdHkgYmxvd3Mgb3V0IHRvIHdoaXRlIGFzXG4gICAgLy8gc29vbiBhcyBzZXZlcmFsIGJyb2FkIGNsdXN0ZXJzIG92ZXJsYXAg4oCUIHNpeCBzdWJjbGFzc2VzIGF0IDAuNTUgZWFjaCB0dXJuZWRcbiAgICAvLyB0aGUgYnJhaW4gaW50byBvbmUgY3lhbiBtYXNzLiBTcGxpdHRpbmcgdGhlIGJ1ZGdldCBrZWVwcyBuIGZ1bGx5IG92ZXJsYXBwaW5nXG4gICAgLy8gcGVha3MgaW5zaWRlIHRoZSBkaXNwbGF5J3MgcmFuZ2UsIHNvIG92ZXJsYXAgcmVhZHMgYXMgb3ZlcmxhcDsgYSBzaW5nbGVcbiAgICAvLyBjbHVzdGVyIHN0aWxsIGdldHMgdGhlIGZ1bGwgMC41NS4gSXQgb25seSBtaXRpZ2F0ZXM6IGEgdHJhbnNsdWNlbnQgcmF5bWFyY2hcbiAgICAvLyBpbnRlZ3JhdGVzIGFsb25nIHRoZSByYXksIHNvIGNsdXN0ZXJzIHRoYXQgYXJlIHViaXF1aXRvdXMgcmF0aGVyIHRoYW5cbiAgICAvLyByZWdpb25hbCAodGhlIGxhcmdlc3Qgc3ViY2xhc3NlcyBhcmUgZ2xpYSwgd2hpY2ggYXJlIGV2ZXJ5d2hlcmUpIHN0aWxsIHBpbGVcbiAgICAvLyB1cCwgYW5kIG9uZSBjbHVzdGVyIGF0IGEgdGltZSBpcyB0aGUgcmVhZGFibGUgd2F5IHRvIGxvb2sgYXQgdGhvc2UuXG4gICAgY29uc3Qgb3BhY2l0eSA9IE1hdGgubWluKDAuNTUsIDAuOSAvIE1hdGgubWF4KDEsIGdyb3Vwcy5sZW5ndGgpKTtcbiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIGdyb3Vwcykge1xuICAgICAgY29uc3QgZGF0YSA9IHJhc3Rlcml6ZURlbnNpdHkoZGF0YXNldC5vYnNlcnZhdGlvbnMsIGdyaWQsIHsgc2lnbWEsIGluZGljZXM6IGdyb3VwLmluZGljZXMgfSk7XG4gICAgICAvLyBBIGNsdXN0ZXIgd2l0aCBub3RoaW5nIG9uIHRoZSBncmlkIGRyYXdzIG5vIGxheWVyLCByYXRoZXIgdGhhbiBhbiBlbXB0eSBib3guXG4gICAgICBpZiAoIWRhdGEpIGNvbnRpbnVlO1xuICAgICAgaWYgKHRoaXMudmlld2VyICE9PSB2aWV3ZXIgfHwgdGhpcy5kZW5zaXR5S2V5ICE9PSBrZXkpIHJldHVybjtcbiAgICAgIHRoaXMuZGVuc2l0eUxheWVycy5wdXNoKFxuICAgICAgICAoXG4gICAgICAgICAgdmlld2VyLmFkZFZvbHVtZShkYXRhLCBncmlkLndpZHRoLCBncmlkLmhlaWdodCwgZ3JpZC5kZXB0aCwge1xuICAgICAgICAgICAgbmFtZTogYGRlbnNpdHkgwrcgJHtncm91cC5uYW1lfWAsXG4gICAgICAgICAgICBjb2xvcm1hcDogdGhpcy5jaGFubmVsVGludENvbG9ybWFwKGdyb3VwLmNvbG9yKSxcbiAgICAgICAgICAgIC8vIFRyYW5zbHVjZW50LCBub3QgTUlQOiBhIGNsdXN0ZXIncyBpbnRlcmlvciBpcyB0aGUgcmVhZGFibGUgcGFydCwgYW5kIE1JUFxuICAgICAgICAgICAgLy8gd291bGQgZmxhdHRlbiBldmVyeSBjbG91ZCB0byBpdHMgYnJpZ2h0ZXN0IHNoZWxsLlxuICAgICAgICAgICAgcmVuZGVyaW5nOiAndHJhbnNsdWNlbnQnLFxuICAgICAgICAgICAgb3BhY2l0eSxcbiAgICAgICAgICAgIC8vIEFkZGl0aXZlLCBzbyB0d28gY2x1c3RlcnMgb3ZlcmxhcHBpbmcgcmVhZCBhcyBib3RoIGJlaW5nIHRoZXJlIGluc3RlYWRcbiAgICAgICAgICAgIC8vIG9mIHRoZSBuZWFyZXIgb25lIGhpZGluZyB0aGUgb3RoZXIuXG4gICAgICAgICAgICBibGVuZGluZzogJ2FkZGl0aXZlJyxcbiAgICAgICAgICAgIHZveGVsU2l6ZTogZ3JpZC52b3hlbFNpemUsXG4gICAgICAgICAgfSkpLFxuICAgICAgKTtcbiAgICB9XG4gICAgdmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZGVudGl0eSBvZiB0aGUgY29sb3VyIHNjYWxlIGEgY29udGludW91cyBzcGF0aWFsIGxheWVyIHdpbGwgZHJhdyB3aXRoLCBmb3IgYVxuICAgKiBjYWNoZSBrZXk6IHRoZSBleHBsaWNpdCBjaG9pY2UsIG9yIGVsc2UgdGhlIGRpc3BsYXkgY29sb3JtYXAgYW5kIGl0cyByZXZlcnNlXG4gICAqIGZsYWcsIHNpbmNlIHRoYXQgaXMgd2hhdCB7QGxpbmsgc3BhdGlhbENvbnRpbnVvdXNMdXR9IGZhbGxzIGJhY2sgdG8uXG4gICAqXG4gICAqIFRoZSBnZW5lIG1hcHMgY2FjaGUgdGhlaXIgY29sb3VyZWQgb3V0cHV0LCBzbyB3aXRob3V0IHRoaXMgaW4gdGhlIGtleSBhIGNoYW5nZVxuICAgKiBvZiBjb2xvdXIgc2NhbGUgbGVmdCB0aGUgZmllbGQgb24gc2NyZWVuIGluIHRoZSBwcmV2aW91cyBjb2xvdXJzIOKAlCB0aGUgbWFya2Vyc1xuICAgKiByZWNvbG91cmVkIGFuZCB0aGUgbWFwIHVuZGVyIHRoZW0gZGlkIG5vdC5cbiAgICovXG4gIHByaXZhdGUgY29udGludW91c0NvbG9ybWFwS2V5KHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmN1cnJlbnRDb2xvcm1hcCBhcyB7IGRhdGE/OiB7IHZhbHVlPzogdW5rbm93biB9IH0gfCBudWxsO1xuICAgIHJldHVybiBbXG4gICAgICBjb2xvcm1hcElkKHZpZXcuY29udGludW91c0NvbG9ybWFwKSxcbiAgICAgIGNvbG9ybWFwSWQobm9kZT8uZGF0YT8udmFsdWUpLFxuICAgICAgdGhpcy5jdXJyZW50UmV2ZXJzZSA/ICdyZXYnIDogJycsXG4gICAgXS5qb2luKCc6Jyk7XG4gIH1cblxuICAvKipcbiAgICogQSByZXZpc2lvbiBudW1iZXIgZm9yIGEgc2VsZWN0aW9uIG9iamVjdC5cbiAgICpcbiAgICogVGhlIHN0b3JlIGhhbmRzIG91dCBhIE5FVyBtYXNrIG9iamVjdCBwZXIgY2hhbmdlLCBzbyBvYmplY3QgaWRlbnRpdHkgaXMgdGhlXG4gICAqIGNoZWFwIGFuZCBleGFjdCB3YXkgdG8gdGVsbCB0d28gc2VsZWN0aW9ucyBhcGFydCDigJQgYSBmaW5nZXJwcmludCBvdmVyIDMuN01cbiAgICogbWFzayBieXRlcyB3b3VsZCBiZSBuZWl0aGVyLiBDb3VudGluZyByZXZpc2lvbnMga2VlcHMgdGhlIGNhY2hlIGtleSBhIHNob3J0XG4gICAqIHN0cmluZy5cbiAgICovXG4gIHByaXZhdGUgc2VsZWN0aW9uUmV2KHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2spOiBudW1iZXIge1xuICAgIGlmIChzZWxlY3Rpb24gIT09IHRoaXMubGFzdFNlbGVjdGlvblNlZW4pIHtcbiAgICAgIHRoaXMubGFzdFNlbGVjdGlvblNlZW4gPSBzZWxlY3Rpb247XG4gICAgICB0aGlzLnNlbGVjdGlvblJldmlzaW9uKys7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvblJldmlzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjbHVzdGVycyB0byByYXN0ZXJpc2U6IHRoZSBjYXRlZ29yaWVzIG9mIHRoZSBhY3RpdmUgY2F0ZWdvcmljYWwgY29sb3VyaW5nLFxuICAgKiBiaWdnZXN0IGZpcnN0IGFuZCBjYXBwZWQsIGVhY2ggd2l0aCBpdHMgbGVnZW5kIGNvbG91ci5cbiAgICpcbiAgICogUmVzdHJpY3RlZCB0byB0aGUgY3VycmVudCBzZWxlY3Rpb24gd2hlbiB0aGVyZSBpcyBvbmUsIHNvIFwic2VsZWN0IGEgcmVnaW9uLFxuICAgKiBjaGVjayB0aGUgYm94XCIgYW5zd2VycyB3aGljaCBjbHVzdGVycyBsaXZlIHRoZXJlLiBXaXRoIG5vIGNhdGVnb3JpY2FsIGNvbG91cmluZ1xuICAgKiB0aGVyZSBpcyBvbmUgZ3JvdXAg4oCUIHRvdGFsIGNlbGwgZGVuc2l0eSwgd2hpY2ggaXMgYSByZWFsIHF1ZXN0aW9uIG9uIGl0cyBvd25cbiAgICogKFwid2hlcmUgaXMgdGhlIHRpc3N1ZSBkZW5zZT9cIikgYW5kIHRoZSBob25lc3QgdGhpbmcgdG8gc2hvdyB3aGVuIHRoZSB2aWV3IGlzXG4gICAqIG5vdCBlbmNvZGluZyBhIHRheG9ub215LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkZW5zaXR5R3JvdXBzKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCBjb2x1bW46IHN0cmluZyB8IG51bGwsIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gICk6IFByb21pc2U8eyBuYW1lOiBzdHJpbmc7IGNvbG9yOiBzdHJpbmc7IGluZGljZXM/OiBVaW50MzJBcnJheSB9W10+IHtcbiAgICBjb25zdCBuID0gZGF0YXNldC5vYnNlcnZhdGlvbnMuY291bnQ7XG4gICAgY29uc3QgaW5TZWxlY3Rpb24gPSBzZWxlY3Rpb24uY291bnQgPiAwID8gc2VsZWN0aW9uLm1hc2sgOiBudWxsO1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnNwYXRpYWxEYXRhO1xuICAgIGNvbnN0IG1ldGEgPSBjb2x1bW4gPyBmaW5kQ29sdW1uTWV0YShkYXRhc2V0LCBjb2x1bW4pIDogdW5kZWZpbmVkO1xuICAgIGlmICghcG9ydCB8fCAhY29sdW1uIHx8ICFtZXRhIHx8IG1ldGEua2luZCAhPT0gJ2NhdGVnb3JpY2FsJykge1xuICAgICAgY29uc3QgaW5kaWNlcyA9IGluU2VsZWN0aW9uID8gbWFza1RvSW5kaWNlcyhpblNlbGVjdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBbciwgZywgYl0gPSBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5TUEFUSUFMX05FVVRSQUxfQ09MT1I7XG4gICAgICBjb25zdCBoZXggPSBgIyR7W3IsIGcsIGJdLm1hcCgoYykgPT4gTWF0aC5yb3VuZChjICogMjU1KS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyl9YDtcbiAgICAgIHJldHVybiBbeyBuYW1lOiBpblNlbGVjdGlvbiA/ICdzZWxlY3RlZCBjZWxscycgOiAnYWxsIGNlbGxzJywgY29sb3I6IGhleCwgaW5kaWNlcyB9XTtcbiAgICB9XG5cbiAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBwb3J0LmdldENvbHVtbihjb2x1bW4pO1xuICAgIGlmICghaXNDYXRlZ29yaWNhbENvbHVtbihsb2FkZWQpKSByZXR1cm4gW107XG4gICAgY29uc3QgY29sb3JzID0gcmVzb2x2ZUNhdGVnb3J5Q29sb3JzKGxvYWRlZC5tZXRhKTtcbiAgICBjb25zdCBjb3VudHMgPSBuZXcgVWludDMyQXJyYXkobG9hZGVkLm1ldGEuY2F0ZWdvcmllcy5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICBpZiAoaW5TZWxlY3Rpb24gJiYgIWluU2VsZWN0aW9uW2ldKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGNvZGUgPSBsb2FkZWQuY29kZXNbaV07XG4gICAgICBpZiAoY29kZSAhPT0gTk9fQ0FURUdPUlkgJiYgY29kZSA8IGNvdW50cy5sZW5ndGgpIGNvdW50c1tjb2RlXSsrO1xuICAgIH1cbiAgICBjb25zdCByYW5rZWQgPSBBcnJheS5mcm9tKGNvdW50cywgKGNvdW50LCBjb2RlKSA9PiAoeyBjb2RlLCBjb3VudCB9KSlcbiAgICAgIC5maWx0ZXIoKGMpID0+IGMuY291bnQgPiAwKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGIuY291bnQgLSBhLmNvdW50KVxuICAgICAgLnNsaWNlKDAsIE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLkRFTlNJVFlfTUFYX0NMVVNURVJTKTtcbiAgICBpZiAoY291bnRzLmZpbHRlcigoYykgPT4gYyA+IDApLmxlbmd0aCA+IHJhbmtlZC5sZW5ndGgpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgYFtuYXBhcmktanNdICR7Y29sdW1ufTogZHJhd2luZyB0aGUgJHtyYW5rZWQubGVuZ3RofSBsYXJnZXN0IGNsdXN0ZXJzIGFzIGRlbnNpdHkgYCArXG4gICAgICAgICAgJ3ZvbHVtZXM7IG1vcmUgdGhhbiB0aGF0IHN0b3AgYmVpbmcgc2VwYXJhYmxlIGJ5IGV5ZScsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmFua2VkLm1hcCgoeyBjb2RlIH0pID0+IHtcbiAgICAgIGNvbnN0IGluZGljZXMgPSBuZXcgVWludDMyQXJyYXkoY291bnRzW2NvZGVdKTtcbiAgICAgIGxldCBrID0gMDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIGlmIChpblNlbGVjdGlvbiAmJiAhaW5TZWxlY3Rpb25baV0pIGNvbnRpbnVlO1xuICAgICAgICBpZiAobG9hZGVkLmNvZGVzW2ldID09PSBjb2RlKSBpbmRpY2VzW2srK10gPSBpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogbG9hZGVkLm1ldGEuY2F0ZWdvcmllc1tjb2RlXSxcbiAgICAgICAgY29sb3I6IGNvbG9yc1tjb2RlXSA/PyAnIzg4ODg4OCcsXG4gICAgICAgIGluZGljZXM6IGluZGljZXMuc3ViYXJyYXkoMCwgayksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCAob3Iga2VlcCkgdGhlIGRhdGFzZXQncyByZWZlcmVuY2Ugdm9sdW1lLCBhbmQgZGVyaXZlIHRoZSBvZmZzZXQgdGhhdCBzaXRzIHRoZVxuICAgKiBvYnNlcnZhdGlvbnMgaW5zaWRlIGl0LlxuICAgKlxuICAgKiBgVm9sdW1lTGF5ZXJgIGhhcyBubyB0cmFuc2xhdGU6IG5hcGFyaS1qcyBtYXBzIHRoZSB2b2x1bWUncyB1bml0IGN1YmUgdG8gYSB3b3JsZCBib3hcbiAgICogKipjZW50cmVkIG9uIHRoZSBvcmlnaW4qKiwgc2l6ZWQgYGRpbXMgeCB2b3hlbFNpemVgLiBUaGUgb2JzZXJ2YXRpb25zLCBieSBjb250cmFjdCwgYXJlIGluXG4gICAqIHRoZSB2b2x1bWUncyBvd24gZnJhbWUgd2l0aCBpdHMgbmVhciBjb3JuZXIgYXQgdGhlIGNvb3JkaW5hdGUgb3JpZ2luLiBTbyB0aGUgdHdvIG9ubHkgbGluZVxuICAgKiB1cCBpZiB0aGUgUE9JTlRTIG1vdmUg4oCUIGJ5IGhhbGYgdGhlIGJveCDigJQgd2hpY2ggaXMgd2hhdCB7QGxpbmsgc3BhdGlhbE9yaWdpbjNkfSBpcy5cbiAgICpcbiAgICogQSBmYWlsZWQgb3IgYWJzZW50IHZvbHVtZSBpcyBub3QgZmF0YWw6IHRoZSBjbG91ZCByZW5kZXJzIG9uIGl0cyBvd24sIGF0IGl0cyBvd25cbiAgICogY29vcmRpbmF0ZXMsIGFuZCB0aGUgY2FtZXJhIGZyYW1lcyB0aGUgcG9pbnRzIGluc3RlYWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZVNwYXRpYWxWb2x1bWUoXG4gICAgdmlld2VyOiBWaWV3ZXIsIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtZXRhID0gZGF0YXNldC52b2x1bWU7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc3BhdGlhbERhdGE7XG4gICAgY29uc3Qga2V5ID0gbWV0YSA/IGAke2RhdGFzZXQuaWR9OiR7bWV0YS53aWR0aH14JHttZXRhLmhlaWdodH14JHttZXRhLmRlcHRofWAgOiBudWxsO1xuICAgIGlmIChrZXkgJiYga2V5ID09PSB0aGlzLnNwYXRpYWxWb2x1bWVLZXkpIHJldHVybjtcblxuICAgIGlmICh0aGlzLnNwYXRpYWxWb2x1bWUpIHtcbiAgICAgIHZpZXdlci5sYXllcnMucmVtb3ZlKHRoaXMuc3BhdGlhbFZvbHVtZSk7XG4gICAgICB0aGlzLnNwYXRpYWxWb2x1bWUgPSBudWxsO1xuICAgICAgdGhpcy5zcGF0aWFsVm9sdW1lS2V5ID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5zcGF0aWFsT3JpZ2luM2QgPSBbMCwgMCwgMF07XG4gICAgaWYgKCFtZXRhIHx8ICFwb3J0Py5nZXRWb2x1bWUpIHJldHVybjtcblxuICAgIGxldCB2b3hlbHM6IFVpbnQ4QXJyYXk7XG4gICAgdHJ5IHtcbiAgICAgIHZveGVscyA9IGF3YWl0IHBvcnQuZ2V0Vm9sdW1lKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIHJlZmVyZW5jZSB2b2x1bWUgdW5hdmFpbGFibGUg4oCUIGRyYXdpbmcgdGhlIGNsb3VkIGFsb25lJywgZXJyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMudmlld2VyICE9PSB2aWV3ZXIpIHJldHVybjtcblxuICAgIGNvbnN0IFt2eCwgdnksIHZ6XSA9IG1ldGEudm94ZWxTaXplO1xuICAgIHRoaXMuc3BhdGlhbFZvbHVtZUtleSA9IGtleTtcbiAgICB0aGlzLnNwYXRpYWxWb2x1bWUgPSAoXG4gICAgICB2aWV3ZXIuYWRkVm9sdW1lKHZveGVscywgbWV0YS53aWR0aCwgbWV0YS5oZWlnaHQsIG1ldGEuZGVwdGgsIHtcbiAgICAgIG5hbWU6ICdyZWZlcmVuY2Ugdm9sdW1lJyxcbiAgICAgIGNvbG9ybWFwOiAnZ3JheScsXG4gICAgICAvLyBNSVAgd291bGQgZHJhdyB0aGUgYnJpZ2h0ZXN0IHZveGVsIGFsb25nIGVhY2ggcmF5LCB3aGljaCBmb3IgYW4gYXZlcmFnZWRcbiAgICAgIC8vIHRlbXBsYXRlIG1lYW5zIGEgZmxhdCB3aGl0ZSBzaGVsbCB0aGF0IGhpZGVzIHRoZSBjbG91ZC4gVHJhbnNsdWNlbnQgbGV0c1xuICAgICAgLy8gdGhlIHBvaW50cyByZWFkIHRocm91Z2ggdGhlIHRpc3N1ZSwgd2hpY2ggaXMgdGhlIGVudGlyZSBwb2ludCBvZiBkcmF3aW5nXG4gICAgICAvLyB0aGVtIHRvZ2V0aGVyLlxuICAgICAgcmVuZGVyaW5nOiAndHJhbnNsdWNlbnQnLFxuICAgICAgb3BhY2l0eTogdmlldy52b2x1bWVPcGFjaXR5LFxuICAgICAgICB2b3hlbFNpemU6IFt2eCwgdnksIHZ6XSxcbiAgICAgIH0pKTtcbiAgICAvLyBIYWxmIHRoZSBib3gsIG5lZ2F0ZWQ6IHRoZSBvYnNlcnZhdGlvbnMnIG9yaWdpbiBpcyB0aGUgYm94J3MgbmVhciBjb3JuZXIsXG4gICAgLy8gYW5kIHRoZSBib3ggaXMgY2VudHJlZCBvbiB0aGUgd29ybGQgb3JpZ2luLlxuICAgIHRoaXMuc3BhdGlhbE9yaWdpbjNkID0gW1xuICAgICAgLShtZXRhLndpZHRoICogdngpIC8gMixcbiAgICAgIC0obWV0YS5oZWlnaHQgKiB2eSkgLyAyLFxuICAgICAgLShtZXRhLmRlcHRoICogdnopIC8gMixcbiAgICBdO1xuICAgIC8vIEZvcmNlIGEgZ2VvbWV0cnkgcmVidWlsZDogdGhlIG9mZnNldCBjaGFuZ2VkLCBzbyBjYWNoZWQgcG9zaXRpb25zIGFyZSBzdGFsZS5cbiAgICB0aGlzLnNwYXRpYWxMYXllcktleTNkID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlU3BhdGlhbDNkTGF5ZXJzKHZpZXdlcjogVmlld2VyKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBsYXllciBvZiBbXG4gICAgICB0aGlzLnNwYXRpYWxQb2ludHMzZCwgdGhpcy5zcGF0aWFsVm9sdW1lLFxuICAgICAgdGhpcy5nZW5lTWFwVm9sdW1lTGF5ZXIsIC4uLnRoaXMuZGVuc2l0eUxheWVycyxcbiAgICBdKSB7XG4gICAgICBpZiAobGF5ZXIpIHZpZXdlci5sYXllcnMucmVtb3ZlKGxheWVyKTtcbiAgICB9XG4gICAgdGhpcy5nZW5lTWFwVm9sdW1lTGF5ZXIgPSBudWxsO1xuICAgIHRoaXMuZ2VuZU1hcFZvbHVtZUtleSA9IG51bGw7XG4gICAgdGhpcy5nZW5lTWFwVm9sdW1lRmllbGQgPSBudWxsO1xuICAgIHRoaXMuZ2VuZU1hcFZvbHVtZUZpZWxkS2V5ID0gbnVsbDtcbiAgICB0aGlzLmRlbnNpdHlMYXllcnMgPSBbXTtcbiAgICB0aGlzLmRlbnNpdHlLZXkgPSBudWxsO1xuICAgIC8vIFRoZSBzY2VuZSBpcyBnb25lLCBzbyB0aGUgbmV4dCAzRCBsYXllciBzaG91bGQgZnJhbWUgaXRzZWxmIGFnYWluLiBUaGF0IHVzZWQgdG8gYmVcbiAgICAvLyBgc3BhdGlhbEZyYW1lZCA9IG51bGxgIG5leHQgdG8gYSBoYW5kLXJvbGxlZCBzYXZlL3Jlc3RvcmU7IHRoZSByZW5kZXJlciBvd25zIHRoZVxuICAgIC8vIHBvbGljeSBub3csIGFuZCB0aGlzIGlzIHRoZSBzYW1lIHN0YXRlbWVudCBhZGRyZXNzZWQgdG8gaXQuXG4gICAgdmlld2VyLnJlc2V0Rml0M0QoKTtcbiAgICB0aGlzLnNwYXRpYWwyZEZyYW1lZCA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsVm9sdW1lID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxWb2x1bWVLZXkgPSBudWxsO1xuICAgIHRoaXMuc3BhdGlhbE9yaWdpbjNkID0gWzAsIDAsIDBdO1xuICAgIHRoaXMuc3BhdGlhbFBvaW50czNkID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxMYXllcktleTNkID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxTY2FsYXJLZXkzZCA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsUG9zaXRpb25zM2QgPSBudWxsO1xuICAgIHRoaXMuc3BhdGlhbERyYXduM2QgPSBudWxsO1xuICB9XG5cbiAgLyoqIEEgb25lLWNvbG91ciBjb2xvcm1hcCwgZm9yIHRoZSBcIm5vdGhpbmcgdG8gY29sb3VyIGJ5XCIgc3RhdGUuICovXG4gIHByaXZhdGUgc3BhdGlhbEZsYXRDb2xvcm1hcCgpOiBDb2xvcm1hcCB7XG4gICAgY29uc3QgW3IsIGcsIGJdID0gTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuU1BBVElBTF9ORVVUUkFMX0NPTE9SO1xuICAgIGNvbnN0IHJnYjogUmdiID0gW01hdGgucm91bmQociAqIDI1NSksIE1hdGgucm91bmQoZyAqIDI1NSksIE1hdGgucm91bmQoYiAqIDI1NSldO1xuICAgIC8vIFR3byBpZGVudGljYWwgc3RvcHM6IGNvbG9ybWFwRnJvbUx1dCBuZWVkcyBhdCBsZWFzdCB0d28sIGFuZCBlcXVhbCBlbmRzXG4gICAgLy8gbWFrZSBldmVyeSB2YWx1ZSByZXNvbHZlIHRvIHRoZSBzYW1lIGNvbG91ci5cbiAgICByZXR1cm4gY29sb3JtYXBGcm9tTHV0KCdzcGF0aWFsLWZsYXQnLCBbcmdiLCByZ2JdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcGVyLXBvaW50IHNjYWxhciArIGNvbG9ybWFwICsgd2luZG93IHRoYXQgY29sb3VyIHRoZSAzRCBjbG91ZC5cbiAgICpcbiAgICogQ29udGludW91cyBkYXRhIGlzIHRoZSBuYXR1cmFsIGZpdDogdmFsdWVzIGdvIHN0cmFpZ2h0IHRocm91Z2ggdGhlIGFjdGl2ZSBjb2xvcm1hcCB3aXRoIHRoZVxuICAgKiBzYW1lIHBlcmNlbnRpbGUgd2luZG93IHRoZSAyRCBwYXRoIHVzZXMuIENhdGVnb3JpY2FsIGRhdGEgaGFzIHRvIGJlIHNtdWdnbGVkIHRocm91Z2ggdGhlIHNhbWVcbiAgICogc2NhbGFyIGNoYW5uZWwg4oCUIHNlZSB7QGxpbmsgU1BBVElBTF8zRF9NQVhfQ0FURUdPUklFU30uIENvZGVzIG1hcCB0byBMVVQgYmxvY2tzLCBhbmRcbiAgICogYGNvbnRyYXN0TGltaXRzYCBvZiBgWy0wLjUsIEsgLSAwLjVdYCBwdXRzIGNvZGUgYGlgIGF0IHRoZSBjZW50cmUgb2YgYmxvY2sgYGlgLCB3aGljaCBpcyB3aGF0XG4gICAqIG1ha2VzIHRoZSByb3VuZC10cmlwIGV4YWN0IGluc3RlYWQgb2YgYXBwcm94aW1hdGVseSByaWdodC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc3BhdGlhbFNjYWxhcjNkKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICApOiBQcm9taXNlPFNwYXRpYWwzZEVuY29kaW5nIHwgbnVsbD4ge1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnNwYXRpYWxEYXRhO1xuICAgIGNvbnN0IGNvbG9yQnkgPSB2aWV3LmNvbG9yQnk7XG4gICAgaWYgKCFwb3J0IHx8ICFjb2xvckJ5KSByZXR1cm4gbnVsbDtcblxuICAgIGlmIChjb2xvckJ5LmtpbmQgPT09ICdjb2x1bW4nKSB7XG4gICAgICBjb25zdCBjb2x1bW46IFNwYXRpYWxDb2x1bW4gPSBhd2FpdCBwb3J0LmdldENvbHVtbihjb2xvckJ5Lm5hbWUpO1xuICAgICAgaWYgKGlzQ2F0ZWdvcmljYWxDb2x1bW4oY29sdW1uKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbmNvZGVTcGF0aWFsM2RDYXRlZ29yaWNhbChjb2x1bW4uY29kZXMsIHJlc29sdmVDYXRlZ29yeUNvbG9ycyhjb2x1bW4ubWV0YSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlU3BhdGlhbDNkQ29udGludW91cyhcbiAgICAgICAgY29sdW1uLnZhbHVlcywgdmlldywgdmlldy5sb2dTY2FsZSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlcyA9IGF3YWl0IHBvcnQuZ2V0RmVhdHVyZVZlY3Rvcihjb2xvckJ5Lm5hbWUpO1xuICAgIHJldHVybiB0aGlzLmVuY29kZVNwYXRpYWwzZENvbnRpbnVvdXMoXG4gICAgICB2YWx1ZXMsIHZpZXcsIHZpZXcubG9nU2NhbGUsXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBDYXRlZ29yeSBjb2RlcyDihpIgYSBzdGVwcGVkIExVVCwgZXhhY3QgZm9yIHVwIHRvIHtAbGluayBTUEFUSUFMXzNEX01BWF9DQVRFR09SSUVTfS4gKi9cbiAgcHJpdmF0ZSBlbmNvZGVTcGF0aWFsM2RDYXRlZ29yaWNhbChjb2RlczogVWludDE2QXJyYXksIGNvbG9yczogc3RyaW5nW10pOiBTcGF0aWFsM2RFbmNvZGluZyB8IG51bGwge1xuICAgIC8vIFNsb3QgMCBpcyByZXNlcnZlZCBmb3IgXCJubyBjYXRlZ29yeVwiLCBzbyB0aGUgcGFsZXR0ZSBvY2N1cGllcyAxLi5LIGFuZCB0aGVcbiAgICAvLyBibG9jayBjb3VudCBpcyBvbmUgbW9yZSB0aGFuIHRoZSBjYXRlZ29yeSBjb3VudCDigJQgd2hpY2ggaXMgd2h5IHRoZSBwdWJsaXNoZWRcbiAgICAvLyBjZWlsaW5nIGlzIDk1IGNhdGVnb3JpZXMgcmF0aGVyIHRoYW4gdGhlIExVVCdzIDk2IGRpc3Rpbmd1aXNoYWJsZSBibG9ja3MuXG4gICAgaWYgKGNvbG9ycy5sZW5ndGggPiBTUEFUSUFMXzNEX01BWF9DQVRFR09SSUVTKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbbmFwYXJpLWpzXSAke2NvbG9ycy5sZW5ndGh9IGNhdGVnb3JpZXMgZXhjZWVkcyB0aGUgJHtTUEFUSUFMXzNEX01BWF9DQVRFR09SSUVTfSB0aGUgM0QgYFxuICAgICAgICArIFwibGF5ZXIncyAyNTYtZW50cnkgTFVUIGNhbiBob2xkIGRpc3RpbmN0bHk7IGRyYXdpbmcgZmxhdCBpbnN0ZWFkIG9mIHdpdGggd3JvbmcgY29sb3Vyc1wiLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBrID0gY29sb3JzLmxlbmd0aCArIDE7XG4gICAgY29uc3QgcGFsZXR0ZTogUmdiW10gPSBbXG4gICAgICBNSVNTSU5HX0NPTE9SLFxuICAgICAgLi4uY29sb3JzLm1hcChwYXJzZUhleCksXG4gICAgXTtcbiAgICBjb25zdCBsdXQ6IFJnYltdID0gbmV3IEFycmF5KExVVF9TSVpFKTtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IExVVF9TSVpFOyBqKyspIHtcbiAgICAgIGx1dFtqXSA9IHBhbGV0dGVbTWF0aC5taW4oayAtIDEsIE1hdGguZmxvb3IoKGogKiBrKSAvIExVVF9TSVpFKSldO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZXMgPSBuZXcgRmxvYXQzMkFycmF5KGNvZGVzLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsdWVzW2ldID0gY29kZXNbaV0gPT09IE5PX0NBVEVHT1JZID8gMCA6IGNvZGVzW2ldICsgMTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlcyxcbiAgICAgIGNvbG9ybWFwOiBjb2xvcm1hcEZyb21MdXQoJ3NwYXRpYWwtY2F0ZWdvcmllcycsIGx1dCksXG4gICAgICBjb250cmFzdExpbWl0czogWy0wLjUsIGsgLSAwLjVdLFxuICAgIH07XG4gIH1cblxuICAvKiogQ29udGludW91cyB2YWx1ZXMg4oaSIHRoZSBhY3RpdmUgY29sb3JtYXAgb3ZlciBhIHBlcmNlbnRpbGUtY2xpcHBlZCB3aW5kb3cuICovXG4gIHByaXZhdGUgZW5jb2RlU3BhdGlhbDNkQ29udGludW91cyhcbiAgICBzb3VyY2U6IEZsb2F0MzJBcnJheSwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSwgbG9nOiBib29sZWFuLFxuICApOiBTcGF0aWFsM2RFbmNvZGluZyB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuY3VycmVudENvbG9ybWFwIGFzIHsgZGF0YT86IHsgdmFsdWU/OiB1bmtub3duIH0gfSB8IG51bGw7XG4gICAgY29uc3QgbHV0ID0gc3BhdGlhbENvbnRpbnVvdXNMdXQoXG4gICAgICBub2RlPy5kYXRhPy52YWx1ZSwgdGhpcy5jdXJyZW50UmV2ZXJzZSwgdmlldy5jb250aW51b3VzQ29sb3JtYXAsXG4gICAgKTtcbiAgICBjb25zdCBbbG8sIGhpXSA9IHZpZXcucGVyY2VudGlsZUNsaXAgPz8gWzAuMDEsIDAuOTldO1xuICAgIGxldCB2YWx1ZXMgPSBzb3VyY2U7XG4gICAgaWYgKGxvZykge1xuICAgICAgdmFsdWVzID0gbmV3IEZsb2F0MzJBcnJheShzb3VyY2UubGVuZ3RoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aDsgaSsrKSB2YWx1ZXNbaV0gPSBNYXRoLmxvZzFwKE1hdGgubWF4KDAsIHNvdXJjZVtpXSkpO1xuICAgIH1cbiAgICBjb25zdCBbbWluLCBtYXhdID0gY29udHJhc3RXaW5kb3codmFsdWVzLCBsbywgaGkpO1xuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZXMsXG4gICAgICBjb2xvcm1hcDogY29sb3JtYXBGcm9tTHV0KCdzcGF0aWFsLWNvbnRpbnVvdXMnLCBsdXQpLFxuICAgICAgLy8gQSBkZWdlbmVyYXRlIHdpbmRvdyB3b3VsZCBkaXZpZGUgYnkgemVybyBpbiB0aGUgc2hhZGVyJ3Mgbm9ybWFsaXNhdGlvbi5cbiAgICAgIGNvbnRyYXN0TGltaXRzOiBtYXggPiBtaW4gPyBbbWluLCBtYXhdIDogW21pbiwgbWluICsgMV0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXItb2JzZXJ2YXRpb24gY29sb3VycyBmb3IgdGhlIGN1cnJlbnQgdmlldyBzdGF0ZSwgb3IgYSBzaW5nbGUgZmxhdCBjb2xvdXIgd2hlbiBub3RoaW5nIGlzXG4gICAqIHNlbGVjdGVkIHRvIGNvbG91ciBieS4gQ2F0ZWdvcmljYWwgY29sdW1ucyB1c2UgdGhlIGNvbHVtbidzIG93biBwYWxldHRlOyBjb250aW51b3VzIGNvbHVtbnNcbiAgICogYW5kIGdlbmUgdmVjdG9ycyBnbyB0aHJvdWdoIHRoZSBhY3RpdmUgY29sb3JtYXAgd2l0aCBhIHBlcmNlbnRpbGUtY2xpcHBlZCB3aW5kb3cuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNwYXRpYWxGYWNlQ29sb3JzKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLCBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrLFxuICApOiBQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIHRvUmdiYVR1cGxlcz4gfCBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXT4ge1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnNwYXRpYWxEYXRhO1xuICAgIGNvbnN0IGNvbG9yQnkgPSB2aWV3LmNvbG9yQnk7XG4gICAgLy8gRXZlcnl0aGluZyBOT1Qgc2VsZWN0ZWQgaXMgbXV0ZWQ7IHdpdGggbm90aGluZyBzZWxlY3RlZCwgbm90aGluZyBpcyBtdXRlZFxuICAgIC8vIGFuZCB0aGUgd2hvbGUgdGlzc3VlIHJlYWRzIG5vcm1hbGx5ICh0aGUgQ29zTXggaGlnaGxpZ2h0LXZzLW11dGUgcnVsZSkuXG4gICAgY29uc3QgbXV0ZWQgPSBtdXRlZEZyb21TZWxlY3Rpb24oc2VsZWN0aW9uKTtcblxuICAgIGlmICghcG9ydCB8fCAhY29sb3JCeSkge1xuICAgICAgY29uc3QgW3IsIGcsIGJdID0gTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuU1BBVElBTF9ORVVUUkFMX0NPTE9SO1xuICAgICAgLy8gR2VudWluZWx5IHVuaWZvcm06IG9uZSBicm9hZGNhc3QgdHVwbGUsIHNvIGEgZmxhdCA4NGstb2JzZXJ2YXRpb24gdmlld1xuICAgICAgLy8gZG9lcyBub3QgYWxsb2NhdGUgODRrIG9mIHRoZW0uXG4gICAgICBpZiAoIW11dGVkICYmIHZpZXcub3BhY2l0eSA+PSAxKSByZXR1cm4gTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuU1BBVElBTF9ORVVUUkFMX0NPTE9SO1xuICAgICAgLy8gTm90IHVuaWZvcm0g4oCUIHRoZSBvcGFjaXR5IGNvbnRyb2wgb3IgYSBzZWxlY3Rpb24gdmFyaWVzIHRoZSBhbHBoYSwgc28gaXRcbiAgICAgIC8vIGhhcyB0byBiZSBwZXItcG9pbnQuIFJldHVybmluZyB0aGUgY29uc3RhbnQgdHVwbGUgaGVyZSBpcyB3aGF0IG1hZGUgdGhlXG4gICAgICAvLyBPcGFjaXR5IHNsaWRlciBkbyBub3RoaW5nIGluIHRoZSBkZWZhdWx0IHN0YXRlLCB3aGljaCBpcyB0aGUgc3RhdGUgYW55b25lXG4gICAgICAvLyBsYW5kcyBpbiBiZWZvcmUgcGlja2luZyBhIGNvbG91ciBzb3VyY2UuXG4gICAgICBjb25zdCBoZXggPSBgIyR7W3IsIGcsIGJdLm1hcCgoYykgPT4gTWF0aC5yb3VuZChjICogMjU1KS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyl9YDtcbiAgICAgIHJldHVybiB0b1JnYmFUdXBsZXMoZW5jb2RlQ2F0ZWdvcmljYWwobmV3IFVpbnQxNkFycmF5KGRhdGFzZXQub2JzZXJ2YXRpb25zLmNvdW50KSwge1xuICAgICAgICBjb2xvcnM6IFtoZXhdLFxuICAgICAgICBvcGFjaXR5OiB2aWV3Lm9wYWNpdHksXG4gICAgICAgIG11dGVkLFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIGlmIChjb2xvckJ5LmtpbmQgPT09ICdjb2x1bW4nKSB7XG4gICAgICBjb25zdCBjb2x1bW46IFNwYXRpYWxDb2x1bW4gPSBhd2FpdCBwb3J0LmdldENvbHVtbihjb2xvckJ5Lm5hbWUpO1xuICAgICAgaWYgKGlzQ2F0ZWdvcmljYWxDb2x1bW4oY29sdW1uKSkge1xuICAgICAgICByZXR1cm4gdG9SZ2JhVHVwbGVzKGVuY29kZUNhdGVnb3JpY2FsKGNvbHVtbi5jb2Rlcywge1xuICAgICAgICAgIGNvbG9yczogcmVzb2x2ZUNhdGVnb3J5Q29sb3JzKGNvbHVtbi5tZXRhKSxcbiAgICAgICAgICBvcGFjaXR5OiB2aWV3Lm9wYWNpdHksXG4gICAgICAgICAgbXV0ZWQsXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICAgIC8vIEEgY29udGludW91cyBjb2x1bW4gbWF5IGNhcnJ5IGl0cyBvd24gbG9nIGhpbnQgKGNvdW50cyk7IHRoZSB2aWV3J3NcbiAgICAgIC8vIHRvZ2dsZSB3aW5zIG9uY2UgdGhlIHVzZXIgaGFzIHNldCBpdC5cbiAgICAgIHJldHVybiB0b1JnYmFUdXBsZXModGhpcy5lbmNvZGVTcGF0aWFsQ29udGludW91cyhcbiAgICAgICAgY29sdW1uLnZhbHVlcywgdmlldywgdmlldy5sb2dTY2FsZSwgbXV0ZWQsXG4gICAgICApKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZXMgPSBhd2FpdCBwb3J0LmdldEZlYXR1cmVWZWN0b3IoY29sb3JCeS5uYW1lKTtcbiAgICByZXR1cm4gdG9SZ2JhVHVwbGVzKHRoaXMuZW5jb2RlU3BhdGlhbENvbnRpbnVvdXMoXG4gICAgICB2YWx1ZXMsIHZpZXcsIHZpZXcubG9nU2NhbGUsIG11dGVkLFxuICAgICkpO1xuICB9XG5cbiAgLyoqIENvbnRpbnVvdXMgdmFsdWVzIOKGkiBSR0JBIHRocm91Z2ggdGhlIGFjdGl2ZSBjb2xvcm1hcCBhbmQgYSBjbGlwcGVkIHdpbmRvdy4gKi9cbiAgcHJpdmF0ZSBlbmNvZGVTcGF0aWFsQ29udGludW91cyhcbiAgICB2YWx1ZXM6IEZsb2F0MzJBcnJheSwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSwgbG9nOiBib29sZWFuLFxuICAgIG11dGVkOiBVaW50OEFycmF5IHwgbnVsbCA9IG51bGwsXG4gICk6IEZsb2F0MzJBcnJheSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuY3VycmVudENvbG9ybWFwIGFzIHsgZGF0YT86IHsgdmFsdWU/OiB1bmtub3duIH0gfSB8IG51bGw7XG4gICAgY29uc3QgbHV0ID0gc3BhdGlhbENvbnRpbnVvdXNMdXQoXG4gICAgICBub2RlPy5kYXRhPy52YWx1ZSwgdGhpcy5jdXJyZW50UmV2ZXJzZSwgdmlldy5jb250aW51b3VzQ29sb3JtYXAsXG4gICAgKTtcbiAgICBjb25zdCBbbG8sIGhpXSA9IHZpZXcucGVyY2VudGlsZUNsaXAgPz8gWzAuMDEsIDAuOTldO1xuICAgIGNvbnN0IFttaW4sIG1heF0gPSBjb250cmFzdFdpbmRvdyh2YWx1ZXMsIGxvLCBoaSk7XG4gICAgcmV0dXJuIGVuY29kZUNvbnRpbnVvdXModmFsdWVzLCB7IGx1dCwgbWluLCBtYXgsIGxvZywgb3BhY2l0eTogdmlldy5vcGFjaXR5LCBtdXRlZCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3VudCB0aGUgTkFQQVJJX1NDQVRURVIzRCAzRCBzY2F0dGVyOiB0aGUgZG93bnNhbXBsZWQgdm94ZWwgZ3JpZCBhcyBhIDNEIHBvaW50IGNsb3VkIGNvbG9yZWRcbiAgICogYnkgaW50ZW5zaXR5IChuYXBhcmktanMgYW5hbG9nIG9mIFBsb3RseSdzIHZveGVsIHNjYXR0ZXIzZCkuIEFzc2VtYmxlcyBhIGNvYXJzZSB2b2x1bWUsIHRoZW5cbiAgICogZW1pdHMgYSBmbGF0LXN0cmlkZWQgc2FtcGxlIG9mIHZveGVscyAoY2FwcGVkIGF0IHtAbGluayBTQ0FUVEVSM0RfTUFYX1BPSU5UU30pIHZpYSBgYWRkUG9pbnRzM0RgLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBtb3VudFNjYXR0ZXIzZCh2aWV3ZXI6IFZpZXdlciwgaW5mbzogSUltYWdlSW5mbyB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuaW1hZ2VNb2RlID0gJ2dyYXlzY2FsZSc7XG4gICAgdGhpcy52b2x1bWVNdWx0aWNoYW5uZWwgPSBmYWxzZTtcbiAgICBjb25zdCByZXMgPSB2b2x1bWVSZXNvbHV0aW9uRm9yKHRoaXMucmVzb2x1dGlvblNjYWxlKTtcbiAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dCh0cnVlKTtcbiAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICAgIGxldCB2b2w6IHsgZGF0YTogVWludDhBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXI7IGRlcHRoOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICB2b2wgPSBhd2FpdCB0aGlzLmFzc2VtYmxlVm9sdW1lKGluZm8sIHtcbiAgICAgICAgbWF4U2xpY2U6IE1hdGgubWluKHJlcy5tYXhTbGljZSwgU0NBVFRFUjNEX01BWF9YWSksXG4gICAgICAgIHNsaWNlU3RlcDogcmVzLnNsaWNlU3RlcCxcbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICAgIH1cbiAgICBpZiAoIXZvbCB8fCB0aGlzLnZpZXdlciAhPT0gdmlld2VyKSByZXR1cm47XG5cbiAgICBjb25zdCB7IGRhdGEsIHdpZHRoLCBoZWlnaHQsIGRlcHRoIH0gPSB2b2w7XG4gICAgY29uc3QgelNjYWxlID0gTWF0aC5tYXgod2lkdGgsIGhlaWdodCkgLyBNYXRoLm1heCgxLCBkZXB0aCk7IC8vIOKJiCBjdWJpYyBhc3BlY3RcbiAgICBjb25zdCB0b3RhbCA9IHdpZHRoICogaGVpZ2h0ICogZGVwdGg7XG4gICAgY29uc3Qgc3RyaWRlID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHRvdGFsIC8gU0NBVFRFUjNEX01BWF9QT0lOVFMpKTtcbiAgICBjb25zdCBwb3M6IG51bWJlcltdID0gW107XG4gICAgY29uc3QgdmFsOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG90YWw7IGkgKz0gc3RyaWRlKSB7XG4gICAgICBjb25zdCB4ID0gaSAlIHdpZHRoO1xuICAgICAgY29uc3QgeSA9IE1hdGguZmxvb3IoaSAvIHdpZHRoKSAlIGhlaWdodDtcbiAgICAgIGNvbnN0IHppID0gTWF0aC5mbG9vcihpIC8gKHdpZHRoICogaGVpZ2h0KSk7XG4gICAgICBwb3MucHVzaCh4LCB5LCB6aSAqIHpTY2FsZSk7XG4gICAgICB2YWwucHVzaChkYXRhW2ldKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdCA9IHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKVswXTtcbiAgICB0aGlzLnNjYXR0ZXIzZExheWVyID0gdmlld2VyLmFkZFBvaW50czNEKG5ldyBGbG9hdDMyQXJyYXkocG9zKSwgbmV3IEZsb2F0MzJBcnJheSh2YWwpLCB7XG4gICAgICBjb2xvcm1hcDogdGhpcy52b2x1bWVDb2xvcm1hcChzdCksXG4gICAgICBjb250cmFzdExpbWl0czogW3N0Py5taW4gPz8gMCwgc3Q/Lm1heCA/PyAyNTVdLFxuICAgICAgc2l6ZTogMyxcbiAgICB9KTtcbiAgICB0aGlzLmltYWdlVyA9IHdpZHRoO1xuICAgIHRoaXMuaW1hZ2VIID0gaGVpZ2h0O1xuICAgIHRoaXMudm9sdW1lRGltcyA9IHsgd2lkdGgsIGhlaWdodCwgZGVwdGggfTtcbiAgICAvLyBGZWVkIHRoZSBpbnRlbnNpdHkgaGlzdG9ncmFtIGZyb20gdGhlIGFzc2VtYmxlZCB2b2x1bWUgKGtleSAwKS5cbiAgICB0aGlzLnZvbHVtZUNoYW5uZWxEYXRhLmNsZWFyKCk7XG4gICAgdGhpcy52b2x1bWVDaGFubmVsRGF0YS5zZXQoMCwgZGF0YSk7XG4gICAgdGhpcy5zdWJzY3JpYmVTY2F0dGVyM2REaXNwbGF5U3RhdGUoKTtcbiAgICB0aGlzLnNjaGVkdWxlUmVhZGJhY2soKTtcbiAgfVxuXG4gIC8qKiBTdG9yZSBjb2xvcm1hcCAvIHJldmVyc2UgLyBpbnZlcnQgLyBjaGFubmVsIHdpbmRvdyDihpIgdGhlIDNEIHNjYXR0ZXIncyBjb2xvcm1hcCArIGNvbnRyYXN0LiAqL1xuICBwcml2YXRlIHN1YnNjcmliZVNjYXR0ZXIzZERpc3BsYXlTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BsYXlTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5kaXNwbGF5U3ViID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnN0b3JlLmdldENvbG9ybWFwKCksXG4gICAgICB0aGlzLnN0b3JlLmdldFJldmVyc2VTY2FsZSgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRJbnZlcnQoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q2hhbm5lbFN0YXRlcygpLFxuICAgIF0pLnN1YnNjcmliZSgoW2NvbG9ybWFwLCByZXZlcnNlLCBpbnZlcnQsIGNoYW5uZWxzXSkgPT4ge1xuICAgICAgdGhpcy5jdXJyZW50Q29sb3JtYXAgPSAoY29sb3JtYXAgYXMgQ29sb3JtYXBOb2RlKSA/PyBudWxsO1xuICAgICAgdGhpcy5jdXJyZW50UmV2ZXJzZSA9IHJldmVyc2U7XG4gICAgICB0aGlzLmludmVydEVuYWJsZWQgPSBpbnZlcnQ7XG4gICAgICBjb25zdCBsYXllciA9IHRoaXMuc2NhdHRlcjNkTGF5ZXI7XG4gICAgICBpZiAoIWxheWVyKSByZXR1cm47XG4gICAgICBjb25zdCBzdCA9IGNoYW5uZWxzWzBdO1xuICAgICAgbGF5ZXIuY29sb3JtYXAgPSB0aGlzLnZvbHVtZUNvbG9ybWFwKHN0KTtcbiAgICAgIGlmIChzdCkgbGF5ZXIuY29udHJhc3RMaW1pdHMgPSBbc3QubWluLCBzdC5tYXhdO1xuICAgICAgdGhpcy52aWV3ZXI/LnJlcXVlc3RSZW5kZXIoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3VudCB0aGUgTkFQQVJJX1NVUkZBQ0UgaGVpZ2h0LWZpZWxkIHN1cmZhY2UuIEEgaGVpZ2h0IGZpZWxkIGlzIHNpbmdsZS1zY2FsYXIsIHNvIGZvciBhXG4gICAqIG11bHRpY2hhbm5lbCBpbWFnZSB0aGUgc3VyZmFjZSBmb2xsb3dzIE9ORSBiYW5kIOKAlCB0aGUgZmlyc3QgdmlzaWJsZSBjaGFubmVsIChmYWxsYmFjayAwKSDigJRcbiAgICogY29sb3VyZWQgYnkgdGhhdCBjaGFubmVsJ3Mgd2luZG93L2NvbG9ybWFwIChsaWtlIHRoZSBQbG90bHkgU1VSRkFDRSwgd2hpY2ggaXMgZ3JheXNjYWxlLW9ubHkpLlxuICAgKiBQcmUtbG9hZHMgZXZlcnkgc2xpY2UncyBoZWlnaHQgZGF0YSB3aXRoIGEgcHJvZ3Jlc3MgYmFyIChhcyB0aGUgdm9sdW1lIGRvZXMpIHNvIHRoZSBzdGFja1xuICAgKiBzbGlkZXIgcmUtc2xpY2VzIGluc3RhbnRseSwgdGhlbiBidWlsZHMgdGhlIG1lc2ggZm9yIHRoZSBjdXJyZW50IHNsaWNlLiBBbGwgbWVzaCArIEdQVSB3b3JrXG4gICAqIGxpdmVzIGluIG5hcGFyaS1qcyAoYGhlaWdodEZpZWxkYCArIGBWaWV3ZXIuYWRkU3VyZmFjZWApOyB0aGlzIGJhY2tlbmQgc3VwcGxpZXMgc2NhbGFyIHNsaWNlcy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbW91bnRTdXJmYWNlKHZpZXdlcjogVmlld2VyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZGVzYyA9IGF3YWl0IHRoaXMuZW5zdXJlRGVzY3JpcHRvcigpO1xuICAgIGNvbnN0IGluZm8gPSB0aGlzLmxvYWRlZD8uaW1hZ2VJbmZvO1xuICAgIC8vIFNlcnZlcmxlc3MgbXVsdGljaGFubmVsICh0aWxlZDpmYWxzZSArIGNoYW5uZWxVcmxzKSBoYXMgbm8gZGVzY3JpcHRvciDigJQgZGV0ZWN0XG4gICAgLy8gaXQgZnJvbSBpbWFnZU1ldGEgc28gdGhlIFN1cmZhY2Ugc3RpbGwgZm9sbG93cyBvbmUgYmFuZC5cbiAgICBjb25zdCBzaW1wbGVNYyA9IHRoaXMuc2ltcGxlU3RhY2suaXNTaW1wbGUoaW5mbykgJiYgISFpbmZvPy5jaGFubmVsVXJscz8ubGVuZ3RoXG4gICAgICAmJiAoaW5mbz8uaW1hZ2VNZXRhPy5bMF0/LmNoYW5uZWxDb3VudCA/PyAxKSA+IDE7XG4gICAgY29uc3QgbXVsdGljaGFubmVsID0gc2ltcGxlTWMgfHwgKCEhZGVzYz8ubXVsdGljaGFubmVsICYmIChkZXNjPy5jaGFubmVscyA/PyAxKSA+IDEpO1xuICAgIHRoaXMuc3VyZmFjZU11bHRpY2hhbm5lbCA9IG11bHRpY2hhbm5lbDtcbiAgICAvLyBBIGhlaWdodCBmaWVsZCBpcyBzaW5nbGUtc2NhbGFyIOKGkiBmb2xsb3cgdGhlIHBhbmUtU0VMRUNURUQgY2hhbm5lbC5cbiAgICB0aGlzLnN1cmZhY2VDaGFubmVsID0gbXVsdGljaGFubmVsID8gdGhpcy5zdG9yZS5jdXJyZW50U2VsZWN0ZWRDaGFubmVsKCkgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5zdXJmYWNlTWF4R3JpZCA9IHN1cmZhY2VSZXNvbHV0aW9uRm9yKHRoaXMucmVzb2x1dGlvblNjYWxlKS5tYXhHcmlkO1xuICAgIHRoaXMuaW1hZ2VNb2RlID0gJ2dyYXlzY2FsZSc7XG4gICAgdGhpcy52b2x1bWVNdWx0aWNoYW5uZWwgPSBmYWxzZTtcbiAgICBhd2FpdCB0aGlzLnByZWxvYWRTdXJmYWNlUGxhbmVzKHZpZXdlcik7XG4gICAgaWYgKHRoaXMudmlld2VyICE9PSB2aWV3ZXIpIHJldHVybjtcbiAgICBhd2FpdCB0aGlzLmJ1aWxkU3VyZmFjZSh2aWV3ZXIsIHRoaXMubG9hZGVkPy56ID8/IDApO1xuICAgIHRoaXMuaW5zdGFsbFN1cmZhY2VBeGVzKHZpZXdlcik7XG4gICAgLy8gU3Vic2NyaWJlIGFmdGVyIHRoZSBmaXJzdCBidWlsZCBzbyBkaXNwbGF5LXN0YXRlIGVkaXRzIHRhcmdldCBhIGxpdmUgbGF5ZXIuXG4gICAgdGhpcy5zdWJzY3JpYmVTdXJmYWNlRGlzcGxheVN0YXRlKCk7XG4gIH1cblxuICAvKiogQWRkIHRoZSAzRCBheGVzIGdpem1vICsgRE9NIGxhYmVscyBhcm91bmQgdGhlIChvcmlnaW4tY2VudGVyZWQpIHN1cmZhY2UgbWVzaCwgbWF0Y2hpbmcgdGhlXG4gICAqICB2b2x1bWUvaXNvc3VyZmFjZS4gSW5zdGFsbGVkIG9uY2UgcGVyIG1vdW50OyB0aGUgYm94IHRyYWNrcyB0aGUgbWVzaCBib3VuZHMsIFgvWSBzaG93IHRoZVxuICAgKiAgcGh5c2ljYWwgKG9yIHBpeGVsKSBleHRlbnQsIGFuZCBaIGlzIHRoZSBpbnRlbnNpdHkvaGVpZ2h0IGF4aXMuICovXG4gIHByaXZhdGUgaW5zdGFsbFN1cmZhY2VBeGVzKHZpZXdlcjogVmlld2VyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnN1cmZhY2VMYXllcikgcmV0dXJuO1xuICAgIGNvbnN0IGIgPSB0aGlzLnN1cmZhY2VMYXllci5ib3VuZHMoKTtcbiAgICBjb25zdCBib3hXID0gTWF0aC5tYXgoMSwgYi5tYXhbMF0gLSBiLm1pblswXSk7XG4gICAgY29uc3QgYm94SCA9IE1hdGgubWF4KDEsIGIubWF4WzFdIC0gYi5taW5bMV0pO1xuICAgIGNvbnN0IGJveEQgPSBNYXRoLm1heCgxLCBiLm1heFsyXSAtIGIubWluWzJdKTtcbiAgICBjb25zdCBtcHBYID0gdGhpcy5kZXNjcmlwdG9yPy5tcHBYIHx8IHRoaXMubG9hZGVkPy5pbWFnZUluZm8uaW1hZ2VNZXRhPy5bMF0/Lm1wcFggfHwgMDtcbiAgICBjb25zdCB2b3hlbCA9IG1wcFggPiAwID8gKG1wcFggKiAodGhpcy5kZXNjcmlwdG9yPy53aWR0aCA/PyB0aGlzLmltYWdlVykpIC8gTWF0aC5tYXgoMSwgdGhpcy5pbWFnZVcpIDogMTtcbiAgICB0aGlzLmF4ZXNMYXllciA9IHZpZXdlci5hZGRBeGVzKGJveFcsIGJveEgsIGJveEQsIHtcbiAgICAgIHZveGVsU2l6ZTogW3ZveGVsLCB2b3hlbCwgMV0sXG4gICAgICB2aXNpYmxlOiB0aGlzLmF4ZXNWaXNpYmxlLFxuICAgIH0pO1xuICAgIGlmICh0aGlzLmhvc3QpIHtcbiAgICAgIHRoaXMuYXhlc0xhYmVscyA9IG5ldyBOYXBhcmlBeGVzTGFiZWxzKFxuICAgICAgICB0aGlzLmhvc3QsXG4gICAgICAgIHZpZXdlci5jYW1lcmEzZCxcbiAgICAgICAgdGhpcy5idWlsZFN1cmZhY2VBeGVzTGFiZWxzKGJveFcsIGJveEgsIGJveEQsIG1wcFgpLFxuICAgICAgKTtcbiAgICAgIHRoaXMuYXhlc0xhYmVscy5zZXRWaXNpYmxlKHRoaXMuYXhlc1Zpc2libGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBYL1kvWiBlbmQtbGFiZWxzIGZvciB0aGUgc3VyZmFjZSBnaXptbzogWC9ZIGFyZSB0aGUgcGh5c2ljYWwgKMK1bSkgb3IgcGl4ZWwgZXh0ZW50IG9mIHRoZSBGVUxMXG4gICAqICBpbWFnZTsgWiBpcyB0aGUgaW50ZW5zaXR5L2hlaWdodCBheGlzLiBBbmNob3JzIGFyZSBpbiB0aGUgY2VudGVyZWQgYm94IChtYXRjaGluZyBBeGVzTGF5ZXIpLiAqL1xuICBwcml2YXRlIGJ1aWxkU3VyZmFjZUF4ZXNMYWJlbHMoXG4gICAgYm94VzogbnVtYmVyLFxuICAgIGJveEg6IG51bWJlcixcbiAgICBib3hEOiBudW1iZXIsXG4gICAgbXBwWDogbnVtYmVyLFxuICApOiBBeGlzTGFiZWxTcGVjW10ge1xuICAgIGNvbnN0IGh4ID0gYm94VyAvIDI7XG4gICAgY29uc3QgaHkgPSBib3hIIC8gMjtcbiAgICBjb25zdCBoeiA9IGJveEQgLyAyO1xuICAgIGNvbnN0IGRlc2NXID0gdGhpcy5kZXNjcmlwdG9yPy53aWR0aCA/PyB0aGlzLmltYWdlVztcbiAgICBjb25zdCBkZXNjSCA9IHRoaXMuZGVzY3JpcHRvcj8uaGVpZ2h0ID8/IHRoaXMuaW1hZ2VIO1xuICAgIGNvbnN0IGxlbiA9IChweDogbnVtYmVyKTogc3RyaW5nID0+IChtcHBYID4gMCA/IGZvcm1hdFVtKHB4ICogbXBwWCkgOiBgJHtweH0gcHhgKTtcbiAgICByZXR1cm4gW1xuICAgICAgeyBhbmNob3I6IFtoeCwgLWh5LCAtaHpdLCB0ZXh0OiBgWCDCtyAke2xlbihkZXNjVyl9YCwgY29sb3I6ICcjZWQ0NTQ1JyB9LFxuICAgICAgeyBhbmNob3I6IFstaHgsIGh5LCAtaHpdLCB0ZXh0OiBgWSDCtyAke2xlbihkZXNjSCl9YCwgY29sb3I6ICcjNGRkOTU5JyB9LFxuICAgICAgeyBhbmNob3I6IFstaHgsIC1oeSwgaHpdLCB0ZXh0OiAnWiDCtyBpbnRlbnNpdHknLCBjb2xvcjogJyM2NjhjZmYnIH0sXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmUtZmV0Y2ggZXZlcnkgc3RhY2sgc2xpY2UncyBsdW1pbmFuY2UgcGxhbmUgKGRlY2ltYXRlZCB0byB0aGUgc3VyZmFjZSBncmlkKSBpbnRvXG4gICAqIHtAbGluayBzdXJmYWNlUGxhbmVzfSwgZHJpdmluZyB7QGxpbmsgc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkfSDigJQgdGhlIHNhbWUgbG9hZC13aXRoLXByb2dyZXNzIFVYXG4gICAqIGFzIHRoZSB2b2x1bWUsIGJ1dCBrZWVwaW5nIG9uZSAyRCBwbGFuZSBwZXIgc2xpY2UgcmF0aGVyIHRoYW4gcGFja2luZyBhIDNEIHZvbHVtZS4gQm91bmRlZFxuICAgKiBjb25jdXJyZW5jeSBrZWVwcyB0aGUgY29ubmVjdGlvbiBwb29sIGJ1c3kgd2l0aG91dCBmbG9vZGluZyBpdCBvbiBhIGRlZXAgc3RhY2suXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByZWxvYWRTdXJmYWNlUGxhbmVzKHZpZXdlcjogVmlld2VyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLmxvYWRUb2tlbjsgLy8gYmFpbCBpZiBhIENhbmNlbCAvIG5ldyBwbG90IGJ1bXBzIHRoaXMgd2hpbGUgd2UgZmV0Y2hcbiAgICBjb25zdCBpbmZvID0gdGhpcy5sb2FkZWQ/LmltYWdlSW5mbztcbiAgICBjb25zdCBkZXB0aCA9IGluZm8/LmltYWdlTWV0YT8uWzBdPy56IHx8IGluZm8/LnVybHM/Lmxlbmd0aCB8fCAxO1xuICAgIGNvbnN0IHsgbWF4R3JpZCB9ID0gc3VyZmFjZVJlc29sdXRpb25Gb3IodGhpcy5yZXNvbHV0aW9uU2NhbGUpO1xuICAgIHRoaXMuc3VyZmFjZVBsYW5lcy5jbGVhcigpO1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KHRydWUpO1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoMCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBlbmRpbmc6IG51bWJlcltdID0gW107XG4gICAgICBmb3IgKGxldCB6ID0gMDsgeiA8IGRlcHRoOyB6KyspIHBlbmRpbmcucHVzaCh6KTtcbiAgICAgIGxldCBkb25lID0gMDtcbiAgICAgIGNvbnN0IHdvcmtlciA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIGNvbnN0IHogPSBwZW5kaW5nLnNoaWZ0KCk7XG4gICAgICAgICAgaWYgKHogPT09IHVuZGVmaW5lZCB8fCB0aGlzLnZpZXdlciAhPT0gdmlld2VyIHx8IHRoaXMubG9hZFRva2VuICE9PSB0b2tlbikgcmV0dXJuO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnN1cmZhY2VQbGFuZXMuc2V0KHosIGF3YWl0IHRoaXMuZmV0Y2hTdXJmYWNlUGxhbmUoeiwgbWF4R3JpZCkpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBbbmFwYXJpLWpzXSBzdXJmYWNlIHNsaWNlICR7en0gcHJlbG9hZCBmYWlsZWRgLCBlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkb25lKys7XG4gICAgICAgICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dChNYXRoLnJvdW5kKChkb25lIC8gZGVwdGgpICogMTAwKSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBwb29sID0gTWF0aC5taW4oVk9MVU1FX0ZFVENIX0NPTkNVUlJFTkNZLCBNYXRoLm1heCgxLCBkZXB0aCkpO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoQXJyYXkuZnJvbSh7IGxlbmd0aDogcG9vbCB9LCAoKSA9PiB3b3JrZXIoKSkpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBzbGljZSBgemAgYXMgYSBzaW5nbGUgV0hPTEUtaW1hZ2UgbHVtaW5hbmNlIHBsYW5lIChkZWNpbWF0ZWQgdG8gYG1heEdyaWRgKS4gUHJlZmVycyB0aGVcbiAgICogYXBwJ3MgY29tcGxldGUgcGVyLXNsaWNlIGltYWdlIChgc21hbGxVcmxzYC9gdXJsc2AsIGV4YWN0bHkgbGlrZSB0aGUgUGxvdGx5IHN1cmZhY2UpIHNvIHRoZVxuICAgKiBzdXJmYWNlIGFsd2F5cyBjb3ZlcnMgdGhlIEZVTEwgc2xpY2Ug4oCUIHRoZSB0aWxlLXB5cmFtaWQgYGZldGNoU2xpY2VgIHBhdGggd291bGQgZmFsbCBiYWNrIHRvIGFcbiAgICogc2luZ2xlIHRvcC1sZWZ0IHRpbGUgKGEgY29ybmVyKSBmb3Igc2VsZi1jb250YWluZWQgLyBub24tYC90aWxlcy9pbmZvYCBpbWFnZXMuIEZhbGxzIGJhY2sgdG9cbiAgICogc3RpdGNoaW5nIHRoZSB0aWxlIGdyaWQgb25seSB3aGVuIG5vIGNvbXBsZXRlLWltYWdlIFVSTCBpcyBhdmFpbGFibGUuXG4gICAqL1xuICAvKiogVGlsZSBidWRnZXQgdG8gc3RpdGNoIGEgd2hvbGUgc2xpY2UgYXQgfmB0YXJnZXRQeGAgcmVzb2x1dGlvbiBmcm9tIHRoZSBweXJhbWlkOiBhIGhpZ2hlciB0YXJnZXRcbiAgICogIHB1bGxzIGEgRklORVIgcHlyYW1pZCBsZXZlbCAobW9yZSByZWFsIGRldGFpbCkuIFNoYXJlZCBieSB0aGUgc3VyZmFjZSBwbGFuZSBmZXRjaCBhbmQgdGhlIHZvbHVtZVxuICAgKiAgYXNzZW1ibHkgc28gYm90aCBzY2FsZSB0aGVpciBpbi1wbGFuZSByZXNvbHV0aW9uIHdpdGggdGhlIGRlY2ltYXRlIGZhY3Rvci4gKi9cbiAgcHJpdmF0ZSB0aWxlQnVkZ2V0Rm9yKHRhcmdldFB4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHRpbGVTaXplID0gdGhpcy5kZXNjcmlwdG9yPy50aWxlU2l6ZSB8fCBUSUxFX1NJWkU7XG4gICAgcmV0dXJuIE1hdGgubWluKFxuICAgICAgTUFYX1NUSVRDSF9USUxFUyxcbiAgICAgIE1hdGgubWF4KDEsIE1hdGgucm91bmQoKHRhcmdldFB4IC8gdGlsZVNpemUpICoqIDIgKiBTVElUQ0hfQlVER0VUX0NPRUZGKSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hTdXJmYWNlUGxhbmUoXG4gICAgejogbnVtYmVyLFxuICAgIG1heEdyaWQ6IG51bWJlcixcbiAgKTogUHJvbWlzZTx7IGRhdGE6IFVpbnQ4QXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBpbmZvID0gdGhpcy5sb2FkZWQ/LmltYWdlSW5mbztcbiAgICBjb25zdCBkZXNjID0gYXdhaXQgdGhpcy5lbnN1cmVEZXNjcmlwdG9yKCk7XG4gICAgbGV0IHBsYW5lOiB7IGRhdGE6IFVpbnQ4QXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcblxuICAgIC8vIFByZWZlcnJlZDogc3RpdGNoIHRoZSBXSE9MRSBzbGljZSBmcm9tIHRoZSBzZXJ2ZXIgcHlyYW1pZCBhdCBhIHJlc29sdXRpb24gZHJpdmVuIGJ5IHRoZVxuICAgIC8vIGRlY2ltYXRlIGZhY3RvciDigJQgYSBoaWdoZXIgdGFyZ2V0IGdyaWQgcHVsbHMgYSBGSU5FUiBweXJhbWlkIGxldmVsIChtb3JlIHJlYWwgZGV0YWlsKS4gV2l0aCBhXG4gICAgLy8gZGVzY3JpcHRvciwgZmV0Y2hTbGljZSBzdGl0Y2hlcyB0aGUgd2hvbGUgY2hvc2VuIGxldmVsIChuZXZlciBhIGNvcm5lciksIHRoZW4gd2UgZG93bnNjYWxlIHRvXG4gICAgLy8gdGhlIGdyaWQuIFRoaXMgaXMgd2hhdCBtYWtlcyBcIkZ1bGxcIiBhY3R1YWxseSBoaWdoZXItcmVzIHRoYW4gXCLCvVwiLCBub3QganVzdCBhIGZpeGVkIHByZXZpZXcuXG4gICAgaWYgKGRlc2M/LmxldmVscz8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBidWRnZXQgPSB0aGlzLnRpbGVCdWRnZXRGb3IobWF4R3JpZCk7XG4gICAgICAvLyBUaGUgc3VyZmFjZSBpcyBhIHNpbmdsZSBkZWNpbWF0ZWQgcGxhbmUsIHNvIHRoZSBjb21wb3NpdGUgZmFsbGJhY2sgaXMgYWNjZXB0YWJsZSB3aGVuIHRoZVxuICAgICAgLy8gY2hhbm5lbCBoYXMgbm8gc21hbGwgcHlyYW1pZCBsZXZlbCAoa2VlcHMgaXQgZmFzdCk7IGEgbXVsdGljaGFubmVsIFZPTFVNRSBtdXN0IG5vdCBkbyB0aGlzLlxuICAgICAgcGxhbmUgPSB0aGlzLmJpdG1hcFRvTHVtaW5hbmNlKFxuICAgICAgICBhd2FpdCB0aGlzLmZldGNoU2xpY2UoeiwgdGhpcy5zdXJmYWNlQ2hhbm5lbCwgYnVkZ2V0LCB0cnVlKSxcbiAgICAgICAgbWF4R3JpZCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgKG5vIHB5cmFtaWQpOiB0aGUgYXBwJ3MgQ09NUExFVEUgcGVyLXNsaWNlIGltYWdlICh1cmxzW3pdLCBub3QgdGhlIHNtYWxsIGJsdXJyeVxuICAgIC8vIHRodW1ibmFpbCkg4oCUIHdob2xlIHNsaWNlLCBhdm9pZHMgYSBjb3JuZXIgdGlsZS4gQ2FwcGVkIGF0IHRoZSBpbWFnZSdzIG93biByZXNvbHV0aW9uLlxuICAgIGlmICghcGxhbmUpIHtcbiAgICAgIGNvbnN0IHVybCA9IGluZm8/LnVybHM/Llt6XSA/PyBpbmZvPy5zbWFsbFVybHM/Llt6XTtcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgdGhpcy50aWxlc1xuICAgICAgICAgICAgLmdldEF1dGhIZWFkZXJzKClcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiAoe30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xuICAgICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVycyB9KTtcbiAgICAgICAgICBpZiAocmVzcC5vaykge1xuICAgICAgICAgICAgcGxhbmUgPSB0aGlzLmJpdG1hcFRvTHVtaW5hbmNlKGF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKGF3YWl0IHJlc3AuYmxvYigpKSwgbWF4R3JpZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtuYXBhcmktanNdIHN1cmZhY2UgdXJsIGZldGNoIGZhaWxlZCBmb3Igej0ke3p9YCwgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExhc3QgcmVzb3J0IChubyBweXJhbWlkIGFuZCBubyBjb21wbGV0ZSBpbWFnZSk6IGEgc2luZ2xlIHRpbGUuXG4gICAgaWYgKCFwbGFuZSkge1xuICAgICAgcGxhbmUgPSB0aGlzLmJpdG1hcFRvTHVtaW5hbmNlKFxuICAgICAgICBhd2FpdCB0aGlzLmZldGNoU2xpY2UoeiwgdGhpcy5zdXJmYWNlQ2hhbm5lbCwgdGhpcy50aWxlQnVkZ2V0Rm9yKG1heEdyaWQpLCB0cnVlKSxcbiAgICAgICAgbWF4R3JpZCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBwbGFuZTtcbiAgfVxuXG4gIC8qKiBUaGUgY2hhbm5lbCBzdGF0ZSBkcml2aW5nIHRoZSBzdXJmYWNlOiB0aGUgY2hvc2VuIGJhbmQgZm9yIG11bHRpY2hhbm5lbCAobWF0Y2hlZCBieSBpbmRleCksXG4gICAqICBlbHNlIHRoZSBzaW5nbGUgZ3JheXNjYWxlIGNoYW5uZWwuICovXG4gIHByaXZhdGUgc3VyZmFjZVN0YXRlKGNoYW5uZWxzOiBJQ2hhbm5lbFN0YXRlW10pOiBJQ2hhbm5lbFN0YXRlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5zdXJmYWNlQ2hhbm5lbCA9PSBudWxsKSByZXR1cm4gY2hhbm5lbHNbMF07XG4gICAgcmV0dXJuIGNoYW5uZWxzLmZpbmQoKHMpID0+IHMuaW5kZXggPT09IHRoaXMuc3VyZmFjZUNoYW5uZWwpID8/IGNoYW5uZWxzWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIChSZSlidWlsZCB0aGUgc3VyZmFjZSBtZXNoIGZvciBzbGljZSBgemAgZnJvbSB0aGUgcHJlLWxvYWRlZCBwbGFuZSBjYWNoZSAoaW5zdGFudCDigJQgdGhpcyBpc1xuICAgKiB3aGF0IHRoZSBzdGFjayBzbGlkZXIgY2FsbHMpOyBhIHNsaWNlIG1pc3NpbmcgZnJvbSB0aGUgY2FjaGUgaXMgZmV0Y2hlZCBvbiBkZW1hbmQuIG5hcGFyaS1qcydzXG4gICAqIHB1cmUgYGhlaWdodEZpZWxkYCBidWlsZHMgdGhlIHRyaWFuZ2xlIGdyaWQgKHogPSBub3JtYWxpemVkIGludGVuc2l0eSksIHRoZW4gYGFkZFN1cmZhY2VgXG4gICAqIHJlbmRlcnMgaXQuIFRoZSBzbGljZSBwbGFuZSBhbHNvIGZlZWRzIHRoZSBpbnRlbnNpdHkgaGlzdG9ncmFtIChrZXkgMCkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGJ1aWxkU3VyZmFjZSh2aWV3ZXI6IFZpZXdlciwgejogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHBsYW5lID0gdGhpcy5zdXJmYWNlUGxhbmVzLmdldCh6KTtcbiAgICBpZiAoIXBsYW5lKSB7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dCh0cnVlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBsYW5lID0gYXdhaXQgdGhpcy5mZXRjaFN1cmZhY2VQbGFuZSh6LCB0aGlzLnN1cmZhY2VNYXhHcmlkKTtcbiAgICAgICAgdGhpcy5zdXJmYWNlUGxhbmVzLnNldCh6LCBwbGFuZSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW25hcGFyaS1qc10gc3VyZmFjZSBzbGljZSBmZXRjaCBmYWlsZWQ6JywgZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFwbGFuZSB8fCBwbGFuZS53aWR0aCA8IDIgfHwgcGxhbmUuaGVpZ2h0IDwgMiB8fCB0aGlzLnZpZXdlciAhPT0gdmlld2VyKSByZXR1cm47XG5cbiAgICBjb25zdCBzdCA9IHRoaXMuc3VyZmFjZVN0YXRlKHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKSk7XG4gICAgY29uc3Qgd2luOiBbbnVtYmVyLCBudW1iZXJdID0gW3N0Py5taW4gPz8gMCwgc3Q/Lm1heCA/PyAyNTVdO1xuICAgIHRoaXMuc3VyZmFjZVdpbmRvdyA9IHdpbjtcbiAgICAvLyBIZWlnaHQgQU5EIGNvbG91ciBhcmUgbm9ybWFsaXplZCBieSB0aGUgc2FtZSBjb250cmFzdCB3aW5kb3csIHNvIGNoYW5naW5nIG1pbi9tYXggcmVzaGFwZXMgdGhlXG4gICAgLy8gc3VyZmFjZSAoYSBwaXhlbCdzIGhlaWdodCA9IGl0cyBpbnRlbnNpdHkgd2l0aGluIFttaW4sbWF4XSkuIENlbnRlciBpdCBmb3IgdGhlIGF4ZXMgZ2l6bW8uIFRoZVxuICAgIC8vIHBsYW5lIGlzIGFscmVhZHkgZGVjaW1hdGVkIHRvIHRoZSBncmlkIGNhcCDihpIgc3RyaWRlIDEuXG4gICAgY29uc3QgelNjYWxlID0gU1VSRkFDRV9aX0FTUEVDVCAqIE1hdGgubWF4KHBsYW5lLndpZHRoLCBwbGFuZS5oZWlnaHQpO1xuICAgIGNvbnN0IHsgdmVydGljZXMsIGZhY2VzLCB2YWx1ZXMgfSA9IGhlaWdodEZpZWxkKHBsYW5lLmRhdGEsIHBsYW5lLndpZHRoLCBwbGFuZS5oZWlnaHQsIHtcbiAgICAgIHpTY2FsZSxcbiAgICAgIHpMaW1pdHM6IHdpbixcbiAgICAgIGNlbnRlcjogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8vIFByZXNlcnZlIHRoZSBvcmJpdCBjYW1lcmEgYWNyb3NzIGEgcmUtc2xpY2UgLyB3aW5kb3cgcmVidWlsZCDigJQgb25seSB0aGUgZmlyc3QgbW91bnQgZnJhbWVzLCBzb1xuICAgIC8vIHN0ZXBwaW5nIHRoZSBzdGFjayBvciBjaGFuZ2luZyB0aGUgd2luZG93IGtlZXBzIHRoZSBjdXJyZW50IHpvb20vcGFuL29yaWVudGF0aW9uLlxuICAgIGNvbnN0IGNhbSA9IHZpZXdlci5jYW1lcmEzZDtcbiAgICBjb25zdCBwcmVzZXJ2ZUNhbWVyYSA9IHRoaXMuc3VyZmFjZUxheWVyICE9IG51bGw7XG4gICAgY29uc3Qgc2F2ZWRUYXJnZXQgPSBjYW0udGFyZ2V0O1xuICAgIGNvbnN0IHNhdmVkRGlzdGFuY2UgPSBjYW0uZGlzdGFuY2U7XG4gICAgaWYgKHRoaXMuc3VyZmFjZUxheWVyKSB7XG4gICAgICB2aWV3ZXIubGF5ZXJzLnJlbW92ZSh0aGlzLnN1cmZhY2VMYXllcik7XG4gICAgICB0aGlzLnN1cmZhY2VMYXllciA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuc3VyZmFjZUxheWVyID0gdmlld2VyLmFkZFN1cmZhY2UodmVydGljZXMsIGZhY2VzLCB2YWx1ZXMsIHtcbiAgICAgIGNvbG9ybWFwOiB0aGlzLnZvbHVtZUNvbG9ybWFwKHN0KSxcbiAgICAgIGNvbnRyYXN0TGltaXRzOiB3aW4sXG4gICAgICBnYW1tYTogc3Q/LmdhbW1hID8/IDEsXG4gICAgICB3aXJlZnJhbWU6IHRoaXMuc3VyZmFjZVdpcmVmcmFtZSxcbiAgICB9KTtcbiAgICBpZiAocHJlc2VydmVDYW1lcmEpIHtcbiAgICAgIGNhbS50YXJnZXQgPSBzYXZlZFRhcmdldDtcbiAgICAgIGNhbS5kaXN0YW5jZSA9IHNhdmVkRGlzdGFuY2U7XG4gICAgfVxuXG4gICAgdGhpcy5pbWFnZVcgPSBwbGFuZS53aWR0aDtcbiAgICB0aGlzLmltYWdlSCA9IHBsYW5lLmhlaWdodDtcbiAgICB0aGlzLnZvbHVtZURpbXMgPSB7IHdpZHRoOiBwbGFuZS53aWR0aCwgaGVpZ2h0OiBwbGFuZS5oZWlnaHQsIGRlcHRoOiBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKHpTY2FsZSkpIH07XG4gICAgLy8gUmV1c2UgdGhlIHZvbHVtZSBpbnRlbnNpdHktaGlzdG9ncmFtIHBhdGg6IHRoZSBzbGljZSdzIHNjYWxhciBwbGFuZSBpcyB0aGUgaGlzdG9ncmFtIHNvdXJjZS5cbiAgICB0aGlzLnZvbHVtZUNoYW5uZWxEYXRhLmNsZWFyKCk7XG4gICAgdGhpcy52b2x1bWVDaGFubmVsRGF0YS5zZXQoMCwgcGxhbmUuZGF0YSk7XG4gICAgdGhpcy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gIH1cblxuICAvKiogU3Vic2NyaWJlIHRoZSBzdG9yZSBjb2xvcm1hcCAvIHJldmVyc2UgLyBpbnZlcnQgLyBjaGFubmVsIHdpbmRvdyDihpIgdGhlIHN1cmZhY2UsIHNvIGhpc3RvZ3JhbVxuICAgKiAgJiBjaGFubmVsLWRpYWxvZyBlZGl0cyB1cGRhdGUgaXQgbGl2ZSB3aXRob3V0IGEgcmUtZmV0Y2guICoqbWluL21heCByZXNoYXBlcyB0aGUgc3VyZmFjZSdzXG4gICAqICBoZWlnaHQqKiAoYSBwaXhlbCdzIGhlaWdodCA9IGl0cyBpbnRlbnNpdHkgd2l0aGluIFttaW4sbWF4XSksIHNvIGEgd2luZG93IGNoYW5nZSByZWJ1aWxkcyB0aGVcbiAgICogIG1lc2ggZ2VvbWV0cnkgKGZyb20gdGhlIGNhY2hlZCBzbGljZSk7IGNvbG91ci1vbmx5IGVkaXRzIChjb2xvcm1hcC9MVVQsIGdhbW1hLCByZXZlcnNlLCBpbnZlcnQpXG4gICAqICBqdXN0IHVwZGF0ZSB0aGUgbGF5ZXIncyB1bmlmb3Jtcy4gKi9cbiAgcHJpdmF0ZSBzdWJzY3JpYmVTdXJmYWNlRGlzcGxheVN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGxheVN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmRpc3BsYXlTdWIgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXAoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0UmV2ZXJzZVNjYWxlKCksXG4gICAgICB0aGlzLnN0b3JlLmdldEludmVydCgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRDaGFubmVsU3RhdGVzKCksXG4gICAgICB0aGlzLnN0b3JlLmdldFNlbGVjdGVkQ2hhbm5lbCgpLFxuICAgIF0pLnN1YnNjcmliZSgoW2NvbG9ybWFwLCByZXZlcnNlLCBpbnZlcnQsIGNoYW5uZWxzLCBzZWxlY3RlZF0pID0+IHtcbiAgICAgIHRoaXMuY3VycmVudENvbG9ybWFwID0gKGNvbG9ybWFwIGFzIENvbG9ybWFwTm9kZSkgPz8gbnVsbDtcbiAgICAgIHRoaXMuY3VycmVudFJldmVyc2UgPSByZXZlcnNlO1xuICAgICAgdGhpcy5pbnZlcnRFbmFibGVkID0gaW52ZXJ0O1xuICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLnN1cmZhY2VMYXllcjtcbiAgICAgIGlmICghbGF5ZXIgfHwgIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgICAvLyBTZWxlY3RlZCBjaGFubmVsIGNoYW5nZWQgKG11bHRpY2hhbm5lbCk6IHJlLWZldGNoIFRIQVQgYmFuZCdzIHBsYW5lcyBhbmRcbiAgICAgIC8vIHJlYnVpbGQgdGhlIGhlaWdodC1maWVsZCBmb3IgdGhlIGN1cnJlbnQgc2xpY2UuXG4gICAgICBpZiAodGhpcy5zdXJmYWNlTXVsdGljaGFubmVsICYmIHNlbGVjdGVkICE9PSB0aGlzLnN1cmZhY2VDaGFubmVsKSB7XG4gICAgICAgIHRoaXMuc3VyZmFjZUNoYW5uZWwgPSBzZWxlY3RlZDtcbiAgICAgICAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IHRoaXMucHJlbG9hZFN1cmZhY2VQbGFuZXModGhpcy52aWV3ZXIhKTtcbiAgICAgICAgICBpZiAodGhpcy52aWV3ZXIpIGF3YWl0IHRoaXMuYnVpbGRTdXJmYWNlKHRoaXMudmlld2VyLCB0aGlzLmxvYWRlZD8ueiA/PyAwKTtcbiAgICAgICAgfSkoKS5jYXRjaCgoZXJyKSA9PiBjb25zb2xlLmVycm9yKCdbbmFwYXJpLWpzXSBzdXJmYWNlIGNoYW5uZWwgc3dpdGNoIGZhaWxlZDonLCBlcnIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3QgPSB0aGlzLnN1cmZhY2VTdGF0ZShjaGFubmVscyk7XG4gICAgICBjb25zdCB3aW46IFtudW1iZXIsIG51bWJlcl0gPSBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV07XG4gICAgICBjb25zdCB3aW5kb3dDaGFuZ2VkID1cbiAgICAgICAgIXRoaXMuc3VyZmFjZVdpbmRvdyB8fCB3aW5bMF0gIT09IHRoaXMuc3VyZmFjZVdpbmRvd1swXSB8fCB3aW5bMV0gIT09IHRoaXMuc3VyZmFjZVdpbmRvd1sxXTtcbiAgICAgIGlmICh3aW5kb3dDaGFuZ2VkKSB7XG4gICAgICAgIC8vIEhlaWdodCBmb2xsb3dzIHRoZSBjb250cmFzdCB3aW5kb3cg4oaSIHJlYnVpbGQgdGhlIG1lc2ggZm9yIHRoZSBuZXcgW21pbixtYXhdIChjYW1lcmEga2VwdCkuXG4gICAgICAgIHZvaWQgdGhpcy5idWlsZFN1cmZhY2UodGhpcy52aWV3ZXIsIHRoaXMubG9hZGVkPy56ID8/IDApLmNhdGNoKChlcnIpID0+XG4gICAgICAgICAgY29uc29sZS5lcnJvcignW25hcGFyaS1qc10gc3VyZmFjZSB3aW5kb3cgcmVidWlsZCBmYWlsZWQ6JywgZXJyKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gQ29sb3VyLW9ubHkgY2hhbmdlOiB1cGRhdGUgdW5pZm9ybXMgaW4gcGxhY2UsIG5vIGdlb21ldHJ5IHJlYnVpbGQuXG4gICAgICBsYXllci5jb2xvcm1hcCA9IHRoaXMudm9sdW1lQ29sb3JtYXAoc3QpO1xuICAgICAgaWYgKHN0KSB7XG4gICAgICAgIGxheWVyLmNvbnRyYXN0TGltaXRzID0gd2luO1xuICAgICAgICBsYXllci5nYW1tYSA9IHN0LmdhbW1hO1xuICAgICAgfVxuICAgICAgdGhpcy52aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmaXRDYW1lcmFTb29uKCk6IHZvaWQge1xuICAgIGNvbnN0IHJ1biA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmICh0aGlzLnZpZXdlciAmJiB0aGlzLmNhbnZhcyAmJiB0aGlzLmltYWdlVyA+IDAgJiYgdGhpcy5pbWFnZUggPiAwKSB7XG4gICAgICAgIHRoaXMudmlld2VyLmNhbWVyYS5maXQoXG4gICAgICAgICAgdGhpcy5pbWFnZVcsXG4gICAgICAgICAgdGhpcy5pbWFnZUgsXG4gICAgICAgICAgdGhpcy5jYW52YXMuY2xpZW50V2lkdGggfHwgdGhpcy5pbWFnZVcsXG4gICAgICAgICAgdGhpcy5jYW52YXMuY2xpZW50SGVpZ2h0IHx8IHRoaXMuaW1hZ2VILFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbicpIHJlcXVlc3RBbmltYXRpb25GcmFtZShydW4pO1xuICAgIGVsc2UgcnVuKCk7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgUGxvdGx5LXNwZWNpZmljOyBob3N0IHJlLWRyaXZlcyBwbG90KCkgZnJvbSBpdHMgaW1hZ2Ugc3RyZWFtLiAqL1xuICByZWxvYWRBbmRQbG90KCk6IHZvaWQge1xuICAgIC8qIG5vLW9wICovXG4gIH1cblxuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRUb2tlbisrOyAvLyBpbnZhbGlkYXRlIGFueSBpbi1mbGlnaHQgZnJhbWUgbG9hZGluZyBmcm9tIHRoZSBwcmV2aW91cyBwbG90XG4gICAgdGhpcy5kaXNwbGF5U3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZGlzcGxheVN1YiA9IG51bGw7XG4gICAgdGhpcy5zY2FsZUJhcj8uZGVzdHJveSgpO1xuICAgIHRoaXMuc2NhbGVCYXIgPSBudWxsO1xuICAgIHRoaXMucmVnaW9uT3ZlcmxheT8uZGVzdHJveSgpO1xuICAgIHRoaXMucmVnaW9uT3ZlcmxheSA9IG51bGw7XG4gICAgdGhpcy5heGVzTGFiZWxzPy5kZXN0cm95KCk7XG4gICAgdGhpcy5heGVzTGFiZWxzID0gbnVsbDtcbiAgICB0aGlzLnpIYW5kbGU/LmRlc3Ryb3koKTtcbiAgICB0aGlzLnpIYW5kbGUgPSBudWxsO1xuICAgIHRoaXMudm9sdW1lV29ybGRCYXNlID0gbnVsbDtcbiAgICB0aGlzLmNhY2hlZEltYWdlID0gbnVsbDtcbiAgICB0aGlzLmNhY2hlZEltYWdlU291cmNlID0gbnVsbDtcbiAgICB0aGlzLmxhc3RQaXhlbHNSZWN0ID0gbnVsbDtcbiAgICB0aGlzLm5hdGl2ZUhpc3RvZ3JhbXMuY2xlYXIoKTtcbiAgICB0aGlzLnRpbGVkID0gZmFsc2U7XG4gICAgdGhpcy5oaXN0U2FtcGxlcy5jbGVhcigpO1xuICAgIGlmICh0aGlzLnJlYWRiYWNrVGltZXIgIT0gbnVsbCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVhZGJhY2tUaW1lcik7XG4gICAgICB0aGlzLnJlYWRiYWNrVGltZXIgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmNhbWVyYVJlYWRiYWNrT2ZmPy4oKTtcbiAgICB0aGlzLmNhbWVyYVJlYWRiYWNrT2ZmID0gbnVsbDtcbiAgICB0aGlzLmNoYW5uZWxWaWV3ID0gbnVsbDtcbiAgICB0aGlzLnZpZXdlcj8uZGlzcG9zZSgpO1xuICAgIHRoaXMudmlld2VyID0gbnVsbDtcbiAgICBpZiAodGhpcy5jYW52YXMgJiYgdGhpcy5ob3N0Py5jb250YWlucyh0aGlzLmNhbnZhcykpIHRoaXMuaG9zdC5yZW1vdmVDaGlsZCh0aGlzLmNhbnZhcyk7XG4gICAgdGhpcy5jYW52YXMgPSBudWxsO1xuICAgIHRoaXMubGFzdFBpeGVscyA9IG51bGw7XG4gICAgdGhpcy52b2x1bWVWaWV3ID0gbnVsbDtcbiAgICB0aGlzLnZvbHVtZU11bHRpY2hhbm5lbCA9IGZhbHNlO1xuICAgIHRoaXMuc3VyZmFjZUxheWVyID0gbnVsbDtcbiAgICB0aGlzLnN1cmZhY2VDaGFubmVsID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc3VyZmFjZVBsYW5lcy5jbGVhcigpO1xuICAgIHRoaXMuc3VyZmFjZVdpbmRvdyA9IG51bGw7XG4gICAgdGhpcy5zY2F0dGVyUmVnaW9uU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuc2NhdHRlclJlZ2lvblN1YiA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuc3BhdGlhbFN1YiA9IG51bGw7XG4gICAgdGhpcy5yZW1vdmVTcGF0aWFsSG92ZXIoKTtcbiAgICB0aGlzLmhvdmVyU291cmNlID0gbnVsbDtcbiAgICB0aGlzLmhvdmVyU291cmNlS2V5ID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxQb2ludHMgPSBudWxsO1xuICAgIHRoaXMuc3BhdGlhbExheWVyS2V5ID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxQb2ludHMzZCA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsTGF5ZXJLZXkzZCA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsU2NhbGFyS2V5M2QgPSBudWxsO1xuICAgIHRoaXMuc3BhdGlhbFZvbHVtZSA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsVm9sdW1lS2V5ID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxPcmlnaW4zZCA9IFswLCAwLCAwXTtcbiAgICB0aGlzLnNwYXRpYWxTY2FsZUJhcktleSA9IG51bGw7XG4gICAgLy8gRHJvcCB0aGUgY2FjaGVkIGludGVybGVhdmVkIGNvb3JkaW5hdGVzIHRvbzogaG9sZGluZyAzLjdNIHggMyBmbG9hdHMgYWZ0ZXJcbiAgICAvLyBhIHRlYXJkb3duIGlzIH40NU1CIG9mIHJldGFpbmVkIGhlYXAgZm9yIGEgc2NlbmUgdGhhdCBubyBsb25nZXIgZXhpc3RzLlxuICAgIHRoaXMuc3BhdGlhbFBvc2l0aW9uczNkID0gbnVsbDtcbiAgICAvLyBJbnZhbGlkYXRlIGFueSBjb2xvdXIgZmV0Y2ggc3RpbGwgaW4gZmxpZ2h0IHNvIGl0IGNhbid0IGF0dGFjaCB0byB0aGUgbmV4dCBzY2VuZS5cbiAgICB0aGlzLnNwYXRpYWxSZWJ1aWxkVG9rZW4rKztcbiAgICB0aGlzLnNjYXR0ZXIyZFBvaW50cyA9IG51bGw7XG4gICAgdGhpcy5zY2F0dGVyM2RMYXllciA9IG51bGw7XG4gICAgdGhpcy5heGVzTGF5ZXIgPSBudWxsO1xuICAgIHRoaXMudm9sdW1lRGltcyA9IG51bGw7XG4gICAgdGhpcy52b2x1bWVDaGFubmVsRGF0YS5jbGVhcigpO1xuICB9XG5cbiAgcmVsYXlvdXQoX3RydWVJbWFnZVNpemU/OiBudW1iZXJbXSk6IHZvaWQge1xuICAgIHRoaXMudmlld2VyPy5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgUGxvdGx5LXNwZWNpZmljIGF4aXMgcmVzZXQuICovXG4gIHJlc2V0QXhlcygpOiB2b2lkIHtcbiAgICB0aGlzLmZpdENhbWVyYVNvb24oKTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCBQbG90bHktc3BlY2lmaWMgYXV0b3NjYWxlLiAqL1xuICBhdXRvc2NhbGUoKTogdm9pZCB7XG4gICAgdGhpcy5maXRDYW1lcmFTb29uKCk7XG4gICAgdGhpcy5hdXRvc2NhbGVFdmVudCQubmV4dCh1bmRlZmluZWQpO1xuICB9XG5cbiAgem9vbUluKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnZpZXdlcikgdGhpcy52aWV3ZXIuY2FtZXJhLnpvb20gPSB0aGlzLnZpZXdlci5jYW1lcmEuem9vbSAqIDEuMztcbiAgfVxuXG4gIHpvb21PdXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmlld2VyKSB0aGlzLnZpZXdlci5jYW1lcmEuem9vbSA9IHRoaXMudmlld2VyLmNhbWVyYS56b29tIC8gMS4zO1xuICB9XG5cbiAgc2V0RHJhZ01vZGUoX21vZGU6IHN0cmluZyB8IGZhbHNlKTogdm9pZCB7XG4gICAgLy8gTm8tb3A6IHBhbiBhbmQgem9vbSBhcmUgYWx3YXlzIHRoZSBuYXBhcmkgY2FtZXJhJ3MgZGVmYXVsdCBnZXN0dXJlcywgYW5kIHBhbi96b29tIGdhdGluZyBmb3JcbiAgICAvLyBkcmF3aW5nIGlzIG93bmVkIGJ5IHRoZSByZWdpb24gb3ZlcmxheSdzIHNldE1vZGUgKHNldENvbnRyb2xzRW5hYmxlZCkuIFRvZ2dsaW5nIGNvbnRyb2xzIGhlcmVcbiAgICAvLyB3b3VsZCBmaWdodCB0aGF0IOKAlCB0aGUgaG9zdCBjYWxscyBzZXREcmFnTW9kZShmYWxzZSkgYWxvbmdzaWRlIG92ZXJsYXkuc2V0TW9kZSg8dG9vbD4pLlxuICB9XG5cbiAgc2V0TmF2aWdhdG9yVmlzaWJsZShfdmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIC8qIG5hcGFyaS1qcyBoYXMgbm8gbWluaW1hcDsgbm8tb3AgKi9cbiAgfVxuXG4gIHNldEltYWdlU21vb3RoaW5nRW5hYmxlZChlbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5pbWFnZVNtb290aGluZyA9IGVuYWJsZWQ7XG4gICAgLy8gQXBwbHkgbGl2ZSB0byB0aGUgcmVuZGVyZWQgaW1hZ2UgbGF5ZXJzOyBiYWtlZCBpbnRvIHRoZSBuZXh0IHJlbmRlciB0b28uXG4gICAgdGhpcy5jaGFubmVsVmlldz8uc2V0SW50ZXJwb2xhdGlvbihlbmFibGVkID8gJ2xpbmVhcicgOiAnbmVhcmVzdCcpO1xuICB9XG5cbiAgc2V0U2hvd1N0YWNrKF9zaG93c3RhY2s6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvKiBzdGFjayBuYXZpZ2F0ZWQgdmlhIHNldFpJbmRleCAqL1xuICB9XG5cbiAgc2V0WkluZGV4KHpJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubG9hZGVkKSB0aGlzLmxvYWRlZC56ID0gekluZGV4O1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBpZiAoIXYpIHJldHVybjtcbiAgICAvLyBTdXJmYWNlOiBvbmUgc2xpY2Ug4oaSIG9uZSBtZXNoLCBzbyByZS1idWlsZCB0aGUgaGVpZ2h0IGZpZWxkIGZvciB0aGUgbmV3IHNsaWNlLlxuICAgIGlmICh0aGlzLnN1cmZhY2VMYXllcikge1xuICAgICAgdm9pZCB0aGlzLmJ1aWxkU3VyZmFjZSh2LCB6SW5kZXgpLmNhdGNoKChlcnIpID0+XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tuYXBhcmktanNdIHNldFpJbmRleCBzdXJmYWNlIGZhaWxlZDonLCBlcnIpLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gVm9sdW1lIC8gaXNvc3VyZmFjZTogc3RlcCB0aGUgdm9sdW1lJ3MgeiBwbGFuZSBpbiBwbGFjZS5cbiAgICBpZiAodGhpcy52b2x1bWVWaWV3KSB7XG4gICAgICB2LmRpbXMueiA9IHpJbmRleDtcbiAgICAgIHRoaXMuc2NoZWR1bGVSZWFkYmFjaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBUaWxlZCAyRCBpbWFnZToganVzdCBtb3ZlIHRoZSBkaW1zIHBsYW5lIOKAlCB0aGUgdGlsZWQgdmlzdWFsIGZldGNoZXMgdGhlIG5ldyBzbGljZSdzIHRpbGVzXG4gICAgLy8gKGNhY2hlZCBwZXIgeiksIG5vIGxheWVyIHJlYnVpbGQuIFJlZnJlc2ggdGhlIGNvYXJzZSBoaXN0b2dyYW0gc2FtcGxlIGZvciB0aGUgbmV3IHNsaWNlLlxuICAgIGlmICh0aGlzLnRpbGVkKSB7XG4gICAgICB2LmRpbXMueiA9IHpJbmRleDtcbiAgICAgIGlmICh0aGlzLmRlc2NyaXB0b3IpIHZvaWQgdGhpcy5yZWZyZXNoSGlzdG9ncmFtU2FtcGxlcyh6SW5kZXgsIHRoaXMuZGVzY3JpcHRvcik7XG4gICAgICB0aGlzLnJlZHJhd1NwYXRpYWxNYXJrZXJzKCk7XG4gICAgICB0aGlzLnNjaGVkdWxlUmVhZGJhY2soKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gMkQgaW1hZ2UgKHN0aXRjaCBmYWxsYmFjayk6IHJlLXJlbmRlciB0aGUgc2xpY2UgKHJlLWZldGNoZXMgcGVyLWNoYW5uZWwgLyBjb21wb3NpdGUpLiBCcmFuY2hcbiAgICAvLyBvZiBhIHZvbHVtZSBsYXllciAobm90IGN1cnJlbnRQbG90VHlwZSwgd2hpY2ggY291bGQgYmUgc3RhbGUgYW5kIHNpbGVudGx5IG5vLW9wIHRoZSBzd2FwKS5cbiAgICAvLyBUaGUgdG9rZW4gbGV0cyByZW5kZXJJbWFnZSBkcm9wIGEgc3VwZXJzZWRlZCBzY3J1YiBzbyBhIHNsb3cgb2xkZXIgc2xpY2UgY2FuJ3QgY2xvYmJlciBhIG5ld2VyIG9uZS5cbiAgICBjb25zdCByZXEgPSArK3RoaXMuc2xpY2VSZXE7XG4gICAgdm9pZCB0aGlzLnJlbmRlckltYWdlKHpJbmRleCwgcmVxKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICBpZiAocmVxICE9PSB0aGlzLnNsaWNlUmVxKSByZXR1cm47XG4gICAgICAgIC8vIEFGVEVSIHRoZSBpbWFnZSwgbmV2ZXIgYmVmb3JlOiB0aGUgcmVuZGVyIGNsZWFycyB0aGUgbGF5ZXIgbGlzdCwgc29cbiAgICAgICAgLy8gbWFya2VycyBkcmF3biBmaXJzdCBhcmUgd2lwZWQgYnkgdGhlIHZlcnkgaW1hZ2UgbWVhbnQgdG8gc2l0IHVuZGVyIHRoZW0uXG4gICAgICAgIC8vIE92ZXIgYSB2b2x1bWUtYmFja2VkIGRhdGFzZXQgdGhlIHBsYW5lIGFsc28gZGVjaWRlcyB3aGljaCBvYnNlcnZhdGlvbnNcbiAgICAgICAgLy8gYXJlIGRyYXduIGF0IGFsbCwgc28gdGhpcyBpcyB3aGF0IG1vdmVzIHRoZSBjZWxscyB3aXRoIHRoZSBzZWN0aW9uLlxuICAgICAgICB0aGlzLnJlZHJhd1NwYXRpYWxNYXJrZXJzKCk7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVSZWFkYmFjaygpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiBjb25zb2xlLmVycm9yKCdbbmFwYXJpLWpzXSBzZXRaSW5kZXggc2xpY2UgZmFpbGVkOicsIGVycikpO1xuICB9XG5cbiAgc2V0U3RhY2tMb2FkaW5nKHN0YWNrTG9hZGluZzogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KHN0YWNrTG9hZGluZyk7XG4gIH1cblxuICAvKiogQ2FuY2VsIGluLWZsaWdodCBmcmFtZSBsb2FkaW5nOiBidW1wIHRoZSBsb2FkIGdlbmVyYXRpb24gc28gdGhlIHZvbHVtZS1hc3NlbWJseSAvIHN1cmZhY2VcbiAgICogIHByZWxvYWQgd29ya2VycyBzdG9wIGZldGNoaW5nIG1vcmUgZnJhbWVzLCBhbmQgY2xlYXIgdGhlIGxvYWRpbmcgZmxhZyArIHByb2dyZXNzLiAqL1xuICBjYW5jZWxMb2FkaW5nKCk6IHZvaWQge1xuICAgIHRoaXMubG9hZFRva2VuKys7XG4gICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoMCk7XG4gIH1cblxuICBpc1N0YWNrTG9hZGluZygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zdGFja0xvYWRpbmckLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0U3RhY2tMb2FkaW5nUHJvZ3Jlc3MoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXRUcnVlSW1hZ2VTaXplKCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmltYWdlVyA+IDAgJiYgdGhpcy5pbWFnZUggPiAwID8geyB3aWR0aDogdGhpcy5pbWFnZVcsIGhlaWdodDogdGhpcy5pbWFnZUggfSA6IG51bGw7XG4gIH1cblxuICBnZXRDdXJyZW50SW1hZ2UoKTogUHJvbWlzZTxJbWFnZSB8IG51bGw+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICB9XG5cbiAgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhKCk6IFBpeGVsRGF0YSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmxhc3RQaXhlbHM7XG4gIH1cblxuICBnZXREaXNwbGF5ZWRTb3VyY2VSZWN0KCk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsIHtcbiAgICBjb25zdCB2ID0gdGhpcy52aWV3ZXI7XG4gICAgY29uc3Qgc2l6ZSA9IHRoaXMuZ2V0VHJ1ZUltYWdlU2l6ZSgpO1xuICAgIGlmICghdiB8fCAhc2l6ZSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgciA9IHYudmlzaWJsZVdvcmxkUmVjdCgpO1xuICAgIGNvbnN0IHggPSBNYXRoLm1heCgwLCByLngpO1xuICAgIGNvbnN0IHkgPSBNYXRoLm1heCgwLCByLnkpO1xuICAgIHJldHVybiB7XG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIHdpZHRoOiBNYXRoLm1pbihzaXplLndpZHRoLCByLnggKyByLndpZHRoKSAtIHgsXG4gICAgICBoZWlnaHQ6IE1hdGgubWluKHNpemUuaGVpZ2h0LCByLnkgKyByLmhlaWdodCkgLSB5LFxuICAgIH07XG4gIH1cblxuICBkb3dubG9hZEltYWdlKCk6IHZvaWQge1xuICAgIHZvaWQgdGhpcy5leHBvcnRDb21wb3NpdGUoKTtcbiAgfVxuXG4gIHNldFBsb3RUeXBlKHBsb3RUeXBlOiBQbG90VHlwZSk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFBsb3RUeXBlID0gcGxvdFR5cGU7XG4gIH1cblxuICAvKiogTWFwIGEgUGxvdGx5LXN0eWxlIDNEIGRyYWcgbW9kZSBvbnRvIG5hcGFyaS1qcydzIGNhbWVyYSBkcmFnIG1vZGUuICovXG4gIHNldFN1cmZhY2VEcmFnTW9kZShtb2RlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgY29uc3QgbSA9IG1vZGUgPT09ICdwYW4nID8gJ3BhbicgOiBtb2RlID09PSAnem9vbScgPyAnem9vbScgOiAncm90YXRlJzsgLy8gb3JiaXQvdHVybnRhYmxlIOKGkiByb3RhdGVcbiAgICB0aGlzLnZpZXdlci5zZXRDYW1lcmFEcmFnTW9kZShtKTtcbiAgfVxuXG4gIC8qKiBSZS1mcmFtZSB0aGUgM0QgY2FtZXJhIG9uIHRoZSBjdXJyZW50IDNEIGxheWVyLiBBIHN1cmZhY2UgbWVzaCBzaXRzIGluIHRoZSBwb3NpdGl2ZSBvY3RhbnRcbiAgICogIChub3QgY2VudHJlZCksIHNvIGZyYW1lIGl0IGJ5IGl0cyBvd24gYm91bmRzOyBhIHZvbHVtZS9pc29zdXJmYWNlIHVzZXMgaXRzIGNlbnRyZWQgYm94LiAqL1xuICByZXNldFN1cmZhY2VDYW1lcmEoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpZXdlcikgcmV0dXJuO1xuICAgIGNvbnN0IG1lc2hMYXllciA9IHRoaXMuc3VyZmFjZUxheWVyID8/IHRoaXMuc2NhdHRlcjNkTGF5ZXI7XG4gICAgaWYgKG1lc2hMYXllcikge1xuICAgICAgY29uc3QgYiA9IG1lc2hMYXllci5ib3VuZHMoKTtcbiAgICAgIHRoaXMudmlld2VyLmNhbWVyYTNkLnRhcmdldCA9IGIuY2VudGVyO1xuICAgICAgdGhpcy52aWV3ZXIuY2FtZXJhM2QuZGlzdGFuY2UgPSBNYXRoLm1heChiLnJhZGl1cyAqIDIuNSwgMWUtMyk7XG4gICAgICB0aGlzLnZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGQgPSB0aGlzLnZvbHVtZURpbXM7XG4gICAgaWYgKGQpIHRoaXMudmlld2VyLmNhbWVyYTNkLmZyYW1lKGQud2lkdGgsIGQuaGVpZ2h0LCBkLmRlcHRoKTtcbiAgfVxuXG4gIGdldEF1dG9zY2FsZUV2ZW50KCk6IE9ic2VydmFibGU8dW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLmF1dG9zY2FsZUV2ZW50JC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldFBsb3RUeXBlRGVzY3JpcHRvcnMoKTogUGxvdFR5cGVEZXNjcmlwdG9yW10ge1xuICAgIC8vIFRoZSBXZWJHUFUgbmFwYXJpLWpzIG9wdGlvbnMsIG9mZmVyZWQgYWxvbmdzaWRlIChub3QgcmVwbGFjaW5nKSB0aGUgT1NEL1Bsb3RseSB0eXBlcy5cbiAgICByZXR1cm4gW1xuICAgICAgUExPVF9UWVBFX0RFU0NSSVBUT1JTW1Bsb3RUeXBlLk5BUEFSSV9JTUFHRV0hLFxuICAgICAgUExPVF9UWVBFX0RFU0NSSVBUT1JTW1Bsb3RUeXBlLk5BUEFSSV9TQ0FUVEVSXSEsXG4gICAgICBQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuTkFQQVJJX1NVUkZBQ0VdISxcbiAgICAgIFBMT1RfVFlQRV9ERVNDUklQVE9SU1tQbG90VHlwZS5OQVBBUklfU0NBVFRFUjNEXSEsXG4gICAgICBQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuTkFQQVJJX1ZPTFVNRV0hLFxuICAgICAgUExPVF9UWVBFX0RFU0NSSVBUT1JTW1Bsb3RUeXBlLk5BUEFSSV9JU09TVVJGQUNFXSEsXG4gICAgICAvLyBHYXRlZCBieSBgcmVxdWlyZXNTcGF0aWFsRGF0YWAsIHNvIHRoZSBzZWxlY3RvciBoaWRlcyBpdCB1bnRpbCBhIGRhdGFzZXQgaXMgcHVibGlzaGVkLlxuICAgICAgUExPVF9UWVBFX0RFU0NSSVBUT1JTW1Bsb3RUeXBlLlNQQVRJQUxfT01JQ1NdISxcbiAgICBdO1xuICB9XG5cbiAgLyoqIFRoZSBuYXBhcmkgM0QgZGVjaW1hdGUgZmFjdG9yICgxID0gZnVsbCDigKYgOCA9IOKFmykuIFJlYWQgYnkgdGhlIHRvb2xiYXIgdG8gaW5pdCB0aGUgY29udHJvbC4gKi9cbiAgZ2V0UmVzb2x1dGlvblNjYWxlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x1dGlvblNjYWxlO1xuICB9XG5cbiAgLyoqIFNldCB0aGUgZGVjaW1hdGUgZmFjdG9yIGZvciB0aGUgbmFwYXJpIDNEIHR5cGVzLiBUYWtlcyBlZmZlY3Qgb24gdGhlIG5leHQgKHJlKWxvYWQg4oCUIHRoZSBob3N0XG4gICAqICByZS1wbG90cyBhZnRlciBjYWxsaW5nIHRoaXMsIHNpbmNlIGRlY2ltYXRpb24gY2hhbmdlcyB0aGUgZmV0Y2hlZC9hc3NlbWJsZWQgZGF0YS4gKi9cbiAgc2V0UmVzb2x1dGlvblNjYWxlKHNjYWxlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJlc29sdXRpb25TY2FsZSA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoc2NhbGUpKTtcbiAgfVxuXG4gIGdldEludGVuc2l0eVByb2ZpbGUkKCk6IE9ic2VydmFibGU8SW50ZW5zaXR5UHJvZmlsZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5UHJvZmlsZSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICByZW5kZXJJbnRlbnNpdHlJbnNldChfZGl2SWQ6IHN0cmluZywgX3Byb2ZpbGVzOiBJbnRlbnNpdHlQcm9maWxlW10pOiB2b2lkIHtcbiAgICAvKiBQbG90bHkgb3ducyB0aGUgaW50ZW5zaXR5IGluc2V0ICovXG4gIH1cblxuICAvKiogUmVhZCB0aGUgZGlzcGxheWVkIGNvbXBvc2l0ZSBpbnRvIGBsYXN0UGl4ZWxzYCAodGhlIHBpeGVsLXRvb2xzJyBzb3VyY2UpICsgZW1pdCB0aGUgY2xhbXBlZFxuICAgKiAgdmlzaWJsZSByZWdpb24uIEEgZnJlc2ggUGl4ZWxEYXRhIG9iamVjdCBtZWFucyBjYWNoZWRJbWFnZURhdGEoKSByZWJ1aWxkcyBhdXRvbWF0aWNhbGx5LiAqL1xuICBwcml2YXRlIGFzeW5jIHJ1blJlYWRiYWNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBpZiAoIXYpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHggPSBhd2FpdCB2LnJlYWREaXNwbGF5ZWRQaXhlbHMoKTtcbiAgICAgIGlmICh0aGlzLnZpZXdlciAhPT0gdikgcmV0dXJuO1xuICAgICAgY29uc3QgcmVjdCA9IHYudmlzaWJsZVdvcmxkUmVjdCgpOyAvLyBjYXB0dXJlIFdJVEggdGhlIHBpeGVscyAoc2FtZSBjYW1lcmEpXG4gICAgICB0aGlzLmxhc3RQaXhlbHMgPSBweDtcbiAgICAgIHRoaXMubGFzdFBpeGVsc1JlY3QgPSByZWN0O1xuICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuZ2V0VHJ1ZUltYWdlU2l6ZSgpO1xuICAgICAgaWYgKHNpemUgJiYgcmVjdCkge1xuICAgICAgICBjb25zdCB4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oc2l6ZS53aWR0aCwgcmVjdC54KSk7XG4gICAgICAgIGNvbnN0IHkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihzaXplLmhlaWdodCwgcmVjdC55KSk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oc2l6ZS53aWR0aCAtIHgsIHJlY3Qud2lkdGgpKTtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oc2l6ZS5oZWlnaHQgLSB5LCByZWN0LmhlaWdodCkpO1xuICAgICAgICB0aGlzLnZpZXdwb3J0Q2hhbmdlJC5uZXh0KHsgeCwgeSwgd2lkdGgsIGhlaWdodCB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8qIHJlYWRiYWNrIHVuYXZhaWxhYmxlICovXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZVJlYWRiYWNrKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9PT0gJ2Z1bmN0aW9uJykgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHZvaWQgdGhpcy5ydW5SZWFkYmFjaygpKTtcbiAgICBlbHNlIHNldFRpbWVvdXQoKCkgPT4gdm9pZCB0aGlzLnJ1blJlYWRiYWNrKCksIDApO1xuICB9XG5cbiAgLyoqIERlYm91bmNlZCByZWFkYmFjayDigJQgYXJtZWQgb24gY2FtZXJhIGNoYW5nZXMgc28gYGxhc3RQaXhlbHNgIHRyYWNrcyB0aGUgY3VycmVudCB2aWV3IGFmdGVyIGFcbiAgICogIHBhbi96b29tIHNldHRsZXMgKGFuZCBhZnRlciB0aWxlZCBsZXZlbHMgZmluaXNoIGxvYWRpbmcpLCB3aGljaCB0aGUgb24tY2FudmFzIHBpeGVsIHRvb2xzXG4gICAqICAod2FuZC9icnVzaC9TQU0pIHJlYWQgc3luY2hyb25vdXNseS4gQ29hbGVzY2VzIHJhcGlkIGNoYW5nZXMuICovXG4gIHByaXZhdGUgYXJtUmVhZGJhY2soZGVsYXlNcyA9IDI1MCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlYWRiYWNrVGltZXIgIT0gbnVsbCkgY2xlYXJUaW1lb3V0KHRoaXMucmVhZGJhY2tUaW1lcik7XG4gICAgdGhpcy5yZWFkYmFja1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJlYWRiYWNrVGltZXIgPSBudWxsO1xuICAgICAgdm9pZCB0aGlzLnJ1blJlYWRiYWNrKCk7XG4gICAgfSwgZGVsYXlNcyk7XG4gIH1cblxuICAvLyDilIDilIAgSVJlZ2lvblN0b3JlICsgY2xhc3NpZmljYXRpb24gY29sb3VycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gSW5oZXJpdGVkIGZyb20gQmFzZVN0b3JlVmlzdWFsaXplciDigJQgcHVyZSBkZWxlZ2F0aW9ucyB0byB0aGUgc2hhcmVkXG4gIC8vIFJlZ2lvblN0b3JlIC8gVmlzdWFsaXplclN0b3JlIChpZGVudGljYWwgdG8gdGhlIE9TRCBiYWNrZW5kKS5cblxuICAvLyDilIDilIAgUGl4ZWwgdG9vbHM6IHJldXNlIHRoZSBzaGFyZWQsIGJhY2tlbmQtYWdub3N0aWMgdG9vbCBzZXJ2aWNlcyB3aXRoIGEgbmFwYXJpIGhvc3Qg4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIEJ1aWxkIHRoZSBjb29yZGluYXRlIHRyYW5zZm9ybSArIHRvb2wgaG9zdHMgZm9yIHRoZSBjdXJyZW50IHZpZXdlciAoY2FsbGVkIGZyb20gcGxvdCgpKS4gVGhlXG4gICAqICBwaXhlbCB0b29scyByZWFkIGRpc3BsYXllZCBwaXhlbHMgc3luY2hyb25vdXNseSBmcm9tIHRoZSBsYXN0IHJlYWRiYWNrIGFuZCBjb252ZXJ0IHBvaW50ZXJcbiAgICogIGNvb3JkcyB2aWEgdGhlIG5hcGFyaSBjYW1lcmEsIGV4YWN0bHkgbWlycm9yaW5nIHRoZSBPU0QgaG9zdC4gKi9cbiAgcHJpdmF0ZSBidWlsZFRvb2xIb3N0cygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgdGhpcy5jb29yZFRyYW5zZm9ybSA9IG5ldyBOYXBhcmlDb29yZGluYXRlVHJhbnNmb3JtKFxuICAgICAgdGhpcy52aWV3ZXIsXG4gICAgICAoKSA9PiAhIXRoaXMudmlld2VyICYmIHRoaXMuaW1hZ2VXID4gMCxcbiAgICApO1xuICAgIGNvbnN0IHJlZ2lvbnMgPSB0aGlzLnJlZ2lvblN0b3JlO1xuICAgIHRoaXMud2FuZEhvc3QgPSB7XG4gICAgICBnZXRSZWdpb25zOiAoKSA9PiByZWdpb25zLmdldFJlZ2lvbnMoKSxcbiAgICAgIHNldFJlZ2lvbnM6IChyKSA9PiByZWdpb25zLnNldFJlZ2lvbnMociksXG4gICAgICBnZXRDYWNoZWRJbWFnZURhdGE6ICgpID0+IHRoaXMuY2FjaGVkSW1hZ2VEYXRhKCksXG4gICAgICBnZXRBY3RpdmVGcmFtZUluZGV4OiAoKSA9PiB0aGlzLmxvYWRlZD8ueiA/PyAwLFxuICAgICAgZ2V0T3ZlcmxheUNvbnRhaW5lcjogKCkgPT4gdGhpcy5ob3N0LFxuICAgICAgZ2V0Q29vcmRpbmF0ZVRyYW5zZm9ybTogKCkgPT4gdGhpcy5jb29yZFRyYW5zZm9ybSBhcyBJQ29vcmRpbmF0ZVRyYW5zZm9ybSxcbiAgICAgIGdldEZpbGVOYW1lOiAoKSA9PiB0aGlzLmxvYWRlZD8uZmlsZW5hbWUsXG4gICAgICBnZXRTaGFwZUNvbG9yOiAoKSA9PiByZWdpb25zLmdldFNoYXBlQ29sb3IoKSxcbiAgICB9O1xuICAgIHRoaXMuZXJhc2VySG9zdCA9IHtcbiAgICAgIGdldFJlZ2lvbnM6ICgpID0+IHJlZ2lvbnMuZ2V0UmVnaW9ucygpLFxuICAgICAgc2V0UmVnaW9uczogKHIpID0+IHJlZ2lvbnMuc2V0UmVnaW9ucyhyKSxcbiAgICAgIGludmFsaWRhdGVXYW5kUmVnaW9uOiAoKSA9PiB0aGlzLndhbmRUb29sLmNsZWFyQWN0aXZlUmVnaW9uKCksXG4gICAgICBnZXRPdmVybGF5Q29udGFpbmVyOiAoKSA9PiB0aGlzLmhvc3QsXG4gICAgICBnZXRDb29yZGluYXRlVHJhbnNmb3JtOiAoKSA9PiB0aGlzLmNvb3JkVHJhbnNmb3JtIGFzIElDb29yZGluYXRlVHJhbnNmb3JtLFxuICAgICAgZ2V0Q2FjaGVkSW1hZ2VSYXRpbzogKCkgPT4gdGhpcy5jYWNoZWRJbWFnZURhdGEoKT8ucmF0aW9zWzBdID8/IDEsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgem9vbUJveEhvc3QoKTogWm9vbVRvQm94VG9vbEhvc3Qge1xuICAgIHJldHVybiB7XG4gICAgICBnZXRQbG90RGl2OiAoKSA9PiB0aGlzLnBsb3REaXZJZCxcbiAgICAgIHBpeGVsVG9EYXRhOiAocHgsIHB5KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmhvc3Q/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBpZiAoIXRoaXMudmlld2VyIHx8ICFyZWN0KSByZXR1cm4geyB4OiAwLCB5OiAwIH07XG4gICAgICAgIGNvbnN0IFt4LCB5XSA9IHRoaXMudmlld2VyLmNhbnZhc1RvV29ybGQocmVjdC5sZWZ0ICsgcHgsIHJlY3QudG9wICsgcHkpO1xuICAgICAgICByZXR1cm4geyB4LCB5IH07XG4gICAgICB9LFxuICAgICAgYXBwbHlab29tVG9Cb3g6IChjb29yZHMpID0+IHRoaXMuYXBwbHlab29tVG9Cb3goY29vcmRzKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFpvb20vcGFuIHRoZSBjYW1lcmEgdG8gZml0IGEgZGF0YS1zcGFjZSByZWN0YW5nbGUgYFt4TWluLCB4TWF4LCB5TWF4LCB5TWluXWAuICovXG4gIHByaXZhdGUgYXBwbHlab29tVG9Cb3goY29vcmRpbmF0ZXM6IG51bWJlcltdKTogdm9pZCB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdiB8fCAhdGhpcy5jYW52YXMgfHwgY29vcmRpbmF0ZXMubGVuZ3RoIDwgNCkgcmV0dXJuO1xuICAgIGNvbnN0IFt4TWluLCB4TWF4LCB5QSwgeUJdID0gY29vcmRpbmF0ZXM7XG4gICAgY29uc3QgeDAgPSBNYXRoLm1pbih4TWluLCB4TWF4KTtcbiAgICBjb25zdCB4MSA9IE1hdGgubWF4KHhNaW4sIHhNYXgpO1xuICAgIGNvbnN0IHkwID0gTWF0aC5taW4oeUEsIHlCKTtcbiAgICBjb25zdCB5MSA9IE1hdGgubWF4KHlBLCB5Qik7XG4gICAgY29uc3QgdyA9IE1hdGgubWF4KDEsIHgxIC0geDApO1xuICAgIGNvbnN0IGggPSBNYXRoLm1heCgxLCB5MSAtIHkwKTtcbiAgICBjb25zdCB2dyA9IHRoaXMuY2FudmFzLmNsaWVudFdpZHRoIHx8IHc7XG4gICAgY29uc3QgdmggPSB0aGlzLmNhbnZhcy5jbGllbnRIZWlnaHQgfHwgaDtcbiAgICB2LmNhbWVyYS5jZW50ZXIgPSBbKHgwICsgeDEpIC8gMiwgKHkwICsgeTEpIC8gMl07XG4gICAgdi5jYW1lcmEuem9vbSA9IE1hdGgubWluKHZ3IC8gdywgdmggLyBoKTtcbiAgICB2LnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKiBCdWlsZCBDYWNoZWRJbWFnZURhdGEgZnJvbSB0aGUgbW9zdCByZWNlbnQgcmVhZGJhY2sgKFJHQkEgZGV2aWNlIHBpeGVscyDihpIgW3ldW3hdPVtyLGcsYl0pLFxuICAgKiAgd2l0aCByYXRpb3Mvb3JpZ2luIG1hcHBpbmcgaW1hZ2UgY29vcmRzIOKGlCByZWFkYmFjayBwaXhlbHMuIENhY2hlZCB1bnRpbCB0aGUgcmVhZGJhY2sgY2hhbmdlcy4gKi9cbiAgcHJpdmF0ZSBjYWNoZWRJbWFnZURhdGEoKTogQ2FjaGVkSW1hZ2VEYXRhIHwgbnVsbCB7XG4gICAgY29uc3QgcHggPSB0aGlzLmxhc3RQaXhlbHM7XG4gICAgaWYgKCFweCB8fCAhdGhpcy52aWV3ZXIpIHJldHVybiBudWxsO1xuICAgIGlmICh0aGlzLmNhY2hlZEltYWdlICYmIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPT09IHB4KSByZXR1cm4gdGhpcy5jYWNoZWRJbWFnZTtcbiAgICBjb25zdCB3ID0gcHgud2lkdGg7XG4gICAgY29uc3QgaCA9IHB4LmhlaWdodDtcbiAgICBjb25zdCBkYXRhID0gcHguZGF0YTtcbiAgICBjb25zdCBtYXRyaXg6IG51bWJlcltdW11bXSA9IG5ldyBBcnJheShoKTtcbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGg7IHkrKykge1xuICAgICAgY29uc3Qgcm93OiBudW1iZXJbXVtdID0gbmV3IEFycmF5KHcpO1xuICAgICAgY29uc3QgYmFzZSA9IHkgKiB3ICogNDtcbiAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdzsgeCsrKSB7XG4gICAgICAgIGNvbnN0IG8gPSBiYXNlICsgeCAqIDQ7XG4gICAgICAgIHJvd1t4XSA9IFtkYXRhW29dLCBkYXRhW28gKyAxXSwgZGF0YVtvICsgMl1dO1xuICAgICAgfVxuICAgICAgbWF0cml4W3ldID0gcm93O1xuICAgIH1cbiAgICAvLyBVc2UgdGhlIHJlY3QgY2FwdHVyZWQgV0lUSCB0aGlzIHJlYWRiYWNrIChub3QgdGhlIGxpdmUgb25lKSBzbyByYXRpb3Mvb3JpZ2luIG1hdGNoIHRoZVxuICAgIC8vIG1hdHJpeCdzIGNhbWVyYSDigJQgb3RoZXJ3aXNlIGEgcGFuL3pvb20gc2luY2UgdGhlIHJlYWRiYWNrIG1pcy1zY2FsZXMgdGhlIHRyYWNlZCByZWdpb24uXG4gICAgY29uc3QgcmVjdCA9IHRoaXMubGFzdFBpeGVsc1JlY3QgPz8gdGhpcy52aWV3ZXIudmlzaWJsZVdvcmxkUmVjdCgpO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2UgPSB7XG4gICAgICBmcmFtZXM6IFttYXRyaXhdLFxuICAgICAgd2lkdGg6IHcsXG4gICAgICBoZWlnaHQ6IGgsXG4gICAgICByYXRpb3M6IFtyZWN0LndpZHRoIC8gdywgcmVjdC5oZWlnaHQgLyBoXSxcbiAgICAgIGlzR3JheXNjYWxlOiBmYWxzZSxcbiAgICAgIG9yaWdpblg6IHJlY3QueCxcbiAgICAgIG9yaWdpblk6IHJlY3QueSxcbiAgICB9O1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBweDtcbiAgICByZXR1cm4gdGhpcy5jYWNoZWRJbWFnZTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJVG9vbENvbnRyb2xsZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIENvbnRyb2wgZ2F0aW5nOiBhIHRvb2wgdGhhdCBBQ1RJVkFURVMgZGlzYWJsZXMgdGhlIGNhbWVyYSBjb250cm9sczsgZGVhY3RpdmF0aW9uIGlzIGEgbm8tb3BcbiAgLy8gYmVjYXVzZSB0aGUgaG9zdCBhbHdheXMgY2FsbHMgdGhlIHJlZ2lvbiBvdmVybGF5J3Mgc2V0TW9kZSBGSVJTVCBpbiBlYWNoIHRvZ2dsZSAod2hpY2ggc2V0c1xuICAvLyB0aGUgYmFzZWxpbmUgZW5hYmxlZC9kaXNhYmxlZCksIHNvIHJlLWVuYWJsaW5nIGhlcmUgd291bGQgZmlnaHQgYSBmcmVzaGx5LWFjdGl2YXRlZCBkcmF3IG1vZGUuXG4gIHNldFdhbmRNb2RlKGFjdGl2ZTogYm9vbGVhbiwgb3B0aW9ucz86IElXYW5kT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjsgLy8gbm8gcGxvdCB5ZXQg4oaSIG5vdGhpbmcgdG8gZHJpdmVcbiAgICBpZiAoIWFjdGl2ZSkge1xuICAgICAgdGhpcy53YW5kVG9vbC5zZXRNb2RlKGZhbHNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy52aWV3ZXI/LnNldENvbnRyb2xzRW5hYmxlZChmYWxzZSk7XG4gICAgdGhpcy5jYWNoZWRJbWFnZVNvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5hcm1SZWFkYmFjaygwKTtcbiAgICBpZiAodGhpcy53YW5kSG9zdCkgdGhpcy53YW5kVG9vbC5iaW5kSG9zdCh0aGlzLndhbmRIb3N0KTtcbiAgICB0aGlzLndhbmRUb29sLnNldE1vZGUodHJ1ZSwgKG9wdGlvbnMgPz8ge30pIGFzIHVua25vd24gYXMgV2FuZE9wdGlvbnMpO1xuICB9XG4gIHNldFdhbmRPcHRpb25zKG9wdGlvbnM6IElXYW5kT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMud2FuZFRvb2wuc2V0T3B0aW9ucygob3B0aW9ucyA/PyB7fSkgYXMgdW5rbm93biBhcyBXYW5kT3B0aW9ucyk7XG4gIH1cbiAgY2xlYXJBY3RpdmVXYW5kUmVnaW9uKCk6IHZvaWQge1xuICAgIHRoaXMud2FuZFRvb2wuY2xlYXJBY3RpdmVSZWdpb24oKTtcbiAgfVxuICBzZXRCcnVzaE1vZGUoYWN0aXZlOiBib29sZWFuLCBvcHRpb25zPzogSUJydXNoT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBpZiAoIWFjdGl2ZSkge1xuICAgICAgdGhpcy5icnVzaFRvb2wuc2V0TW9kZShmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudmlld2VyPy5zZXRDb250cm9sc0VuYWJsZWQoZmFsc2UpO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMuYXJtUmVhZGJhY2soMCk7XG4gICAgaWYgKHRoaXMud2FuZEhvc3QpIHRoaXMuYnJ1c2hUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHRoaXMuYnJ1c2hUb29sLnNldE1vZGUodHJ1ZSwgKG9wdGlvbnMgPz8ge30pIGFzIHVua25vd24gYXMgQnJ1c2hPcHRpb25zKTtcbiAgfVxuICBzZXRCcnVzaE9wdGlvbnMob3B0aW9uczogSUJydXNoT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmIChvcHRpb25zPy5zaXplICE9IG51bGwpIHRoaXMuYnJ1c2hUb29sLnNldFNpemUob3B0aW9ucy5zaXplKTtcbiAgfVxuICBzZXRWZXJ0ZXhFcmFzZXJNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBpZiAoYWN0aXZlKSB7XG4gICAgICB0aGlzLnZpZXdlcj8uc2V0Q29udHJvbHNFbmFibGVkKGZhbHNlKTtcbiAgICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgICAgaWYgKHRoaXMuZXJhc2VySG9zdCkgdGhpcy5lcmFzZXJUb29sLmJpbmRIb3N0KHRoaXMuZXJhc2VySG9zdCk7XG4gICAgfVxuICAgIHRoaXMuZXJhc2VyVG9vbC5zZXRNb2RlKGFjdGl2ZSk7XG4gIH1cbiAgc2V0VmVydGV4RXJhc2VyUmFkaXVzKHJhZGl1czogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5lcmFzZXJUb29sLnNldFJhZGl1cyhyYWRpdXMpO1xuICB9XG4gIHNldFpvb21Ub0JveE1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpZXdlcikgcmV0dXJuO1xuICAgIGlmIChhY3RpdmUpIHtcbiAgICAgIHRoaXMudmlld2VyPy5zZXRDb250cm9sc0VuYWJsZWQoZmFsc2UpO1xuICAgICAgdGhpcy56b29tVG9Cb3hUb29sLmJpbmRIb3N0KHRoaXMuem9vbUJveEhvc3QoKSk7XG4gICAgfVxuICAgIHRoaXMuem9vbVRvQm94VG9vbC5zZXRNb2RlKGFjdGl2ZSk7XG4gIH1cbiAgLy8gU0FNIC8gY2VsbHBvc2Ug4oCUIHNlcnZlciByb3VuZC10cmlwcyB0aGF0IHJlYWQgdGhlIGRyYXduIHJlY3RhbmdsZXMgKyBkaXNwbGF5ZWQgcGl4ZWxzIHRocm91Z2hcbiAgLy8gdGhlIHNhbWUgd2FuZCBob3N0IChyZWN0YW5nbGVzIGZyb20gdGhlIFJlZ2lvblN0b3JlLCBpbWFnZSBmcm9tIHRoZSByZWFkYmFjaykuXG4gIGFzeW5jIHNlZ21lbnRSZWN0YW5nbGVzKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKCF0aGlzLnZpZXdlciB8fCAhdGhpcy53YW5kSG9zdCkgcmV0dXJuIDA7XG4gICAgYXdhaXQgdGhpcy5ydW5SZWFkYmFjaygpOyAvLyB0aGUgU0FNIGVtYmVkZGluZyBzYW1wbGVzIHRoZSBjdXJyZW50bHktZGlzcGxheWVkIGltYWdlXG4gICAgdGhpcy5jYWNoZWRJbWFnZVNvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5zYW1Ub29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHJldHVybiB0aGlzLnNhbVRvb2wuc2VnbWVudEJveGVzKCk7XG4gIH1cbiAgYXN5bmMgc2VnbWVudFJlY3RhbmdsZXNDZWxscG9zZSgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGlmICghdGhpcy52aWV3ZXIgfHwgIXRoaXMud2FuZEhvc3QgfHwgIXRoaXMuY2VsbFNlZ21lbnRlcikgcmV0dXJuIDA7XG4gICAgYXdhaXQgdGhpcy5ydW5SZWFkYmFjaygpO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMuY2VsbFNlZ21lbnRUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHJldHVybiB0aGlzLmNlbGxTZWdtZW50VG9vbC5zZWdtZW50Qm94ZXModGhpcy5jZWxsU2VnbWVudGVyKTtcbiAgfVxuICBzZXRTYW1Nb2RlbChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zYW1Ub29sLnNldE1vZGVsKGlkKTtcbiAgICB0aGlzLnNhbVBvaW50VG9vbC5zZXRNb2RlbChpZCk7XG4gIH1cbiAgc2V0U2FtUG9pbnRNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBpZiAoYWN0aXZlKSB7XG4gICAgICB0aGlzLnZpZXdlcj8uc2V0Q29udHJvbHNFbmFibGVkKGZhbHNlKTtcbiAgICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgICAgdGhpcy5hcm1SZWFkYmFjaygwKTsgLy8gcmVmcmVzaCB0aGUgcmVhZGJhY2sgdGhlIGNsaWNrJ3MgZW1iZWRkaW5nIHdpbGwgc2FtcGxlXG4gICAgICBpZiAodGhpcy53YW5kSG9zdCkgdGhpcy5zYW1Qb2ludFRvb2wuYmluZEhvc3QodGhpcy53YW5kSG9zdCk7XG4gICAgfVxuICAgIHRoaXMuc2FtUG9pbnRUb29sLnNldE1vZGUoYWN0aXZlKTtcbiAgfVxuICBjb21taXRTYW1Qb2ludHMoKTogdm9pZCB7XG4gICAgdGhpcy5zYW1Qb2ludFRvb2wuY29tbWl0KCk7XG4gIH1cbiAgY2xlYXJTYW1Qb2ludHMoKTogdm9pZCB7XG4gICAgdGhpcy5zYW1Qb2ludFRvb2wuY2xlYXIoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJRGlzcGxheU9wdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIEluaGVyaXRlZCBmcm9tIEJhc2VTdG9yZVZpc3VhbGl6ZXIg4oCUIHB1cmUgZGVsZWdhdGlvbnMgdG8gdGhlIHNoYXJlZFxuICAvLyBWaXN1YWxpemVyU3RvcmUgKGlkZW50aWNhbCB0byB0aGUgT1NEIGJhY2tlbmQpLlxuXG4gIC8vIOKUgOKUgCBJSW50ZW5zaXR5U2FtcGxpbmc6IFBsb3RseSBvd25zIHNhbXBsaW5nOyBlbWl0IHZpZXdwb3J0IGNoYW5nZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGVuc3VyZUludGVuc2l0eVNhbXBsaW5nKF9pbWFnZUluZm86IElJbWFnZUluZm8sIF96SW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuICByZWZyZXNoSW50ZW5zaXR5U2FtcGxpbmdGb3JSb2koXG4gICAgX3g6IG51bWJlcixcbiAgICBfeTogbnVtYmVyLFxuICAgIF93aWR0aDogbnVtYmVyLFxuICAgIF9oZWlnaHQ6IG51bWJlcixcbiAgICBfekluZGV4OiBudW1iZXIsXG4gICk6IHZvaWQge31cbiAgZ2V0Vmlld3BvcnRDaGFuZ2UkKCk6IE9ic2VydmFibGU8eyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4ge1xuICAgIHJldHVybiB0aGlzLnZpZXdwb3J0Q2hhbmdlJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJVmlzdWFsaXplciBjb21wb3NpdGUgbWVtYmVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgZ2V0UmVnaW9uT3ZlcmxheSgpOiBJUmVnaW9uT3ZlcmxheSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvbk92ZXJsYXk7XG4gIH1cbiAgZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKCk6IElJc29zdXJmYWNlQ29udHJvbHMgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMudm9sdW1lVmlldykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNldElzb1JhbmdlOiAoaXNvTWluOiBudW1iZXIsIGlzb01heDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgIC8vIEFwcGx5IHRvIGV2ZXJ5IGNoYW5uZWwncyB2b2x1bWUgbGF5ZXIuXG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy52b2x1bWVWaWV3Py5sYXllcnMgPz8gW10pIHtcbiAgICAgICAgICBsYXllci5jb250cmFzdExpbWl0cyA9IFtpc29NaW4sIGlzb01heF07XG4gICAgICAgICAgbGF5ZXIucmVuZGVyaW5nID0gJ2lzbyc7XG4gICAgICAgICAgbGF5ZXIuaXNvVGhyZXNob2xkID0gMC41O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmlld2VyPy5yZXF1ZXN0UmVuZGVyKCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgZ2V0SW50ZW5zaXR5Q29udHJvbHMoKTogSUludGVuc2l0eUNvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKTogSVN1cmZhY2UzZENvbnRyb2xzIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLnZvbHVtZVZpZXcgJiYgIXRoaXMuc3VyZmFjZUxheWVyICYmICF0aGlzLnNjYXR0ZXIzZExheWVyKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgc2V0U3VyZmFjZURyYWdNb2RlOiAobW9kZTogc3RyaW5nKTogdm9pZCA9PiB0aGlzLnNldFN1cmZhY2VEcmFnTW9kZShtb2RlKSxcbiAgICAgIHJlc2V0U3VyZmFjZUNhbWVyYTogKCk6IHZvaWQgPT4gdGhpcy5yZXNldFN1cmZhY2VDYW1lcmEoKSxcbiAgICAgIHNldEF4ZXNWaXNpYmxlOiAodmlzaWJsZTogYm9vbGVhbik6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmF4ZXNWaXNpYmxlID0gdmlzaWJsZTtcbiAgICAgICAgdGhpcy5heGVzTGFiZWxzPy5zZXRWaXNpYmxlKHZpc2libGUpO1xuICAgICAgICBpZiAodGhpcy5heGVzTGF5ZXIpIHtcbiAgICAgICAgICB0aGlzLmF4ZXNMYXllci52aXNpYmxlID0gdmlzaWJsZTtcbiAgICAgICAgICB0aGlzLnZpZXdlcj8ucmVxdWVzdFJlbmRlcigpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYXhlc1Zpc2libGU6ICgpOiBib29sZWFuID0+IHRoaXMuYXhlc1Zpc2libGUsXG4gICAgICAvLyBTdXJmYWNlIHdpcmVmcmFtZSAobmFwYXJpLWpzIHN1cmZhY2Ugb25seSkg4oCUIGEgbGl2ZSBsYXllciBwcm9wZXJ0eSwgbm8gcmVidWlsZCBuZWVkZWQuXG4gICAgICBzZXRXaXJlZnJhbWU6IChvbjogYm9vbGVhbik6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnN1cmZhY2VXaXJlZnJhbWUgPSBvbjtcbiAgICAgICAgaWYgKHRoaXMuc3VyZmFjZUxheWVyKSB7XG4gICAgICAgICAgdGhpcy5zdXJmYWNlTGF5ZXIud2lyZWZyYW1lID0gb247XG4gICAgICAgICAgdGhpcy52aWV3ZXI/LnJlcXVlc3RSZW5kZXIoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHdpcmVmcmFtZTogKCk6IGJvb2xlYW4gPT4gdGhpcy5zdXJmYWNlV2lyZWZyYW1lLFxuICAgIH07XG4gIH1cbiAgZ2V0SGlzdG9ncmFtKGNoYW5uZWxJbmRleDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBJSGlzdG9ncmFtIHwgbnVsbCB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuIG51bGw7XG4gICAgLy8gVm9sdW1lIC8gaXNvc3VyZmFjZTogaW50ZW5zaXR5IGhpc3RvZ3JhbSBvZiB0aGUgYXNzZW1ibGVkIChkb3duc2FtcGxlZCkgdWludDggdm9sdW1lIGZvciB0aGVcbiAgICAvLyByZXF1ZXN0ZWQgY2hhbm5lbCAobXVsdGljaGFubmVsKSBvciB0aGUgc2luZ2xlIGdyYXlzY2FsZSB2b2x1bWUgKGtleSAwKS5cbiAgICBpZiAodGhpcy52b2x1bWVDaGFubmVsRGF0YS5zaXplKSB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy52b2x1bWVDaGFubmVsRGF0YS5nZXQoY2hhbm5lbEluZGV4KSA/PyB0aGlzLnZvbHVtZUNoYW5uZWxEYXRhLmdldCgwKTtcbiAgICAgIHJldHVybiBkYXRhID8gdGhpcy50b0lIaXN0b2dyYW0oaGlzdG9ncmFtU2NhbGFyKGRhdGEsIGJpbnMsIDAsIDI1NSkpIDogbnVsbDtcbiAgICB9XG4gICAgLy8gVGlsZWQgbW9kZSBoYXMgbm8gZnVsbCBpbi1tZW1vcnkgcGl4ZWxzIOKGkiB1c2UgdGhlIGNvYXJzZSBwZXItY2hhbm5lbCBzYW1wbGUgKFJHQjogcmVhZGJhY2spLlxuICAgIGlmICh0aGlzLnRpbGVkKSB7XG4gICAgICBpZiAodGhpcy5pbWFnZU1vZGUgPT09ICdyZ2InKSByZXR1cm4gdGhpcy5yZ2JIaXN0b2dyYW0oY2hhbm5lbEluZGV4LCBiaW5zKTtcbiAgICAgIGNvbnN0IHNhbXBsZSA9IHRoaXMuaGlzdFNhbXBsZXMuZ2V0KHRoaXMuaW1hZ2VNb2RlID09PSAnZ3JheXNjYWxlJyA/IDAgOiBjaGFubmVsSW5kZXgpO1xuICAgICAgcmV0dXJuIHNhbXBsZSA/IHRoaXMudG9JSGlzdG9ncmFtKGhpc3RvZ3JhbVNjYWxhcihzYW1wbGUsIGJpbnMsIDAsIDI1NSkpIDogbnVsbDtcbiAgICB9XG4gICAgLy8gR3JheXNjYWxlL211bHRpY2hhbm5lbCAoc3RpdGNoKTogbmF0aXZlIHBlci1jaGFubmVsIGhpc3RvZ3JhbSBzdHJhaWdodCBmcm9tIHRoZSBpbi1tZW1vcnlcbiAgICAvLyBzY2FsYXIgbGF5ZXIgKG5vIEdQVSByZWFkYmFjaykuIFJHQjogYmluIHRoZSBkaXNwbGF5ZWQgcGl4ZWxzJyBSL0cvQiBieXRlICg4LWJpdCBjbGllbnQgcGF0aCkuXG4gICAgY29uc3QgbGF5ZXIgPSB0aGlzLmNoYW5uZWxWaWV3Py5sYXllcnNbdGhpcy5pbWFnZU1vZGUgPT09ICdncmF5c2NhbGUnID8gMCA6IGNoYW5uZWxJbmRleF07XG4gICAgaWYgKGxheWVyKSB7XG4gICAgICBjb25zdCBoID0gdi5sYXllckhpc3RvZ3JhbShsYXllciwgYmlucyk7XG4gICAgICBpZiAoaCkgcmV0dXJuIHRoaXMudG9JSGlzdG9ncmFtKGgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbWFnZU1vZGUgPT09ICdyZ2InKSByZXR1cm4gdGhpcy5yZ2JIaXN0b2dyYW0oY2hhbm5lbEluZGV4LCBiaW5zKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBnZXRIaXN0b2dyYW0kKGNoYW5uZWxJbmRleDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBPYnNlcnZhYmxlPElIaXN0b2dyYW0gfCBudWxsPiB7XG4gICAgLy8gPjgtYml0IGNoYW5uZWxzOiBmZXRjaCB0aGUgdHJ1ZSBuYXRpdmUgZGlzdHJpYnV0aW9uIGZyb20gdGhlIHNlcnZlciAodGhlIGRpc3BsYXllZCBwaXhlbHNcbiAgICAvLyBhcmUgOC1iaXQsIHNvIHRoZSBjbGllbnQgaGlzdG9ncmFtIHdvdWxkIGJlIGNsaXBwZWQpLiA4LWJpdCBjaGFubmVscyB1c2UgdGhlIGNsaWVudCBwYXRoLlxuICAgIGNvbnN0IGJpdERlcHRoID0gdGhpcy5kZXNjcmlwdG9yPy5jaGFubmVsSW5mbz8uW2NoYW5uZWxJbmRleF0/LmJpdERlcHRoID8/IDg7XG4gICAgaWYgKGJpdERlcHRoID4gOCkge1xuICAgICAgY29uc3QgeiA9IHRoaXMubG9hZGVkPy56ID8/IDA7XG4gICAgICBjb25zdCBrZXkgPSBgJHt6fXwke2NoYW5uZWxJbmRleH1gO1xuICAgICAgY29uc3QgY2FjaGVkID0gdGhpcy5uYXRpdmVIaXN0b2dyYW1zLmdldChrZXkpO1xuICAgICAgaWYgKGNhY2hlZCkgcmV0dXJuIG9mKGNhY2hlZCk7XG4gICAgICByZXR1cm4gZnJvbSh0aGlzLmZldGNoTmF0aXZlSGlzdG9ncmFtKGNoYW5uZWxJbmRleCwgYmlucywgeiwga2V5KSk7XG4gICAgfVxuICAgIHJldHVybiBvZih0aGlzLmdldEhpc3RvZ3JhbShjaGFubmVsSW5kZXgsIGJpbnMpKTtcbiAgfVxuXG4gIC8qKiBGZXRjaCArIGNhY2hlIG9uZSBjaGFubmVsJ3MgbmF0aXZlLWJpdC1kZXB0aCBoaXN0b2dyYW0gZnJvbSBgR0VUIC9oaXN0b2dyYW1gICg+OC1iaXQpLiAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoTmF0aXZlSGlzdG9ncmFtKFxuICAgIGNoYW5uZWw6IG51bWJlcixcbiAgICBiaW5zOiBudW1iZXIsXG4gICAgejogbnVtYmVyLFxuICAgIGtleTogc3RyaW5nLFxuICApOiBQcm9taXNlPElIaXN0b2dyYW0gfCBudWxsPiB7XG4gICAgY29uc3QgaW5mb0I2NCA9IHRoaXMudGlsZXMuZ2V0U2VsZWN0ZWRJbmZvQjY0KCk7XG4gICAgaWYgKCFpbmZvQjY0KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgdGhpcy50aWxlc1xuICAgICAgLmdldEF1dGhIZWFkZXJzKClcbiAgICAgIC5jYXRjaCgoKSA9PiAoe30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuYXBpfWhpc3RvZ3JhbT9pbmZvPSR7aW5mb0I2NH0mY2hhbm5lbD0ke2NoYW5uZWx9Jno9JHt6fSZiaW5zPSR7Ymluc31gO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgICBpZiAoIXJlc3Aub2spIHJldHVybiBudWxsOyAvLyAyMDIgKHN0aWxsIGNhY2hpbmcpIG9yIHRyYW5zaWVudCDihpIgbnVsbDsgdGhlIHBhbmUgcmV0cmllc1xuICAgICAgY29uc3QgaGkgPSAoYXdhaXQgcmVzcC5qc29uKCkpIGFzIHtcbiAgICAgICAgYml0RGVwdGg6IG51bWJlcjtcbiAgICAgICAgcmFuZ2VNaW46IG51bWJlcjtcbiAgICAgICAgcmFuZ2VNYXg6IG51bWJlcjtcbiAgICAgICAgb2JzZXJ2ZWRNaW46IG51bWJlcjtcbiAgICAgICAgb2JzZXJ2ZWRNYXg6IG51bWJlcjtcbiAgICAgICAgYmluV2lkdGg6IG51bWJlcjtcbiAgICAgICAgY291bnRzOiBudW1iZXJbXTtcbiAgICAgIH07XG4gICAgICBpZiAoIWhpPy5jb3VudHMpIHJldHVybiBudWxsO1xuICAgICAgY29uc3Qgb3V0OiBJSGlzdG9ncmFtID0ge1xuICAgICAgICBiaW5zOiBoaS5jb3VudHMubWFwKChfLCBpKSA9PiBoaS5yYW5nZU1pbiArIGkgKiBoaS5iaW5XaWR0aCksXG4gICAgICAgIGNvdW50czogaGkuY291bnRzLFxuICAgICAgICBtYXg6IGhpLmNvdW50cy5yZWR1Y2UoKG0sIGMpID0+IChjID4gbSA/IGMgOiBtKSwgMCksXG4gICAgICAgIGJpdERlcHRoOiBoaS5iaXREZXB0aCxcbiAgICAgICAgcmFuZ2VNaW46IGhpLnJhbmdlTWluLFxuICAgICAgICByYW5nZU1heDogaGkucmFuZ2VNYXgsXG4gICAgICAgIG9ic2VydmVkTWluOiBoaS5vYnNlcnZlZE1pbixcbiAgICAgICAgb2JzZXJ2ZWRNYXg6IGhpLm9ic2VydmVkTWF4LFxuICAgICAgfTtcbiAgICAgIHRoaXMubmF0aXZlSGlzdG9ncmFtcy5zZXQoa2V5LCBvdXQpO1xuICAgICAgcmV0dXJuIG91dDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gbmF0aXZlIGhpc3RvZ3JhbSBmZXRjaCBmYWlsZWQnLCBlcnIpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqIFBlci1jaGFubmVsIGhpc3RvZ3JhbSBvZiB0aGUgZGlzcGxheWVkIFJHQiBjb21wb3NpdGUgKFIvRy9CIGJ5dGUpLCBmcm9tIHRoZSBsYXN0IHJlYWRiYWNrLiAqL1xuICBwcml2YXRlIHJnYkhpc3RvZ3JhbShjaGFubmVsSW5kZXg6IG51bWJlciwgYmluczogbnVtYmVyKTogSUhpc3RvZ3JhbSB8IG51bGwge1xuICAgIGNvbnN0IHB4ID0gdGhpcy5sYXN0UGl4ZWxzO1xuICAgIGlmICghcHgpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGJhbmQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyLCBjaGFubmVsSW5kZXgpKTtcbiAgICBjb25zdCBuID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oMjU2LCBNYXRoLmZsb29yKGJpbnMpIHx8IDI1NikpO1xuICAgIGNvbnN0IGNvdW50cyA9IG5ldyBBcnJheShuKS5maWxsKDApO1xuICAgIGNvbnN0IGRhdGEgPSBweC5kYXRhO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgaWYgKGRhdGFbaSArIDNdID09PSAwKSBjb250aW51ZTsgLy8gc2tpcCB0cmFuc3BhcmVudCBwYWRkaW5nXG4gICAgICBjb3VudHNbTWF0aC5taW4obiAtIDEsIChkYXRhW2kgKyBiYW5kXSAqIG4pID4+IDgpXSsrO1xuICAgIH1cbiAgICBjb25zdCBiaW5zQXJyID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogbiB9LCAoXywgaSkgPT4gKGkgKiAyNTYpIC8gbik7XG4gICAgcmV0dXJuIHsgYmluczogYmluc0FyciwgY291bnRzLCBtYXg6IGNvdW50cy5yZWR1Y2UoKG0sIGMpID0+IChjID4gbSA/IGMgOiBtKSwgMCkgfTtcbiAgfVxuICBleHBvcnRDb21wb3NpdGUoKTogdm9pZCB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIHZvaWQgdi5zY3JlZW5zaG90KCkudGhlbigoYmxvYikgPT4ge1xuICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICBhLmhyZWYgPSB1cmw7XG4gICAgICBhLmRvd25sb2FkID0gJ25hcGFyaS1qcy5wbmcnO1xuICAgICAgYS5jbGljaygpO1xuICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xuICAgIH0pO1xuICB9XG4gIC8qKiBOYXRpdmUtYml0LWRlcHRoICgxNi8zMi1iaXQpIG11bHRpLWJhbmQgVElGRiBleHBvcnQgdmlhIHRoZSBzZXJ2ZXIgYC9leHBvcnQvdGlmZmAgZW5kcG9pbnQg4oCUXG4gICAqICB0aGUgZGlzcGxheWVkIFBORyBpcyBhbiA4LWJpdCBmaWd1cmUsIHRoaXMgcHJlc2VydmVzIHRoZSB0cnVlIHBpeGVsIHZhbHVlcy4gVmlzaWJsZSBjaGFubmVsc1xuICAgKiAgb25seSAob21pdHRlZCB3aGVuIGFsbCBhcmUgdmlzaWJsZSDihpIgc2VydmVyIGRlZmF1bHQpLiBNaXJyb3JzIHRoZSBPU0QgYmFja2VuZC4gKi9cbiAgYXN5bmMgZXhwb3J0RGF0YSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpbmZvQjY0ID0gdGhpcy50aWxlcy5nZXRTZWxlY3RlZEluZm9CNjQoKTtcbiAgICBpZiAoIWluZm9CNjQpIHJldHVybjtcbiAgICBjb25zdCBzdGF0ZXMgPSB0aGlzLnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKCk7XG4gICAgY29uc3QgdmlzaWJsZSA9IHN0YXRlcy5maWx0ZXIoKGMpID0+IGMudmlzaWJsZSkubWFwKChjKSA9PiBjLmluZGV4KTtcbiAgICBjb25zdCBjaFBhcmFtID1cbiAgICAgIHZpc2libGUubGVuZ3RoICYmIHZpc2libGUubGVuZ3RoIDwgc3RhdGVzLmxlbmd0aCA/IGAmY2hhbm5lbHM9JHt2aXNpYmxlLmpvaW4oJywnKX1gIDogJyc7XG4gICAgY29uc3QgeiA9IHRoaXMubG9hZGVkPy56ID8/IDA7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5hcGl9ZXhwb3J0L3RpZmY/aW5mbz0ke2luZm9CNjR9Jno9JHt6fSR7Y2hQYXJhbX1gO1xuICAgIGNvbnN0IHN0ZW0gPSAodGhpcy5sb2FkZWQ/LmZpbGVuYW1lIHx8ICdpbWFnZScpLnJlcGxhY2UoL1xcLlteLl0rJC8sICcnKTtcbiAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgdGhpcy50aWxlc1xuICAgICAgLmdldEF1dGhIZWFkZXJzKClcbiAgICAgIC5jYXRjaCgoKSA9PiAoe30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgICBpZiAocmVzcC5zdGF0dXMgPT09IDIwMikge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIDE2LWJpdCBleHBvcnQ6IGZpbGUgc3RpbGwgY2FjaGluZyDigJQgdHJ5IGFnYWluIHNob3J0bHkuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghcmVzcC5vaykgdGhyb3cgbmV3IEVycm9yKGBzdGF0dXMgJHtyZXNwLnN0YXR1c31gKTtcbiAgICAgIHNhdmVBcyhhd2FpdCByZXNwLmJsb2IoKSwgYCR7c3RlbX1fMTZiaXQub21lLnRpZmApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSAxNi1iaXQgVElGRiBleHBvcnQgZmFpbGVkJywgZXJyKTtcbiAgICB9XG4gIH1cbiAgdW5zdWJzY3JpYmUoKTogdm9pZCB7XG4gICAgdGhpcy5yZXNldCgpO1xuICB9XG59XG4iXX0=
|
|
4341
|
+
/**
|
|
4342
|
+
* Additively composite grayscale channel images, each tinted with its display colour —
|
|
4343
|
+
* the navigator's picture of a multichannel image.
|
|
4344
|
+
*/
|
|
4345
|
+
function tintedComposite(images, colors) {
|
|
4346
|
+
const w = images[0]?.width ?? 1;
|
|
4347
|
+
const h = images[0]?.height ?? 1;
|
|
4348
|
+
const out = document.createElement('canvas');
|
|
4349
|
+
out.width = w;
|
|
4350
|
+
out.height = h;
|
|
4351
|
+
const ctx = out.getContext('2d');
|
|
4352
|
+
ctx.fillStyle = '#000';
|
|
4353
|
+
ctx.fillRect(0, 0, w, h);
|
|
4354
|
+
const tmp = document.createElement('canvas');
|
|
4355
|
+
tmp.width = w;
|
|
4356
|
+
tmp.height = h;
|
|
4357
|
+
const t = tmp.getContext('2d');
|
|
4358
|
+
images.forEach((img, i) => {
|
|
4359
|
+
t.globalCompositeOperation = 'source-over';
|
|
4360
|
+
t.drawImage(img, 0, 0, w, h);
|
|
4361
|
+
t.globalCompositeOperation = 'multiply';
|
|
4362
|
+
t.fillStyle = colors[i];
|
|
4363
|
+
t.fillRect(0, 0, w, h);
|
|
4364
|
+
ctx.globalCompositeOperation = 'lighter';
|
|
4365
|
+
ctx.drawImage(tmp, 0, 0);
|
|
4366
|
+
});
|
|
4367
|
+
return out;
|
|
4368
|
+
}
|
|
4369
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXZpc3VhbGl6ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL25hcGFyaS1qcy9uYXBhcmktdmlzdWFsaXplci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQ08sZUFBZSxFQUFFLE9BQU8sRUFBZ0IsYUFBYSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQzVFLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEVBQ0wsTUFBTSxFQUNOLGVBQWUsRUFDZixlQUFlLEVBQ2YsWUFBWSxFQUNaLGVBQWUsRUFDZixXQUFXLEVBQ1gsUUFBUSxFQUNSLHFCQUFxQixFQUNyQixzQkFBc0IsR0FDdkIsTUFBTSxXQUFXLENBQUM7QUFnQm5CLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxXQUFXLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFJeEYsT0FBTyxFQUFFLGdCQUFnQixFQUFPLE1BQU0sOEJBQThCLENBQUM7QUFDckUsT0FBTyxFQUFFLGlCQUFpQixFQUFtQixNQUFNLHlDQUF5QyxDQUFDO0FBQzdGLE9BQU8sRUFDMkMsY0FBYyxFQUFFLG1CQUFtQixHQUNwRixNQUFNLDBDQUEwQyxDQUFDO0FBRWxELE9BQU8sRUFDTCxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUNwRSxxQkFBcUIsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxxQkFBcUIsRUFDbkYseUJBQXlCLEVBQUUsb0JBQW9CLEdBQ2hELE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBDQUEw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Q0FBQztRQUN4QixDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLEdBQUcsQ0FBQyx3QkFBd0IsR0FBRyxTQUFTLENBQUM7UUFDekMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzNCLENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgT2JzZXJ2YWJsZSwgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGNvbWJpbmVMYXRlc3QsIGZyb20sIG9mLCBmaXJzdFZhbHVlRnJvbSxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJ2ltYWdlLWpzJztcbmltcG9ydCB7IHNhdmVBcyB9IGZyb20gJ2ZpbGUtc2F2ZXInO1xuaW1wb3J0IHtcbiAgVmlld2VyLFxuICBoaXN0b2dyYW1TY2FsYXIsXG4gIGNvbG9ybWFwRnJvbUx1dCxcbiAgdGludENvbG9ybWFwLFxuICByZXZlcnNlQ29sb3JtYXAsXG4gIGhlaWdodEZpZWxkLFxuICBMVVRfU0laRSxcbiAgTXVsdGlDaGFubmVsSW1hZ2VWaWV3LFxuICBNdWx0aUNoYW5uZWxWb2x1bWVWaWV3LFxufSBmcm9tICduYXBhcmktanMnO1xuaW1wb3J0IHR5cGUge1xuICBBeGVzTGF5ZXIsXG4gIEltYWdlTGF5ZXIsXG4gIFN1cmZhY2VMYXllcixcbiAgVm9sdW1lTGF5ZXIsXG4gIFBvaW50c0xheWVyLFxuICBQb2ludHMzRExheWVyLFxuICBUaWxlZFNvdXJjZSxcbiAgVGlsZUtleSxcbiAgUGl4ZWxDaHVuayxcbiAgQ2hhbm5lbFZpZXcsXG4gIFZvbHVtZUNoYW5uZWwsXG4gIENvbG9ybWFwLFxuICBQcm9qZWN0ZWRQb2ludHMsXG59IGZyb20gJ25hcGFyaS1qcyc7XG5pbXBvcnQgeyBuZWFyZXN0UHJvamVjdGVkSW5kZXgsIFNjcmVlbkluZGV4LCBTQ1JFRU5fSU5ERVhfTUlOX1BPSU5UUyB9IGZyb20gJ25hcGFyaS1qcyc7XG5cbmltcG9ydCB7IElJbWFnZUluZm8gfSBmcm9tICcuLi8uLi9jb250cmFjdHMvaW1hZ2UuY29udHJhY3QnO1xuaW1wb3J0IHsgSUNoYW5uZWxTdGF0ZSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jaGFubmVsLWhpc3RvZ3JhbS1hcGkuY29udHJhY3QnO1xuaW1wb3J0IHsgYnVpbGRDb2xvcm1hcEx1dCwgUmdiIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NvbG9ybWFwLWx1dCc7XG5pbXBvcnQgeyBTUEFUSUFMX0RBVEFfUE9SVCwgU3BhdGlhbERhdGFQb3J0IH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3BvcnRzL3NwYXRpYWwtZGF0YS5wb3J0JztcbmltcG9ydCB7XG4gIFNwYXRpYWxDb2x1bW4sIFNwYXRpYWxEYXRhc2V0LCBTcGF0aWFsSW1hZ2VSZWYsIGZpbmRDb2x1bW5NZXRhLCBpc0NhdGVnb3JpY2FsQ29sdW1uLFxufSBmcm9tICcuLi8uLi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0JztcbmltcG9ydCB7IFNwYXRpYWxWaWV3U3RhdGUgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQge1xuICBjb250cmFzdFdpbmRvdywgZW5jb2RlQ2F0ZWdvcmljYWwsIGVuY29kZUNvbnRpbnVvdXMsIG1hcmtlckRpYW1ldGVycyxcbiAgcmVzb2x2ZUNhdGVnb3J5Q29sb3JzLCB0b1JnYmFUdXBsZXMsIHBhcnNlSGV4LCBNSVNTSU5HX0NPTE9SLCBERUZBVUxUX01VVEVEX09QQUNJVFksXG4gIFNQQVRJQUxfM0RfTUFYX0NBVEVHT1JJRVMsIHNwYXRpYWxDb250aW51b3VzTHV0LFxufSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtZW5jb2RpbmcnO1xuaW1wb3J0IHsgTk9fQ0FURUdPUlkgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0JztcbmltcG9ydCB7IFNwYXRpYWxPYnNlcnZhdGlvbnMgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0JztcbmltcG9ydCB7XG4gIFNwYXRpYWxTZWxlY3Rpb25NYXNrLCBlbXB0eVNlbGVjdGlvbiwgbWFza1RvSW5kaWNlcywgbXV0ZWRGcm9tU2VsZWN0aW9uLCBzYW1lU2VsZWN0aW9uLFxuICBzZWxlY3RCeUNhdGVnb3J5LFxufSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtc2VsZWN0aW9uJztcbmltcG9ydCB7IGZyYW1lUG9zaXRpb25zIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLWZyYW1pbmcnO1xuaW1wb3J0IHsgUElYRUxfV09STERfUVVBTlRVTSwgd29ybGRRdWFudHVtRm9yRXh0ZW50IH0gZnJvbSAnLi4vLi4vc3BhdGlhbC93b3JsZC1ncmlkJztcbmltcG9ydCB7IG9ic2VydmF0aW9uc0luU2xpY2UsIHZvbHVtZUltYWdlUmVmIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLXZvbHVtZS1pbWFnZSc7XG5pbXBvcnQgeyBkZWZhdWx0U2lnbWEsIGRlbnNpdHlHcmlkLCByYXN0ZXJpemVEZW5zaXR5IH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLWRlbnNpdHknO1xuaW1wb3J0IHsgb2JzZXJ2YXRpb25zSW5TZWN0aW9uLCBzZWN0aW9uc09mIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLXNlY3Rpb25zJztcbmltcG9ydCB7IHR5cGUgSG92ZXJTb3VyY2UsIGhvdmVyVGV4dCwgbmVhcmVzdE9ic2VydmF0aW9uIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLWhvdmVyJztcbmltcG9ydCB7IE5hcGFyaVNwYXRpYWxUb29sdGlwIH0gZnJvbSAnLi9uYXBhcmktc3BhdGlhbC10b29sdGlwJztcbmltcG9ydCB7IE5hcGFyaVNwYXRpYWxUaWxlTGF5ZXJzLCBUcmFuc2NyaXB0RXN0aW1hdGUgfSBmcm9tICcuL25hcGFyaS1zcGF0aWFsLXRpbGVzJztcbmltcG9ydCB7IE5hcGFyaU5hdmlnYXRvciB9IGZyb20gJy4vbmFwYXJpLW5hdmlnYXRvcic7XG5pbXBvcnQgeyBjZWxsVHlwZUNvbHVtbkZvciB9IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC10aWxlcyc7XG5pbXBvcnQgeyBOQVBBUklfV0hFRUxfWk9PTV9TUEVFRCB9IGZyb20gJy4vbmFwYXJpLXpvb20nO1xuXG4vKipcbiAqIEEgc2hvcnQsIHN0YWJsZSBpZCBmb3IgYSBjb2xvcm1hcCB2YWx1ZSwgZm9yIGNhY2hlIGtleXMuXG4gKlxuICogSGFsZiB0aGUgbGlicmFyeSdzIGNvbG9ybWFwcyBhcmUgTkFNRVMgYW5kIGhhbGYgYXJlIGlubGluZSBgW3N0b3AsIGNvbG91cl1gXG4gKiBhcnJheXMgb2YgMjU2IGVudHJpZXMuIFN0cmluZ2lmeWluZyB0aGUgYXJyYXkga2luZCB3b3VsZCBwdXQgNiBLQiBpbiBhIGtleSB0aGF0XG4gKiBpcyByZWJ1aWx0IGFuZCBjb21wYXJlZCBvbiBldmVyeSB2aWV3IGNoYW5nZTsgaGFzaGluZyBpdCBrZWVwcyB0aGUga2V5IHNtYWxsLFxuICogYW5kIGl0IG9ubHkgaGFzIHRvIGRpc3Rpbmd1aXNoIG9uZSBjb2xvcm1hcCBmcm9tIGFub3RoZXIuXG4gKi9cbmZ1bmN0aW9uIGNvbG9ybWFwSWQodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuICcnO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIHZhbHVlO1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gJz8nO1xuICAvLyBGTlYtMWEgb3ZlciB0aGUgc3RvcHMuIEEgY29sbGlzaW9uIHdvdWxkIGxlYXZlIGEgc3RhbGUgY29sb3VyaW5nIG9uIHNjcmVlbixcbiAgLy8gbm90IGNvcnJ1cHQgYW55dGhpbmcsIGFuZCAzMiBiaXRzIG92ZXIgYSBmZXcgaHVuZHJlZCBjb2xvcm1hcHMgd2lsbCBub3QuXG4gIGxldCBoYXNoID0gMHg4MTFjOWRjNTtcbiAgY29uc3QgdGV4dCA9IHZhbHVlLm1hcCgoc3RvcCkgPT4gU3RyaW5nKHN0b3ApKS5qb2luKCcsJyk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xuICAgIGhhc2ggXj0gdGV4dC5jaGFyQ29kZUF0KGkpO1xuICAgIGhhc2ggPSBNYXRoLmltdWwoaGFzaCwgMHgwMTAwMDE5Myk7XG4gIH1cbiAgcmV0dXJuIGAjJHsoaGFzaCA+Pj4gMCkudG9TdHJpbmcoMzYpfWA7XG59XG5cbi8qKlxuICogSW4tcGxhbmUgY29hcnNlbmluZyBvZiB0aGUgM0QgZ2VuZSBtYXAncyBsYXR0aWNlLCByZWxhdGl2ZSB0byB0aGUgcmVmZXJlbmNlXG4gKiB2b2x1bWUuIFRoZSBmaWVsZCBpcyBzbW9vdGgsIHNvIGl0cyBkZXRhaWwgaXMgc2V0IGJ5IHRoZSBrZXJuZWwgcmF0aGVyIHRoYW4gdGhlXG4gKiByYXN0ZXIg4oCUIGFuZCB0aGUgZXN0aW1hdGUgaXMgYSBwYWlyIG9mIHNlcGFyYWJsZSBibHVycyBvbiB0aGUgbWFpbiB0aHJlYWQsIHdoaWNoXG4gKiBhdCB0aGUgdGVtcGxhdGUncyBmdWxsIHJlc29sdXRpb24gbWVhbnMgc2Vjb25kcyBvZiBmcm96ZW4gVUkgcGVyIHRvZ2dsZS5cbiAqL1xuY29uc3QgR0VORV9NQVBfVk9MVU1FX1NUUklERSA9IDI7XG5pbXBvcnQge1xuICB0eXBlIEV4cHJlc3Npb25GaWVsZCwgdHlwZSBFeHByZXNzaW9uVm9sdW1lRmllbGQsIGNvbG9yRXhwcmVzc2lvbkZpZWxkLFxuICBlbmNvZGVFeHByZXNzaW9uVm9sdW1lLCBleHByZXNzaW9uRmllbGQsIGV4cHJlc3Npb25Wb2x1bWUsXG59IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1leHByZXNzaW9uJztcbmltcG9ydCB7IFNwYXRpYWxTZWxlY3Rpb25TdG9yZSB9IGZyb20gJy4uLy4uL3N0b3JlL3NwYXRpYWwtc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgUGxvdFR5cGUsXG4gIFBsb3RUeXBlRGVzY3JpcHRvcixcbiAgUExPVF9UWVBFX0RFU0NSSVBUT1JTLFxuICBpc05hcGFyaTNkLFxuICBpc05hcGFyaUlzb3N1cmZhY2UsXG4gIGlzTmFwYXJpU3VyZmFjZSxcbiAgaXNOYXBhcmlTY2F0dGVyLFxuICBpc05hcGFyaVNjYXR0ZXIzZCxcbiAgaXNTcGF0aWFsT21pY3MsXG4gIGlzU3BhdGlhbE9taWNzM2QsXG4gIE5BUEFSSV9ERUZBVUxUX0RFQ0lNQVRFLFxufSBmcm9tICcuLi8uLi9jb250cmFjdHMvcGxvdC10eXBlJztcbmltcG9ydCB7XG4gIElWaXN1YWxpemVyLFxuICBQaXhlbERhdGEsXG4gIEludGVuc2l0eVByb2ZpbGUsXG4gIElJc29zdXJmYWNlQ29udHJvbHMsXG4gIElJbnRlbnNpdHlDb250cm9scyxcbiAgSVN1cmZhY2UzZENvbnRyb2xzLFxufSBmcm9tICcuLi8uLi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5pbXBvcnQge1xuICBWaWV3ZXJDYXBhYmlsaXRpZXMsXG4gIFZpZXdlckZlYXR1cmUsXG4gIGNhcGFiaWxpdGllc09mLFxufSBmcm9tICcuLi8uLi9jb250cmFjdHMvY2FwYWJpbGl0aWVzLmNvbnRyYWN0JztcbmltcG9ydCB7IElSZWdpb25PdmVybGF5IH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3JlZ2lvbi1vdmVybGF5LmNvbnRyYWN0JztcbmltcG9ydCB7IElIaXN0b2dyYW0gfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY2hhbm5lbC1oaXN0b2dyYW0tYXBpLmNvbnRyYWN0JztcbmltcG9ydCB7IENvbG9ybWFwTm9kZSwgSVdhbmRPcHRpb25zLCBJQnJ1c2hPcHRpb25zIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2Rpc3BsYXktdHlwZXMnO1xuaW1wb3J0IHsgVklaX0NPTkZJRywgVml6Q29uZmlnIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Zpei1jb25maWcnO1xuaW1wb3J0IHsgVElMRV9BQ0NFU1NfUE9SVCwgVGlsZUFjY2Vzc1BvcnQgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvcG9ydHMvdGlsZS1hY2Nlc3MucG9ydCc7XG5pbXBvcnQgeyBCYXNlU3RvcmVWaXN1YWxpemVyIH0gZnJvbSAnLi4vYmFzZS1zdG9yZS12aXN1YWxpemVyJztcbmltcG9ydCB7IFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZSB9IGZyb20gJy4uL3NpbXBsZS1zbGljZS1hY2Nlc3Muc2VydmljZSc7XG5pbXBvcnQgeyBWaXN1YWxpemVyU3RvcmUgfSBmcm9tICcuLi8uLi9zdG9yZS92aXN1YWxpemVyLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVnaW9uU3RvcmUgfSBmcm9tICcuLi8uLi9zdG9yZS9yZWdpb24tc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBOYXBhcmlTY2FsZUJhciwgU2NhbGVCYXJDYW1lcmEsIGZvcm1hdFVtIH0gZnJvbSAnLi9uYXBhcmktc2NhbGUtYmFyJztcbmltcG9ydCB7IE5hcGFyaVJlZ2lvbk92ZXJsYXksIE92ZXJsYXlWaWV3ZXIgfSBmcm9tICcuL25hcGFyaS1yZWdpb24tb3ZlcmxheSc7XG5pbXBvcnQgeyBOYXBhcmlBeGVzTGFiZWxzLCBBeGlzTGFiZWxTcGVjIH0gZnJvbSAnLi9uYXBhcmktYXhlcy1sYWJlbHMnO1xuaW1wb3J0IHsgTmFwYXJpVm9sdW1lWkhhbmRsZSB9IGZyb20gJy4vbmFwYXJpLXZvbHVtZS16LWhhbmRsZSc7XG5pbXBvcnQge1xuICBJQ29vcmRpbmF0ZVRyYW5zZm9ybSxcbn0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2Nvb3JkaW5hdGUtdHJhbnNmb3JtLmNvbnRyYWN0JztcbmltcG9ydCB7IFdhbmRUb29sU2VydmljZSwgV2FuZFRvb2xIb3N0LCBDYWNoZWRJbWFnZURhdGEgfSBmcm9tICcuLi8uLi90b29sYmFyL3dhbmQvd2FuZC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgV2FuZE9wdGlvbnMgfSBmcm9tICcuLi8uLi90b29sYmFyL3dhbmQvd2FuZC5zZXJ2aWNlJztcbmltcG9ydCB7IEJydXNoVG9vbFNlcnZpY2UsIEJydXNoT3B0aW9ucyB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvYnJ1c2gvYnJ1c2gtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIFZlcnRleEVyYXNlclRvb2xTZXJ2aWNlLFxuICBWZXJ0ZXhFcmFzZXJUb29sSG9zdCxcbn0gZnJvbSAnLi4vLi4vdG9vbGJhci92ZXJ0ZXgtZXJhc2VyL3ZlcnRleC1lcmFzZXItdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIFpvb21Ub0JveFRvb2xTZXJ2aWNlLFxuICBab29tVG9Cb3hUb29sSG9zdCxcbn0gZnJvbSAnLi4vLi4vdG9vbGJhci96b29tLXRvLWJveC96b29tLXRvLWJveC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2FtVG9vbFNlcnZpY2UgfSBmcm9tICcuLi8uLi90b29sYmFyL3NlZ21lbnRhdGlvbi9zYW0tdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IFNhbVBvaW50VG9vbFNlcnZpY2UgfSBmcm9tICcuLi8uLi90b29sYmFyL3NlZ21lbnRhdGlvbi9zYW0tcG9pbnQtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IENlbGxTZWdtZW50VG9vbFNlcnZpY2UgfSBmcm9tICcuLi8uLi90b29sYmFyL3NlZ21lbnRhdGlvbi9jZWxsLXNlZ21lbnQtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IElDZWxsU2VnbWVudGVyLCBDRUxMX1NFR01FTlRFUiB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jZWxsLXNlZ21lbnRlci5jb250cmFjdCc7XG5cbi8qKiBJQ29vcmRpbmF0ZVRyYW5zZm9ybSBvdmVyIHRoZSBuYXBhcmkgY2FtZXJhOiBwb2ludGVyIGNsaWVudCBjb29yZHMg4oaUIGltYWdlL3dvcmxkIGNvb3Jkcy4gKi9cbmNsYXNzIE5hcGFyaUNvb3JkaW5hdGVUcmFuc2Zvcm0gaW1wbGVtZW50cyBJQ29vcmRpbmF0ZVRyYW5zZm9ybSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdmlld2VyOiB7XG4gICAgICBjYW52YXNUb1dvcmxkKGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKTogW251bWJlciwgbnVtYmVyXTtcbiAgICAgIHJlYWRvbmx5IGNhbWVyYTogeyB6b29tOiBudW1iZXIgfTtcbiAgICB9LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVhZHk6ICgpID0+IGJvb2xlYW4sXG4gICkge31cbiAgY2xpZW50VG9EYXRhKGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKTogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHtcbiAgICBjb25zdCBbeCwgeV0gPSB0aGlzLnZpZXdlci5jYW52YXNUb1dvcmxkKGNsaWVudFgsIGNsaWVudFkpO1xuICAgIHJldHVybiB7IHgsIHkgfTtcbiAgfVxuICBkYXRhTGVuZ3RoVG9TY3JlZW4oZGF0YUxlbmd0aDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZGF0YUxlbmd0aCAqIHRoaXMudmlld2VyLmNhbWVyYS56b29tOyAvLyBDU1MgcHggcGVyIHdvcmxkIHVuaXRcbiAgfVxuICBpc1JlYWR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbn1cblxuLyoqIE9wYXF1ZSBoYW5kbGUgZnJvbSB7QGxpbmsgTmFwYXJpVmlzdWFsaXplclNlcnZpY2UubG9hZH0sIHBhc3NlZCBiYWNrIHRvIHBsb3QoKS4gKi9cbmludGVyZmFjZSBOYXBhcmlMb2FkZWQge1xuICBpbWFnZUluZm86IElJbWFnZUluZm87XG4gIHo6IG51bWJlcjtcbiAgLyoqIE11c3QgbWF0Y2ggYElJbWFnZUluZm8uZmlsZU5hbWVgIOKAlCB0aGUgcmVuZGVyIG9yY2hlc3RyYXRvciBkcm9wcyB0aGUgcmVzdWx0IGlmIHRoZVxuICAgKiAgaGFuZGxlJ3MgYGZpbGVuYW1lYCBkb2Vzbid0IG1hdGNoIHRoZSByZXF1ZXN0ZWQgaW1hZ2UgKGd1YXJkcyBhZ2FpbnN0IHN0YWxlIGNsaWNrcykuICovXG4gIGZpbGVuYW1lOiBzdHJpbmc7XG59XG5cbmNvbnN0IFZPTFVNRV9NQVhfU0xJQ0UgPSAxMDI0OyAvLyBcIkZ1bGxcIiBpbi1wbGFuZSBjYXA7IHRoZSBkZWZhdWx0IMK8IGxvYWQgdXNlcyAyNTZcbi8qKiBSZWZlcmVuY2UgaW4tcGxhbmUgd29ybGQgc2l6ZSAobG9uZyBzaWRlKSBmb3IgdGhlIHZvbHVtZS9heGVzIGJveCwgaW4gYXJiaXRyYXJ5IHdvcmxkIHVuaXRzLlxuICogIFRoZSBib3ggaXMgYW5jaG9yZWQgdG8gdGhpcyByZWZlcmVuY2UgcmVnYXJkbGVzcyBvZiB0aGUgY2hvc2VuIGRlY2ltYXRlIGZhY3Rvciwgc28gY2hhbmdpbmcgdGhlXG4gKiAgcmVzb2x1dGlvbiBjaGFuZ2VzIERFVEFJTCwgbm90IHRoZSB2b2x1bWUncyBwcm9wb3J0aW9ucyAoWiBubyBsb25nZXIgYXBwZWFycyB0byBzaHJpbmsgd2hlbiB0aGVcbiAqICBpbi1wbGFuZSBzYW1wbGluZyBncm93cykuIFNldCB0byB0aGUgREVGQVVMVCBkZWNpbWF0ZSdzIGluLXBsYW5lIGNhcCBzbyB0aGUgZGVmYXVsdCB2aWV3IGlzXG4gKiAgdW5jaGFuZ2VkOyBoaWdoZXIvbG93ZXIgcmVzb2x1dGlvbnMga2VlcCB0aGF0IHNhbWUgc2hhcGUuIFNlZSB7QGxpbmsgbW91bnRWb2x1bWV9LiAqL1xuY29uc3QgVk9MVU1FX1dPUkxEX0lOUExBTkVfUkVGID0gVk9MVU1FX01BWF9TTElDRSAvIE5BUEFSSV9ERUZBVUxUX0RFQ0lNQVRFO1xuLyoqIE1heCBjb25jdXJyZW50IHNsaWNlIGZldGNoZXMgd2hlbiBhc3NlbWJsaW5nIGEgdm9sdW1lIOKAlCBrZWVwcyB0aGUgY29ubmVjdGlvbiBwb29sIGJ1c3lcbiAqICB3aXRob3V0IGZsb29kaW5nIGl0IChicm93c2VycyBjYXAgfjYvaG9zdCkgb24gYSBkZWVwIHN0YWNrLiAqL1xuY29uc3QgVk9MVU1FX0ZFVENIX0NPTkNVUlJFTkNZID0gODtcblxuLyoqIFZvbHVtZS9pc29zdXJmYWNlIHNhbXBsaW5nIGZvciBhIGRlY2ltYXRlIGZhY3RvciBgc2NhbGVgICgxID0gRnVsbCAxMDI0LCAyID0gwr0gNTEyLCA0ID0gwrwgMjU2XG4gKiAgZGVmYXVsdCwgOCA9IOKFmyAxMjgpOiB0aGUgaW4tcGxhbmUgY2FwIGhhbHZlcyBlYWNoIHN0ZXA7IHNsaWNlcyBzdGF5IHVuLXN1YnNhbXBsZWQgdW50aWwg4oWbLCB0aGVuXG4gKiAgc3Vic2FtcGxlLiAqL1xuZnVuY3Rpb24gdm9sdW1lUmVzb2x1dGlvbkZvcihzY2FsZTogbnVtYmVyKTogeyBtYXhTbGljZTogbnVtYmVyOyBzbGljZVN0ZXA6IG51bWJlciB9IHtcbiAgY29uc3QgcyA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoc2NhbGUpKTtcbiAgcmV0dXJuIHtcbiAgICBtYXhTbGljZTogTWF0aC5tYXgoOCwgTWF0aC5yb3VuZChWT0xVTUVfTUFYX1NMSUNFIC8gcykpLFxuICAgIHNsaWNlU3RlcDogTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihzIC8gNCkpLFxuICB9O1xufVxuLyoqIEZ1bGx5LW5vcm1hbGl6ZWQgaW50ZW5zaXR5IGhlaWdodCBhcyBhIGZyYWN0aW9uIG9mIHRoZSBpbi1wbGFuZSBleHRlbnQg4oCUIG1hdGNoZXMgdGhlIFBsb3RseVxuICogIFNVUkZBQ0Ugei1hc3BlY3QgKH4wLjQpIHNvIHRoZSByZWxpZWYgaXNuJ3QgZXhhZ2dlcmF0ZWQuICovXG5jb25zdCBTVVJGQUNFX1pfQVNQRUNUID0gMC40O1xuLyoqIFwiRnVsbFwiIG1lc2ggZ3JpZCBjYXA7IHRoZSBkZWNpbWF0ZSBmYWN0b3IgZGl2aWRlcyBpdCAoZGVmYXVsdCDCvCDihpIgMjIwLCDCvSDihpIgNDQwLCBGdWxsIOKGkiA4ODApLiAqL1xuY29uc3QgU1VSRkFDRV9NQVhfR1JJRCA9IDg4MDtcbi8qKiBDb2VmZmljaWVudCBzY2FsaW5nIHRoZSBweXJhbWlkIHRpbGUgYnVkZ2V0IHdpdGggdGhlIHRhcmdldCByZXNvbHV0aW9uIOKAlCBhIGhpZ2hlciB0YXJnZXQgcHVsbHMgYVxuICogIGZpbmVyIHB5cmFtaWQgbGV2ZWwgKG1vcmUgcmVhbCBkZXRhaWwpLiBTaGFyZWQgYnkgdGhlIHN1cmZhY2UgcGxhbmUgZmV0Y2ggKyB2b2x1bWUgYXNzZW1ibHkuICovXG5jb25zdCBTVElUQ0hfQlVER0VUX0NPRUZGID0gMTY7XG4vKiogU3VyZmFjZSBtZXNoIHRhcmdldCBncmlkIGZvciBhIGRlY2ltYXRlIGZhY3RvciBgc2NhbGVgOiB0aGUgZ3JpZCBjYXAgc2hyaW5rcyBieSBgc2NhbGVgIChldmVyeVxuICogIHNsaWNlIGlzIGtlcHQg4oCUIHRoZSB6LXNsaWRlciBuZWVkcyB0aGVtIGFsbCkuIFRoZSBzb3VyY2UgaXMgZmV0Y2hlZCBhdCBhIG1hdGNoaW5nIHJlc29sdXRpb24uICovXG5mdW5jdGlvbiBzdXJmYWNlUmVzb2x1dGlvbkZvcihzY2FsZTogbnVtYmVyKTogeyBtYXhHcmlkOiBudW1iZXIgfSB7XG4gIGNvbnN0IHMgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKHNjYWxlKSk7XG4gIHJldHVybiB7IG1heEdyaWQ6IE1hdGgubWF4KDE2LCBNYXRoLnJvdW5kKFNVUkZBQ0VfTUFYX0dSSUQgLyBzKSkgfTtcbn1cblxuLyoqIDNEIHNjYXR0ZXI6IGluLXBsYW5lIGNhcCBmb3IgdGhlIGFzc2VtYmxlZCB2b3hlbCBncmlkLCBhbmQgdGhlIG1heCBudW1iZXIgb2YgcG9pbnRzIGVtaXR0ZWRcbiAqICAodGhlIGdyaWQgaXMgZmxhdC1zdHJpZGVkIGRvd24gdG8gdGhpcykg4oCUIGtlZXBzIHRoZSBiaWxsYm9hcmQgY291bnQgaW50ZXJhY3RpdmUuICovXG5jb25zdCBTQ0FUVEVSM0RfTUFYX1hZID0gNjQ7XG5jb25zdCBTQ0FUVEVSM0RfTUFYX1BPSU5UUyA9IDE1MDAwMDtcblxuY29uc3QgVElMRV9TSVpFID0gNTEyOyAvLyBzZXJ2ZXIgdGlsZSBlZGdlIChtYXRjaGVzIHRoZSBPU0QgYmFja2VuZClcbi8qKiBNYXggdGlsZXMgc3RpdGNoZWQgZm9yIG9uZSBkaXNwbGF5ZWQgc2xpY2UgKDUxMnB4IHRpbGVzIOKGkiB1cCB0byB+NjE0NMKyIGF0IGZ1bGwgcmVzKS4gQmV5b25kXG4gKiAgdGhpcyB3ZSBzdGVwIHRvIGEgY29hcnNlciBweXJhbWlkIGxldmVsIHNvIGEgbGFyZ2UgaW1hZ2Ugc3RheXMgdHJhY3RhYmxlLiAqL1xuY29uc3QgTUFYX1NUSVRDSF9USUxFUyA9IDE0NDtcbi8qKiBXZWJHUFUgZGVmYXVsdCBgbWF4VGV4dHVyZURpbWVuc2lvbjJEYCDigJQgYSBzdGl0Y2hlZCBzbGljZSdzIGxvbmdlc3Qgc2lkZSBtdXN0IGZpdCBhIHRleHR1cmUuICovXG5jb25zdCBNQVhfVEVYVFVSRV9ESU0gPSA4MTkyO1xuLyoqIENvbmN1cnJlbnQgdGlsZSByZXF1ZXN0cyBwZXIgc3RpdGNoZWQgc2xpY2UuIEZpcmluZyBhIHdob2xlIGdyaWQgYXQgb25jZSAoaHVuZHJlZHMgb2YgcmVxdWVzdHNcbiAqICBmb3IgYSBsYXJnZSBsZXZlbCkgb3ZlcndoZWxtZWQgdGhlIHRpbGUgc2VydmVyICg1MDRzKTsgYSBzbWFsbCBwb29sIGtlZXBzIHRoZSBwaXBlIGZ1bGwgd2l0aG91dFxuICogIGZsb29kaW5nIGl0IOKAlCBhbmQgc2xpY2UtbGV2ZWwgd29ya2VycyBhbHJlYWR5IHJ1biBzZXZlcmFsIHN0aXRjaGVzIGluIHBhcmFsbGVsIG9uIHRvcCBvZiB0aGlzLiAqL1xuY29uc3QgVElMRV9GRVRDSF9DT05DVVJSRU5DWSA9IDY7XG4vKiogSG93IGxvbmcgdG8gcG9sbCBgL3RpbGVzL2luZm9gICgyMDIgd2hpbGUgdGhlIHNlcnZlciBjYWNoZXMgdGhlIHNvdXJjZSkgYmVmb3JlIGZhbGxpbmcgYmFjayB0b1xuICogIGEgc2luZ2xlIHRpbGUuIEdlbmVyb3VzIGxpa2UgdGhlIE9TRCBiYWNrZW5kIOKAlCBhIGNvbGQgd2hvbGUtc2xpZGUgY2FuIHRha2UgbWludXRlcyB0byBjYWNoZS4gKi9cbmNvbnN0IERFU0NSSVBUT1JfVElNRU9VVF9NUyA9IDEyMDAwMDtcblxuLyoqIERlZmF1bHQgcGVyLWNoYW5uZWwgdGludHMgKEZpamktc3R5bGUpIHdoZW4gdGhlIHN0b3JlL2Rlc2NyaXB0b3Igb2ZmZXJzIG5vIGNvbG91ci4gKi9cbmNvbnN0IERFRkFVTFRfVElOVFMgPSBbJyNmZjAwMDAnLCAnIzAwZmYwMCcsICcjMDAwMGZmJywgJyNmZmZmMDAnLCAnI2ZmMDBmZicsICcjMDBmZmZmJywgJyNmZmZmZmYnXTtcblxuLyoqIERlZmF1bHQgdGludCBmb3IgYSBjaGFubmVsIGluZGV4LCBjeWNsaW5nIHRoZSBGaWppIHBhbGV0dGUuICovXG5mdW5jdGlvbiB0aW50Rm9yKGNoYW5uZWw6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBERUZBVUxUX1RJTlRTW2NoYW5uZWwgJSBERUZBVUxUX1RJTlRTLmxlbmd0aF07XG59XG5cbi8qKiBPbmUgcHlyYW1pZCBsZXZlbCBmcm9tIGBHRVQgL3RpbGVzL2luZm9gIChyZXMgMCA9IGZ1bGwgcmVzb2x1dGlvbikuICovXG5pbnRlcmZhY2UgVGlsZUxldmVsIHtcbiAgcmVzOiBudW1iZXI7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xufVxuXG4vKiogU3Vic2V0IG9mIHRoZSBgL3RpbGVzL2luZm9gIGRlc2NyaXB0b3IgdGhpcyBiYWNrZW5kIHJlYWRzICh0aWxlIGdyaWQsIGNoYW5uZWxzLCBzY2FsZSkuICovXG5pbnRlcmZhY2UgVGlsZURlc2NyaXB0b3Ige1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbiAgdGlsZVNpemU6IG51bWJlcjtcbiAgejogbnVtYmVyO1xuICBjaGFubmVsczogbnVtYmVyO1xuICBtdWx0aWNoYW5uZWw/OiBib29sZWFuO1xuICAvKiogUmVhbCBCaW8tRm9ybWF0cyBsZXZlbHMgYXQgdGhlIGZyb250IG9mIGBsZXZlbHNgOyBwZXItY2hhbm5lbCB0aWxlcyBleGlzdCBvbmx5IHRoZXJlLiAqL1xuICByZWFsTGV2ZWxzPzogbnVtYmVyO1xuICBjaGFubmVsSW5mbz86IEFycmF5PHtcbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIGNvbG9yPzogc3RyaW5nO1xuICAgIGJpdERlcHRoPzogbnVtYmVyO1xuICAgIG1pbkFsbG93ZWQ/OiBudW1iZXI7XG4gICAgbWF4QWxsb3dlZD86IG51bWJlcjtcbiAgfT4gfCBudWxsO1xuICBsZXZlbHM6IFRpbGVMZXZlbFtdO1xuICBtcHBYPzogbnVtYmVyO1xuICBtcHBZPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEEgV2ViR1BVIGltYWdlIGJhY2tlbmQgYnVpbHQgb24gdGhlIHB1Ymxpc2hlZCBgbmFwYXJpLWpzYCBsaWJyYXJ5IOKAlCB0aGUgUE9DIGVuZ2luZSBmb3JcbiAqIGppdC11aSMxMDIgKGEgYnJvd3Nlci1iYXNlZCBuYXBhcmkgc2hpcHBlZCBhcyBhIEpTIGxpYnJhcnksIHN3YXBwaW5nIGltYWdlIHBsb3R0aW5nIHdpdGhcbiAqIE9wZW5TZWFkcmFnb24gYW5kIDNEIHNsaWNpbmcvaXNvc3VyZmFjZXMgd2l0aCBQbG90bHkpLlxuICpcbiAqIFJlbmRlciBzdHJhdGVneTogcmF0aGVyIHRoYW4gcmUtaW1wbGVtZW50IHRoZSBzZXJ2ZXIncyB0aWxlL3B5cmFtaWQgcHJvdG9jb2wgKHdoaWNoIE9TRFxuICogYWxyZWFkeSBoYW5kbGVzKSwgdGhpcyBiYWNrZW5kIHJlbmRlcnMgdGhlICoqY29tcGxldGUgcGVyLXNsaWNlIGltYWdlIFVSTHMgdGhlIGFwcCBhbHJlYWR5XG4gKiBwcm9kdWNlcyoqIChgSUltYWdlSW5mby51cmxzYCkg4oCUIGB1cmxzW3pdYCBmb3IgdGhlIDJEIGltYWdlLCBhbmQgdGhlIGZ1bGwgYHVybHNgIHN0YWNrXG4gKiBhc3NlbWJsZWQgaW50byBhIGRvd25zYW1wbGVkIHZvbHVtZSBmb3IgdGhlIDNEIHR5cGVzLiBSZWdpb24gc3RhdGUgYW5kIGRpc3BsYXkgb3B0aW9uc1xuICogZGVsZWdhdGUgdG8gdGhlIHNoYXJlZCB7QGxpbmsgUmVnaW9uU3RvcmV9IC8ge0BsaW5rIFZpc3VhbGl6ZXJTdG9yZX0sIGV4YWN0bHkgYXMgT1NEIGRvZXMuXG4gKlxuICogRm9sbG93LXVwcyAoaml0LXVpIzEwMik6IG5hdGl2ZS1yZXNvbHV0aW9uIHB5cmFtaWRhbCB0aWxpbmcsIG9uLWNhbnZhcyB0b29scywgcmVnaW9uXG4gKiBvdmVybGF5IHJlbmRlcmluZywgcGVyLWNoYW5uZWwgaGlzdG9ncmFtcywgVElGRiBleHBvcnQuXG4gKi9cbi8qKlxuICogV2hhdCB0aGUgM0QgcG9pbnRzIGxheWVyIG5lZWRzIHRvIGNvbG91ciBhIGNsb3VkOiBvbmUgc2NhbGFyIHBlciBwb2ludCwgYSBjb2xvcm1hcCwgYW5kIHRoZVxuICogd2luZG93IHRoYXQgbWFwcyBzY2FsYXJzIG9udG8gaXQuIENhdGVnb3JpY2FsIGFuZCBjb250aW51b3VzIGNvbG91cmluZ3MgYm90aCByZWR1Y2UgdG8gdGhpcyxcbiAqIGJlY2F1c2UgdGhlIGxheWVyIG9mZmVycyBubyBwZXItcG9pbnQgY29sb3VyIGNoYW5uZWwuXG4gKi9cbmludGVyZmFjZSBTcGF0aWFsM2RFbmNvZGluZyB7XG4gIHZhbHVlczogRmxvYXQzMkFycmF5O1xuICBjb2xvcm1hcDogQ29sb3JtYXA7XG4gIGNvbnRyYXN0TGltaXRzOiBbbnVtYmVyLCBudW1iZXJdO1xufVxuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlIGV4dGVuZHMgQmFzZVN0b3JlVmlzdWFsaXplciBpbXBsZW1lbnRzIElWaXN1YWxpemVyIHtcbiAgcmVhZG9ubHkgY2FwYWJpbGl0aWVzOiBWaWV3ZXJDYXBhYmlsaXRpZXMgPSBjYXBhYmlsaXRpZXNPZihbXG4gICAgVmlld2VyRmVhdHVyZS5JbWFnZURpc3BsYXksXG4gICAgVmlld2VyRmVhdHVyZS5TdGFja1NsaWRlcixcbiAgICBWaWV3ZXJGZWF0dXJlLlBpeGVsUmVhZGJhY2ssXG4gICAgVmlld2VyRmVhdHVyZS5TdXJmYWNlM0QsXG4gICAgVmlld2VyRmVhdHVyZS5Jc29zdXJmYWNlLFxuICBdKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGFwaTogc3RyaW5nO1xuXG4gIHByaXZhdGUgdmlld2VyOiBWaWV3ZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaG9zdDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsb2FkZWQ6IE5hcGFyaUxvYWRlZCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxhc3RQaXhlbHM6IFBpeGVsRGF0YSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGN1cnJlbnRQbG90VHlwZTogUGxvdFR5cGUgPSBQbG90VHlwZS5OQVBBUklfSU1BR0U7XG4gIC8qKiBuYXBhcmktanMgaGlnaC1sZXZlbCB2aWV3IG93bmluZyB0aGUgM0Qgdm9sdW1lIGxheWVycyAob25lIGFkZGl0aXZlIHRpbnRlZCBsYXllciBwZXIgY2hhbm5lbFxuICAgKiAgZm9yIG11bHRpY2hhbm5lbCwgb3IgYSBzaW5nbGUgZ3JheXNjYWxlIHZvbHVtZSkuIE51bGwgaW4gMkQuICovXG4gIHByaXZhdGUgdm9sdW1lVmlldzogTXVsdGlDaGFubmVsVm9sdW1lVmlldyB8IG51bGwgPSBudWxsO1xuICAvKiogVHJ1ZSB3aGVuIHRoZSB2b2x1bWUgaXMgY29tcG9zaXRlZCBmcm9tIHBlci1jaGFubmVsIGxheWVycyAodnMgYSBzaW5nbGUgZ3JheXNjYWxlIHZvbHVtZSkuICovXG4gIHByaXZhdGUgdm9sdW1lTXVsdGljaGFubmVsID0gZmFsc2U7XG4gIC8qKiBuYXBhcmktanMgaGVpZ2h0LWZpZWxkIHN1cmZhY2UgbWVzaCAoTkFQQVJJX1NVUkZBQ0UgcGxvdCB0eXBlOyBudWxsIG90aGVyd2lzZSkuIEJ1aWx0IGZyb20gYVxuICAgKiAgc2luZ2xlIGdyYXlzY2FsZSBzbGljZSBieSB7QGxpbmsgYnVpbGRTdXJmYWNlfSB2aWEgbmFwYXJpLWpzJ3MgYGhlaWdodEZpZWxkYCArIGBhZGRTdXJmYWNlYC4gKi9cbiAgcHJpdmF0ZSBzdXJmYWNlTGF5ZXI6IFN1cmZhY2VMYXllciB8IG51bGwgPSBudWxsO1xuICAvKiogV2hpY2ggYmFuZCB0aGUgc3VyZmFjZSBzYW1wbGVzIChhIGNoYW5uZWwgaW5kZXggZm9yIG11bHRpY2hhbm5lbCwgZWxzZSB0aGUgY29tcG9zaXRlKS4gKi9cbiAgcHJpdmF0ZSBzdXJmYWNlQ2hhbm5lbDogbnVtYmVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAvKiogVHJ1ZSB3aGVuIHRoZSBtb3VudGVkIFN1cmZhY2UgZm9sbG93cyBvbmUgYmFuZCBvZiBhIG11bHRpY2hhbm5lbCBpbWFnZS4gKi9cbiAgcHJpdmF0ZSBzdXJmYWNlTXVsdGljaGFubmVsID0gZmFsc2U7XG4gIC8qKiBQcmUtbG9hZGVkIHBlci1zbGljZSBsdW1pbmFuY2UgcGxhbmVzIChhbHJlYWR5IGRlY2ltYXRlZCB0byB0aGUgc3VyZmFjZSBncmlkKSwga2V5ZWQgYnkgeixcbiAgICogIHNvIHRoZSBzdGFjayBzbGlkZXIgcmVidWlsZHMgdGhlIHN1cmZhY2UgaW5zdGFudGx5LiBGaWxsZWQgYnkge0BsaW5rIHByZWxvYWRTdXJmYWNlUGxhbmVzfS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzdXJmYWNlUGxhbmVzID0gbmV3IE1hcDxcbiAgICBudW1iZXIsXG4gICAgeyBkYXRhOiBVaW50OEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9XG4gID4oKTtcbiAgLyoqIEluLXBsYW5lIGdyaWQgY2FwIGZvciB0aGUgYWN0aXZlIHN1cmZhY2UgbG9hZCAoZnVsbCBncmlkIMO3IHRoZSBkZWNpbWF0ZSBmYWN0b3IpLiAqL1xuICBwcml2YXRlIHN1cmZhY2VNYXhHcmlkID0gU1VSRkFDRV9NQVhfR1JJRDtcbiAgLyoqIENvbnRyYXN0IHdpbmRvdyBbbWluLG1heF0gdGhlIGN1cnJlbnQgc3VyZmFjZSBtZXNoIHdhcyBidWlsdCB3aXRoLiBBIGNoYW5nZSByZXNoYXBlcyB0aGVcbiAgICogIG1lc2ggKHBpeGVsIGhlaWdodCA9IGludGVuc2l0eSB3aXRoaW4gW21pbixtYXhdKSwgc28gaXQgdHJpZ2dlcnMgYSBnZW9tZXRyeSByZWJ1aWxkLiAqL1xuICBwcml2YXRlIHN1cmZhY2VXaW5kb3c6IFtudW1iZXIsIG51bWJlcl0gfCBudWxsID0gbnVsbDtcbiAgLyoqIFBlcnNpc3RlZCB3aXJlZnJhbWUgY2hvaWNlIGZvciB0aGUgc3VyZmFjZSAocmUtYXBwbGllZCB3aGVuIGEgbmV3IHN1cmZhY2UgbW91bnRzKS4gKi9cbiAgcHJpdmF0ZSBzdXJmYWNlV2lyZWZyYW1lID0gZmFsc2U7XG4gIC8qKiBuYXBhcmktanMgMkQgc2NhdHRlciBwb2ludHMgKHJlZ2lvbiBjZW50cm9pZHMpICsgaXRzIHJlZ2lvbi1jaGFuZ2Ugc3Vic2NyaXB0aW9uLiAqL1xuICBwcml2YXRlIHNjYXR0ZXIyZFBvaW50czogUG9pbnRzTGF5ZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzY2F0dGVyUmVnaW9uU3ViOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgLyoqIG5hcGFyaS1qcyAzRCBzY2F0dGVyICh2b3hlbCBwb2ludCBjbG91ZCkuICovXG4gIHByaXZhdGUgc2NhdHRlcjNkTGF5ZXI6IFBvaW50czNETGF5ZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIFNwYXRpYWwtb21pY3Mgb2JzZXJ2YXRpb24gbWFya2VycyArIHRoZSBkYXRhc2V0L3ZpZXcgc3Vic2NyaXB0aW9uIGRyaXZpbmcgdGhlbS4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsUG9pbnRzOiBQb2ludHNMYXllciB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIDNEIHBvaW50IGNsb3VkLiBPbmUgbGF5ZXI6IHNlbGVjdGlvbiBpcyBhIHBlci1wb2ludCBhbHBoYSBvbiBpdCwgbm90IGEgc2Vjb25kLiAqL1xuICBwcml2YXRlIHNwYXRpYWxQb2ludHMzZDogUG9pbnRzM0RMYXllciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNwYXRpYWxMYXllcktleTNkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIEludGVybGVhdmVkIHgseSx6LCBjYWNoZWQgc28gYSBjb2xvdXIgY2hhbmdlIGRvZXMgbm90IHJlLXdhbGsgMy43TSBvYnNlcnZhdGlvbnMuICovXG4gIHByaXZhdGUgc3BhdGlhbFBvc2l0aW9uczNkOiBGbG9hdDMyQXJyYXkgfCBudWxsID0gbnVsbDtcbiAgLyoqIElkZW50aXR5IG9mIHRoZSBzY2FsYXJzIGN1cnJlbnRseSB1cGxvYWRlZCDigJQgc2VlIHtAbGluayByZWJ1aWxkU3BhdGlhbFBvaW50czNkfS4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsU2NhbGFyS2V5M2Q6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGFuYXRvbWljYWwgdm9sdW1lIHRoZSBjbG91ZCBzaXRzIGluc2lkZSwgd2hlbiB0aGUgZGF0YXNldCBoYXMgb25lLiAqL1xuICBwcml2YXRlIHNwYXRpYWxWb2x1bWU6IFZvbHVtZUxheWVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3BhdGlhbFZvbHVtZUtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBQZXItY2x1c3RlciBkZW5zaXR5IHZvbHVtZXMgZHJhd24gYWxvbmdzaWRlIHRoZSBjbG91ZCwgYW5kIHdoYXQgdGhleSB3ZXJlXG4gICAqICBidWlsdCBmcm9tIOKAlCByYXN0ZXJpc2luZyBpcyBzZWNvbmRzIG9mIHdvcmssIHNvIGl0IG11c3Qgbm90IHJlcGVhdCBmb3IgYVxuICAgKiAgY2hhbmdlIHRoYXQgY2Fubm90IGFmZmVjdCB0aGUgZmllbGQuICovXG4gIHByaXZhdGUgZGVuc2l0eUxheWVyczogVm9sdW1lTGF5ZXJbXSA9IFtdO1xuICBwcml2YXRlIGRlbnNpdHlLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogU2VsZWN0aW9uIGlkZW50aXR5LCBhcyBhIG51bWJlciB0aGUgZGVuc2l0eSBrZXkgY2FuIGNhcnJ5LiAqL1xuICBwcml2YXRlIGxhc3RTZWxlY3Rpb25TZWVuOiBTcGF0aWFsU2VsZWN0aW9uTWFzayB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNlbGVjdGlvblJldmlzaW9uID0gMDtcbiAgLyoqIFRoZSBnZW5lIG1hcDogaXRzIGxheWVyLCB0aGUgZmllbGQgaXQgd2FzIGVzdGltYXRlZCBmcm9tLCBhbmQgdGhlIGlucHV0cyBlYWNoXG4gICAqICB3YXMgYnVpbHQgZm9yIOKAlCB0aGUgZmllbGQgaXMgdGhlIGV4cGVuc2l2ZSBoYWxmIGFuZCBzdXJ2aXZlcyBhIHJlY29sb3VyLiAqL1xuICBwcml2YXRlIGdlbmVNYXBMYXllcjogSW1hZ2VMYXllciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGdlbmVNYXBLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGdlbmVNYXBGaWVsZDogRXhwcmVzc2lvbkZpZWxkIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZ2VuZU1hcEZpZWxkS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSAzRCBnZW5lIG1hcDogaXRzIHZvbHVtZSBsYXllciwgdGhlIGZpZWxkIGJlaGluZCBpdCwgYW5kIHRoZSBpbnB1dHMgZWFjaFxuICAgKiAgd2FzIGJ1aWx0IGZvciDigJQgc2FtZSB0d28gY2xvY2tzIGFzIHRoZSAyRCBtYXAuICovXG4gIHByaXZhdGUgZ2VuZU1hcFZvbHVtZUxheWVyOiBWb2x1bWVMYXllciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGdlbmVNYXBWb2x1bWVLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGdlbmVNYXBWb2x1bWVGaWVsZDogRXhwcmVzc2lvblZvbHVtZUZpZWxkIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZ2VuZU1hcFZvbHVtZUZpZWxkS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIE9mZnNldCBhcHBsaWVkIHRvIG9ic2VydmF0aW9uIGNvb3JkaW5hdGVzIHRvIHNpdCB0aGVtIGluIHRoZSB2b2x1bWUncyBib3guICovXG4gIHByaXZhdGUgc3BhdGlhbE9yaWdpbjNkOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbMCwgMCwgMF07XG4gIC8qKiBDdXJzb3IgdG9vbHRpcCBmb3IgdGhlIHNwYXRpYWwgdmlld3MsIGFuZCBldmVyeXRoaW5nIGl0IG5lZWRzOiB3aGF0IHRoZVxuICAgKiAgY2xvdWQgaXMgY29sb3VyZWQgYnksIGFuZCB3aGVyZSBlYWNoIGRyYXduIG9ic2VydmF0aW9uIGlzLiAqL1xuICBwcml2YXRlIHNwYXRpYWxUb29sdGlwOiBOYXBhcmlTcGF0aWFsVG9vbHRpcCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGhvdmVyU291cmNlOiBIb3ZlclNvdXJjZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGhvdmVyU291cmNlS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFNlcXVlbmNlcyB0aGUgYXN5bmMgcmVzb2x1dGlvbnMuIFRoZSBLRVkgaXMgb25seSBjb21taXR0ZWQgb25jZSBvbmUgbGFuZHMsXG4gICAqICBzbyBhIHN1cGVyc2VkZWQgZmV0Y2ggY2Fubm90IGxlYXZlIHRoZSBjYWNoZSBjbGFpbWluZyB0byBob2xkIGEgc291cmNlIGl0XG4gICAqICBuZXZlciBzdG9yZWQuICovXG4gIHByaXZhdGUgaG92ZXJTb3VyY2VUb2tlbiA9IDA7XG4gIC8qKiBEcmF3biBvYnNlcnZhdGlvbnMnIHBvc2l0aW9ucyBmb3IgaGl0LXRlc3RpbmcsIGluZGV4ZWQgQlkgT0JTRVJWQVRJT04gd2l0aFxuICAgKiAgTmFOIGZvciBhbnl0aGluZyBub3QgZHJhd24uIFNjcmVlbiBwaXhlbHMgaW4gM0QgKHRoZSBjYW1lcmEgbW92ZXMgdGhlbSwgc29cbiAgICogIHRoZXkgYXJlIHJlYnVpbHQgd2hlbiBpdCBkb2VzKSBhbmQgV09STEQgdW5pdHMgaW4gMkQgKHdoZXJlIHRoZSBjYW1lcmEgb25seVxuICAgKiAgc2NhbGVzLCBzbyB0aGUgcG9pbnRlciBpcyBjb252ZXJ0ZWQgaW5zdGVhZCBvZiAzNzRrIHBvaW50cykuICovXG4gIHByaXZhdGUgaG92ZXJQb3NpdGlvbnM6IEZsb2F0MzJBcnJheSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGhvdmVyUG9zaXRpb25zUmV2ID0gLTE7XG5cbiAgLyoqXG4gICAqIFNjcmVlbi1zcGFjZSBidWNrZXQgaW5kZXggb3ZlciB0aGUgM0QgcHJvamVjdGlvbiwgYnVpbHQgb24gdGhlIGZpcnN0IGhvdmVyIGFmdGVyIHRoZVxuICAgKiBzY2VuZSBtb3ZlZCByYXRoZXIgdGhhbiB3aGVuIGl0IG1vdmVzLlxuICAgKlxuICAgKiBMYXppbHksIGFuZCB0aGF0IGlzIHRoZSB3aG9sZSBkZXNpZ246IGFuIG9yYml0IGRyYWcgY2hhbmdlcyB0aGUgY2FtZXJhIGV2ZXJ5IGZyYW1lLCBzb1xuICAgKiBidWlsZGluZyBlYWdlcmx5IHdvdWxkIHNwZW5kIHRlbnMgb2YgbWlsbGlzZWNvbmRzIGEgZnJhbWUgaW5kZXhpbmcgZm9yIHBpY2tzIG5vYm9keSBpc1xuICAgKiBtYWtpbmcuIERlZmVycmVkLCBpdCBpcyBidWlsdCBvbmNlIHdoZW4gdGhlIGRyYWcgc3RvcHMgYW5kIHRoZSBwb2ludGVyIG5leHQgbW92ZXMg4oCUXG4gICAqIG1lYXN1cmVkIHVwc3RyZWFtIGF0IDMuN00gcG9pbnRzLCB0aGF0IHR1cm5zIGEgMTIuNiBtcyBzY2FuIHBlciBwb2ludGVybW92ZSBpbnRvXG4gICAqIDAuMDY2IG1zLlxuICAgKi9cbiAgcHJpdmF0ZSBob3ZlckluZGV4OiBTY3JlZW5JbmRleCB8IG51bGwgPSBudWxsO1xuICAvKiogQnVtcGVkIHdoZW5ldmVyIHRoZSBjYWNoZWQgcG9zaXRpb25zIGdvIHN0YWxlOiBhIG1hcmtlciByZWJ1aWxkLCBvciDigJQgaW4gM0RcbiAgICogIG9ubHksIHdoZXJlIHRoZSBwcm9qZWN0aW9uIGRlcGVuZHMgb24gaXQg4oCUIGEgY2FtZXJhIG1vdmUuICovXG4gIHByaXZhdGUgc3BhdGlhbFNjZW5lUmV2ID0gMDtcbiAgcHJpdmF0ZSBob3ZlclBvaW50ZXI6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IGNsaWVudFg6IG51bWJlcjsgY2xpZW50WTogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBob3ZlckZyYW1lID0gMDtcbiAgcHJpdmF0ZSBob3Zlck9mZjogKCgpID0+IHZvaWQpW10gPSBbXTtcbiAgLyoqIE9ic2VydmF0aW9uIGluZGljZXMgdGhlIGNhY2hlZCAzRCBwb3NpdGlvbnMgYmVsb25nIHRvLCBpbiB0aGUgc2FtZSBvcmRlcjtcbiAgICogIG51bGwgd2hlbiBldmVyeSBvYnNlcnZhdGlvbiBpcyBkcmF3bi4gV2l0aG91dCBpdCBhIHByb2plY3Rpb24gYnVpbHQgZnJvbSB0aGVcbiAgICogIHBvc2l0aW9ucyBpcyBpbmRleGVkIGJ5IERSQVdOIG9yZGVyIGFuZCBzaWxlbnRseSBhdHRyaWJ1dGVzIGVhY2ggcG9pbnQgdG9cbiAgICogIHRoZSB3cm9uZyBvYnNlcnZhdGlvbiBhcyBzb29uIGFzIGEgc2VjdGlvbiBpcyBpc29sYXRlZC4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsRHJhd24zZDogVWludDMyQXJyYXkgfCBudWxsID0gbnVsbDtcblxuICAvKiogUmV1c2VkIHByb2plY3Rpb24gYnVmZmVycyDigJQgc2VlIHtAbGluayBnZXRTcGF0aWFsU2NyZWVuUHJvamVjdGlvbn0uICovXG4gIHByaXZhdGUgc3BhdGlhbFByb2plY3Rpb24zZDogUHJvamVjdGVkUG9pbnRzIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIC8qKiBQZXItb2JzZXJ2YXRpb24gZGVwdGggZnJvbSB0aGUgbGFzdCBwcm9qZWN0aW9uLCBmb3IgdGhlIGRlcHRoLWF3YXJlIGhvdmVyIHBpY2suICovXG4gIHByaXZhdGUgc3BhdGlhbERlcHRoczNkOiBGbG9hdDMyQXJyYXkgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSAodmlld2VyLCBkYXRhc2V0KSB3aG9zZSAzRCBzY2VuZSBoYXMgYWxyZWFkeSBoYWQgaXRzIG9wZW5pbmcgZnJhbWluZy4gKi9cbiAgLyoqIFdob3NlIDJEIG9ic2VydmF0aW9ucyB0aGUgY2FtZXJhIGhhcyBiZWVuIGZyYW1lZCBvbiDigJQgc2VlIHtAbGluayBmcmFtZVNwYXRpYWxQb2ludHNPbmNlfS4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsMmRGcmFtZWQ6IHsgdmlld2VyOiBWaWV3ZXI7IGRhdGFzZXRJZDogc3RyaW5nIH0gfCBudWxsID0gbnVsbDtcbiAgLyoqIERhdGFzZXQgdGhlIDNEIHNjYWxlIGJhciB3YXMgYnVpbHQgZm9yLiAqL1xuICBwcml2YXRlIHNwYXRpYWxTY2FsZUJhcktleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3BhdGlhbFN1YjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBMZXZlbC1vZi1kZXRhaWwgY2VsbCBvdXRsaW5lcywgdHJhbnNjcmlwdHMgYW5kIGRlbnNpdHkgb3ZlciB0aGUgMkQgdmlldyDigJQgY3JlYXRlZCBvblxuICAgKiAgZmlyc3QgdXNlLCBhbmQgb25seSB3aGVuIGEgc3BhdGlhbCBwb3J0IGlzIGJvdW5kLiAqL1xuICBwcml2YXRlIHNwYXRpYWxUaWxlc01ncjogTmFwYXJpU3BhdGlhbFRpbGVMYXllcnMgfCBudWxsID0gbnVsbDtcbiAgLyoqIEZvciB0aGUgcGFuZWw6IHRoZSB0cmFuc2NyaXB0cy1pbi12aWV3IGVzdGltYXRlIGFuZCB0aGUgZGVuc2l0eSB3aW5kb3cgaW4gdXNlLiAqL1xuICByZWFkb25seSB0cmFuc2NyaXB0RXN0aW1hdGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUcmFuc2NyaXB0RXN0aW1hdGUgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgZGVuc2l0eVN0YXRzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8eyBsbzogbnVtYmVyOyBoaTogbnVtYmVyOyBtYXg6IG51bWJlciB9IHwgbnVsbD4obnVsbCk7XG4gIC8qKiBMYXRlc3QgKGRhdGFzZXQsIHZpZXcsIHNlbGVjdGlvbikgdGhlIHNwYXRpYWwgc3Vic2NyaXB0aW9uIHNhdywgc28gYSBzbGljZVxuICAgKiAgY2hhbmdlIGNhbiByZWJ1aWxkIHRoZSBtYXJrZXJzIGZvciB0aGUgbmV3IHBsYW5lLiAqL1xuICBwcml2YXRlIHNwYXRpYWxMYXRlc3Q6IFtTcGF0aWFsRGF0YXNldCB8IG51bGwsIFNwYXRpYWxWaWV3U3RhdGUsIFNwYXRpYWxTZWxlY3Rpb25NYXNrXSB8IG51bGwgPVxuICAgIG51bGw7XG4gIC8qKiBXaGljaCBkYXRhc2V0IHRoZSBjdXJyZW50IG1hcmtlciBsYXllciB3YXMgYnVpbHQgZm9yLCBzbyBhIGRpc3BsYXktb25seVxuICAgKiAgY2hhbmdlIChzaXplLCBjb2xvdXIsIG9wYWNpdHksIHNlbGVjdGlvbikgY2FuIHVwZGF0ZSBpdCBpbiBwbGFjZS4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsTGF5ZXJLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogTW9ub3RvbmljIGd1YXJkIGZvciB0aGUgYXN5bmMgY29sb3VyIHJlYnVpbGQ6IGZldGNoaW5nIGEgZ2VuZSB2ZWN0b3IgaXMgYVxuICAgKiAgcm91bmQtdHJpcCwgc28gYSBmYXN0IHNlcXVlbmNlIG9mIGNvbG91ci1ieSBjaGFuZ2VzIGNhbiByZXNvbHZlIG91dCBvZlxuICAgKiAgb3JkZXIuIE9ubHkgdGhlIG5ld2VzdCByZWJ1aWxkIGlzIGFsbG93ZWQgdG8gdG91Y2ggdGhlIGxheWVyLiAqL1xuICBwcml2YXRlIHNwYXRpYWxSZWJ1aWxkVG9rZW4gPSAwO1xuICAvKiogTW9ub3RvbmljIGxvYWQgZ2VuZXJhdGlvbi4gQnVtcGVkIGJ5IHtAbGluayByZXNldH0gYW5kIHtAbGluayBjYW5jZWxMb2FkaW5nfTsgdGhlIGZyYW1lLWxvYWRpbmdcbiAgICogIGxvb3BzICh2b2x1bWUgYXNzZW1ibHksIHN1cmZhY2UgcHJlbG9hZCkgY2FwdHVyZSBpdCBhbmQgYmFpbCB3aGVuIGl0IGNoYW5nZXMsIHNvIGEgQ2FuY2VsIChvciBhXG4gICAqICBuZXcgcGxvdCkgYWN0dWFsbHkgc3RvcHMgZmV0Y2hpbmcgZnJhbWVzIGluc3RlYWQgb2YgcnVubmluZyB0byBjb21wbGV0aW9uIGluIHRoZSBiYWNrZ3JvdW5kLiAqL1xuICBwcml2YXRlIGxvYWRUb2tlbiA9IDA7XG4gIC8qKiBEZWNpbWF0ZSBmYWN0b3IgZm9yIHRoZSBuYXBhcmkgM0QgdHlwZXMgKDEgPSBGdWxsLCAyID0gwr0gZGVmYXVsdCwgNCA9IMK8LCA4ID0g4oWbKS4gQXBwbGllZCB3aGVuIGFcbiAgICogIHZvbHVtZS9pc29zdXJmYWNlL3N1cmZhY2UgKHJlKWxvYWRzOyBjaGFuZ2luZyBpdCBuZWVkcyBhIHJlLXBsb3QgKGl0IGNoYW5nZXMgZmV0Y2hlZCBkYXRhKS4gKi9cbiAgcHJpdmF0ZSByZXNvbHV0aW9uU2NhbGUgPSBOQVBBUklfREVGQVVMVF9ERUNJTUFURTtcbiAgLyoqIDNEIGNvb3JkaW5hdGUtYXhlcyAvIHNjYWxlIGdpem1vIGZvciB0aGUgdm9sdW1lL2lzb3N1cmZhY2UgdmlldyAobnVsbCBpbiAyRCkuICovXG4gIHByaXZhdGUgYXhlc0xheWVyOiBBeGVzTGF5ZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIERPTSBYL1kvWiArIHNjYWxlIGxhYmVscyB0cmFja2luZyB0aGUgM0QgYXhlcyBnaXptbyAobnVsbCBpbiAyRCkuICovXG4gIHByaXZhdGUgYXhlc0xhYmVsczogTmFwYXJpQXhlc0xhYmVscyB8IG51bGwgPSBudWxsO1xuICAvKiogRHJhZ2dhYmxlIFotaGVpZ2h0IGdyaXAgb3ZlciB0aGUgdm9sdW1lIChudWxsIHVubGVzcyBhIHZvbHVtZS9pc29zdXJmYWNlIGlzIG1vdW50ZWQpLiAqL1xuICBwcml2YXRlIHpIYW5kbGU6IE5hcGFyaVZvbHVtZVpIYW5kbGUgfCBudWxsID0gbnVsbDtcbiAgLyoqIFVzZXIgWi1oZWlnaHQgZmFjdG9yIGZvciB0aGUgdm9sdW1lICgxID0gdGhlIHZvbHVtZSdzIG5hdHVyYWwgcHJvcG9ydGlvbnMpOyBkcml2ZW4gYnkgdGhlXG4gICAqICBpbi12aWV3IGRyYWcgaGFuZGxlLiBSZXNldCBwZXIgbW91bnQuICovXG4gIHByaXZhdGUgdm9sdW1lWlNjYWxlID0gMTtcbiAgLyoqIFZvbHVtZSB3b3JsZCBib3ggYXQgYHZvbHVtZVpTY2FsZSA9IDFgIChiYXNlKSArIHRoZSBzYW1wbGVkIHZveGVsIGRlcHRoIOKAlCBlbm91Z2ggdG8gcmVjb21wdXRlXG4gICAqICB0aGUgWi1heGlzIHZveGVsIHNjYWxlLCBheGVzIGRlcHRoLCBhbmQgb3ZlcmxheSBhbmNob3JzIGFzIHRoZSBoYW5kbGUgc3RyZXRjaGVzIFouICovXG4gIHByaXZhdGUgdm9sdW1lV29ybGRCYXNlOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyOyBkZXB0aDogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB2b2x1bWVTYW1wbGVkRGVwdGggPSAxO1xuICAvKiogUGVyc2lzdGVkIGF4ZXMgb24vb2ZmIGNob2ljZSwgcmUtYXBwbGllZCB3aGVuIGEgbmV3IHZvbHVtZSBtb3VudHMuIERlZmF1bHRzIG9uLiAqL1xuICBwcml2YXRlIGF4ZXNWaXNpYmxlID0gdHJ1ZTtcbiAgcHJpdmF0ZSB2b2x1bWVEaW1zOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyOyBkZXB0aDogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgLyoqIEFzc2VtYmxlZCB1aW50OCB2b2x1bWUgZGF0YSBwZXIgY2hhbm5lbCAoa2V5ID0gY2hhbm5lbCBpbmRleCksIGtlcHQgZm9yIHRoZSB2b2x1bWUgaW50ZW5zaXR5XG4gICAqICBoaXN0b2dyYW0uIEtleSAwIGhvbGRzIHRoZSBncmF5c2NhbGUvY29tcG9zaXRlIHZvbHVtZSBpbiB0aGUgc2luZ2xlLWNoYW5uZWwgY2FzZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSB2b2x1bWVDaGFubmVsRGF0YSA9IG5ldyBNYXA8bnVtYmVyLCBVaW50OEFycmF5PigpO1xuICBwcml2YXRlIGltYWdlVyA9IDA7XG4gIHByaXZhdGUgaW1hZ2VIID0gMDtcbiAgLyoqIE1vbm90b25pYyBzbGljZS1yZXF1ZXN0IGlkIHNvIGEgc2xvdyBvdXQtb2Ytb3JkZXIgc2xpY2UgZmV0Y2ggY2FuJ3QgY2xvYmJlciBhIG5ld2VyIG9uZS4gKi9cbiAgcHJpdmF0ZSBzbGljZVJlcSA9IDA7XG4gIC8qKiBDYWNoZWQgYC90aWxlcy9pbmZvYCBweXJhbWlkIGRlc2NyaXB0b3IgKyB0aGUgaW5mb0I2NCBpdCB3YXMgZmV0Y2hlZCBmb3IuICovXG4gIHByaXZhdGUgZGVzY3JpcHRvcjogVGlsZURlc2NyaXB0b3IgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBkZXNjcmlwdG9yS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKiogSG93IHRoZSBjdXJyZW50IDJEIGltYWdlIGlzIGNvbXBvc2l0ZWQgKGRyaXZlcyBoaXN0b2dyYW0gKyBzdGF0ZSBhcHBsaWNhdGlvbikuICovXG4gIHByaXZhdGUgaW1hZ2VNb2RlOiAnZ3JheXNjYWxlJyB8ICdtdWx0aWNoYW5uZWwnIHwgJ3JnYicgPSAncmdiJztcbiAgLyoqIG5hcGFyaS1qcyBoaWdoLWxldmVsIHZpZXcgdGhhdCBvd25zIHRoZSBwZXItY2hhbm5lbCBsYXllciBzZXQgKGJ1aWxkICsgbGl2ZSBkaXNwbGF5XG4gICAqICB1cGRhdGVzKSBmb3IgdGhlIGN1cnJlbnQge0BsaW5rIGltYWdlTW9kZX0uIFJlYnVpbHQgb24gZWFjaCAocmUpcmVuZGVyLiAqL1xuICBwcml2YXRlIGNoYW5uZWxWaWV3OiBNdWx0aUNoYW5uZWxJbWFnZVZpZXcgfCBudWxsID0gbnVsbDtcbiAgLyoqIExpdmUgc3Vic2NyaXB0aW9uIGFwcGx5aW5nIGNoYW5uZWwtc3RhdGUgLyBjb2xvcm1hcCBjaGFuZ2VzIHRvIHRoZSBsYXllcnMuICovXG4gIHByaXZhdGUgZGlzcGxheVN1YjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBMYXRlc3QgZ3JheXNjYWxlIGNvbG9ybWFwIHNlbGVjdGlvbiBmcm9tIHRoZSBzdG9yZSAoYXBwbGllZCB0byB0aGUgc2luZ2xlIGdyYXkgbGF5ZXIpLiAqL1xuICBwcml2YXRlIGN1cnJlbnRDb2xvcm1hcDogQ29sb3JtYXBOb2RlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY3VycmVudFJldmVyc2UgPSBmYWxzZTtcbiAgLyoqIExhdGVzdCBpbnZlcnQgdG9nZ2xlIGZyb20gdGhlIHN0b3JlIChmbGlwcyBpbnRlbnNpdHkgYmVmb3JlIHRoZSBjb2xvcm1hcCwgbGlrZSBPU0QpLiAqL1xuICBwcml2YXRlIGludmVydEVuYWJsZWQgPSBmYWxzZTtcbiAgLyoqIFBoeXNpY2FsIHNjYWxlIGJhciBvdmVybGF5IGZvciB0aGUgMkQgaW1hZ2UgKG51bGwgd2hlbiAzRCBvciB0aGUgaW1hZ2UgaGFzIG5vIMK1bS9waXhlbCkuICovXG4gIHByaXZhdGUgc2NhbGVCYXI6IE5hcGFyaVNjYWxlQmFyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBPdmVydmlldyBtaW5pbWFwIChib3R0b20tcmlnaHQpLCBhcyBPU0QncyBuYXZpZ2F0b3IuICovXG4gIHByaXZhdGUgbmF2aWdhdG9yOiBOYXBhcmlOYXZpZ2F0b3IgfCBudWxsID0gbnVsbDtcbiAgLyoqIFdoZXRoZXIgdGhlIG5hdmlnYXRvciBpcyBzaG93biDigJQgdGhlIHNhbWUgaG9zdCBzZXR0aW5nIE9TRCdzIG5hdmlnYXRvciBob25vdXJzLiAqL1xuICBwcml2YXRlIG5hdmlnYXRvclZpc2libGUgPSB0cnVlO1xuICAvKiogQnVtcGVkIHBlciB0aHVtYm5haWwgcmVxdWVzdCwgc28gYSBzbG93IG9uZSBjYW5ub3Qgb3ZlcndyaXRlIGEgbmV3ZXIgc2xpY2Uncy4gKi9cbiAgcHJpdmF0ZSBuYXZpZ2F0b3JUb2tlbiA9IDA7XG4gIC8qKiBTVkcgcmVnaW9uLWRyYXdpbmcgb3ZlcmxheSBmb3IgdGhlIDJEIGltYWdlIChudWxsIHVudGlsIGEgMkQgaW1hZ2UgaXMgcGxvdHRlZCkuICovXG4gIHByaXZhdGUgcmVnaW9uT3ZlcmxheTogTmFwYXJpUmVnaW9uT3ZlcmxheSB8IG51bGwgPSBudWxsO1xuICAvKiogUGl4ZWwtdG9vbCBwbHVtYmluZzogdGhlIHBsb3QgZGl2IGlkLCBjb29yZCB0cmFuc2Zvcm0sIGFuZCBib3VuZCB0b29sIGhvc3RzLiAqL1xuICBwcml2YXRlIHBsb3REaXZJZCA9ICcnO1xuICBwcml2YXRlIGNvb3JkVHJhbnNmb3JtOiBJQ29vcmRpbmF0ZVRyYW5zZm9ybSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHdhbmRIb3N0OiBXYW5kVG9vbEhvc3QgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBlcmFzZXJIb3N0OiBWZXJ0ZXhFcmFzZXJUb29sSG9zdCB8IG51bGwgPSBudWxsO1xuICAvKiogQ2FjaGVkIENhY2hlZEltYWdlRGF0YSBidWlsdCBmcm9tIHRoZSBsYXN0IHJlYWRiYWNrIChyZWJ1aWx0IHdoZW4gbGFzdFBpeGVscyBjaGFuZ2VzKS4gKi9cbiAgcHJpdmF0ZSBjYWNoZWRJbWFnZTogQ2FjaGVkSW1hZ2VEYXRhIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY2FjaGVkSW1hZ2VTb3VyY2U6IFBpeGVsRGF0YSB8IG51bGwgPSBudWxsO1xuICAvKiogVmlzaWJsZSB3b3JsZCByZWN0IGNhcHR1cmVkIEFUIHRoZSBsYXN0IHJlYWRiYWNrIOKAlCBtdXN0IHBhaXIgd2l0aCBgbGFzdFBpeGVsc2Agc28gdGhlIHBpeGVsXG4gICAqICB0b29scycgcmF0aW9zL29yaWdpbiBtYXRjaCB0aGUgbWF0cml4J3MgY2FtZXJhICh1c2luZyB0aGUgbGl2ZSByZWN0IGFmdGVyIGEgcGFuL3pvb20gd291bGRcbiAgICogIG1pcy1zY2FsZSB0aGUgcmVnaW9uKS4gKi9cbiAgcHJpdmF0ZSBsYXN0UGl4ZWxzUmVjdDogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICAvKiogSW1hZ2Ugc21vb3RoaW5nIChiaWxpbmVhcikgdnMgbmVhcmVzdC1uZWlnaGJvdXIgKGNyaXNwIHBpeGVscywgdGhlIGRlZmF1bHQpLiAqL1xuICBwcml2YXRlIGltYWdlU21vb3RoaW5nID0gZmFsc2U7XG4gIC8qKiBUcnVlIHdoZW4gdGhlIDJEIGltYWdlIGlzIHJlbmRlcmVkIHZpYSBweXJhbWlkYWwgVGlsZWRTb3VyY2VzIChkZXNjcmlwdG9yIGF2YWlsYWJsZSkuICovXG4gIHByaXZhdGUgdGlsZWQgPSBmYWxzZTtcbiAgLyoqIERlYm91bmNlZCByZWFkYmFjayB0aW1lciArIGNhbWVyYS1jaGFuZ2UgdW5zdWJzY3JpYmUgKGtlZXAgbGFzdFBpeGVscyBjdXJyZW50IGZvciB0b29scykuICovXG4gIHByaXZhdGUgcmVhZGJhY2tUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjYW1lcmFSZWFkYmFja09mZjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBDb2Fyc2UgcGVyLWNoYW5uZWwgbHVtaW5hbmNlIHNhbXBsZSAoa2V5ZWQgYnkgY2hhbm5lbCBpbmRleCkgZm9yIHRoZSBoaXN0b2dyYW0gaW4gdGlsZWQgbW9kZSxcbiAgICogIHdoZXJlIHRoZSBsYXllcnMgaGF2ZSBubyBmdWxsIGluLW1lbW9yeSBwaXhlbHMuIFJlZnJlc2hlZCBvbiBwbG90ICsgc2xpY2UgY2hhbmdlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGhpc3RTYW1wbGVzID0gbmV3IE1hcDxudW1iZXIsIFVpbnQ4QXJyYXk+KCk7XG4gIC8qKiBOYXRpdmUtYml0LWRlcHRoIGhpc3RvZ3JhbXMgZnJvbSBgL2hpc3RvZ3JhbWAsIGtleWVkIGAke3p9fCR7Y2hhbm5lbH1gICg+OC1iaXQgaW1hZ2VzKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBuYXRpdmVIaXN0b2dyYW1zID0gbmV3IE1hcDxzdHJpbmcsIElIaXN0b2dyYW0+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzdGFja0xvYWRpbmckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xuICBwcml2YXRlIHJlYWRvbmx5IGF1dG9zY2FsZUV2ZW50JCA9IG5ldyBTdWJqZWN0PHVua25vd24+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZW5zaXR5UHJvZmlsZSQgPSBuZXcgU3ViamVjdDxJbnRlbnNpdHlQcm9maWxlW10+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdmlld3BvcnRDaGFuZ2UkID0gbmV3IFN1YmplY3Q8e1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICBoZWlnaHQ6IG51bWJlcjtcbiAgfT4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KFRJTEVfQUNDRVNTX1BPUlQpIHByaXZhdGUgcmVhZG9ubHkgdGlsZXM6IFRpbGVBY2Nlc3NQb3J0LFxuICAgIHN0b3JlOiBWaXN1YWxpemVyU3RvcmUsXG4gICAgcmVnaW9uU3RvcmU6IFJlZ2lvblN0b3JlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgd2FuZFRvb2w6IFdhbmRUb29sU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJydXNoVG9vbDogQnJ1c2hUb29sU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVyYXNlclRvb2w6IFZlcnRleEVyYXNlclRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgem9vbVRvQm94VG9vbDogWm9vbVRvQm94VG9vbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzYW1Ub29sOiBTYW1Ub29sU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNhbVBvaW50VG9vbDogU2FtUG9pbnRUb29sU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNlbGxTZWdtZW50VG9vbDogQ2VsbFNlZ21lbnRUb29sU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KENFTExfU0VHTUVOVEVSKSBwcml2YXRlIHJlYWRvbmx5IGNlbGxTZWdtZW50ZXI6IElDZWxsU2VnbWVudGVyIHwgbnVsbCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNpbXBsZVN0YWNrOiBTaW1wbGVTbGljZUFjY2Vzc1NlcnZpY2UsXG4gICAgQEluamVjdChWSVpfQ09ORklHKSBjb25maWc6IFZpekNvbmZpZyxcbiAgICAvLyBPcHRpb25hbDogb25seSBhIGhvc3QgdGhhdCBzZXJ2ZXMgc3BhdGlhbC1vbWljcyBkYXRhIHByb3ZpZGVzIGl0LCBhbmRcbiAgICAvLyB3aXRob3V0IGl0IHRoZSBTUEFUSUFMX09NSUNTIHBsb3QgdHlwZSBpcyBuZXZlciBvZmZlcmVkIGFueXdheS5cbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFNQQVRJQUxfREFUQV9QT1JUKSBwcml2YXRlIHJlYWRvbmx5IHNwYXRpYWxEYXRhOiBTcGF0aWFsRGF0YVBvcnQgfCBudWxsID0gbnVsbCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNlbGVjdGlvblN0b3JlOiBTcGF0aWFsU2VsZWN0aW9uU3RvcmUgfCBudWxsID0gbnVsbCxcbiAgKSB7XG4gICAgc3VwZXIocmVnaW9uU3RvcmUsIHN0b3JlKTtcbiAgICB0aGlzLmFwaSA9IGNvbmZpZy5zbGlkZUNyb3BTZXJ2ZXI7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggKyBjYWNoZSB0aGUgc2VydmVyIHB5cmFtaWQgZGVzY3JpcHRvciAoYEdFVCAvdGlsZXMvaW5mb2ApOiB0aGUgUkVBTCBwZXItbGV2ZWwgdGlsZSBncmlkLFxuICAgKiB0aWxlIHNpemUsIGNoYW5uZWwgbWV0YWRhdGEgYW5kIHBoeXNpY2FsIHBpeGVsIHNpemUuIFRoZSBiYWNrZW5kIHJldHVybnMgMjAyIHdoaWxlIHRoZSBzb3VyY2VcbiAgICogaXMgc3RpbGwgY2FjaGluZywgc28gd2UgcG9sbCBicmllZmx5LiBDYWNoZWQgcGVyIGBpbmZvQjY0YDsgcmV0dXJucyBudWxsIGlmIGl0IG5ldmVyIGJlY29tZXNcbiAgICogcmVhZHkgKGNhbGxlcnMgZmFsbCBiYWNrIHRvIGEgc2luZ2xlLXRpbGUgZmV0Y2gpLiBUaGlzIGlzIHRoZSBhdXRob3JpdGF0aXZlIGdyaWQg4oCUIGd1ZXNzaW5nXG4gICAqIGxldmVsIGRpbXMgZnJvbSBgdHJ1ZUltYWdlU2l6ZWAgb3ZlcnNob290cyB0aGUgcmVhbCBncmlkIGFuZCB0aGUgc2VydmVyIDQwMHMgb3V0LW9mLXJhbmdlIHRpbGVzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVEZXNjcmlwdG9yKCk6IFByb21pc2U8VGlsZURlc2NyaXB0b3IgfCBudWxsPiB7XG4gICAgLy8gU2VsZi1jb250YWluZWQgbXVsdGktc2xpY2Ugc3RhY2sgKG5vIHRpbGUgc2VydmVyIOKAlCBlLmcuIGEgbnVtYmVyZWQgaW1hZ2VcbiAgICAvLyBzZXJpZXMgYXNzZW1ibGVkIGNsaWVudC1zaWRlLCBlYWNoIHNsaWNlIGEgZGlmZmVyZW50IGZpbGUpOiB0aGVyZSBpcyBub1xuICAgIC8vIHNpbmdsZSBzZXJ2ZXItdGlsZWQgcHlyYW1pZCB0byBkZXNjcmliZS4gUmV0dXJuaW5nIG51bGwgcm91dGVzIGV2ZXJ5XG4gICAgLy8gY2FsbGVyICgyRCBpbWFnZSwgdm9sdW1lLCBzdXJmYWNlKSB0byB0aGVpciBzdGl0Y2hlZC9zaW5nbGUtZmV0Y2hcbiAgICAvLyBmYWxsYmFjaywgd2hpY2gg4oCUIHZpYSBmZXRjaFNsaWNlJ3Mgb3duIFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZSBicmFuY2gg4oCUXG4gICAgLy8gY29ycmVjdGx5IGZldGNoZXMgZWFjaCBzbGljZSdzIG93biBVUkwgaW5zdGVhZCBvZiBvbmUgZml4ZWQgZmlsZSdzIHRpbGVcbiAgICAvLyBweXJhbWlkLlxuICAgIGlmICh0aGlzLnNpbXBsZVN0YWNrLmlzU2ltcGxlKHRoaXMubG9hZGVkPy5pbWFnZUluZm8pKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBpbmZvQjY0ID0gdGhpcy50aWxlcy5nZXRTZWxlY3RlZEluZm9CNjQoKTtcbiAgICBpZiAoIWluZm9CNjQpIHJldHVybiBudWxsO1xuICAgIGlmICh0aGlzLmRlc2NyaXB0b3IgJiYgdGhpcy5kZXNjcmlwdG9yS2V5ID09PSBpbmZvQjY0KSByZXR1cm4gdGhpcy5kZXNjcmlwdG9yO1xuICAgIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCB0aGlzLnRpbGVzXG4gICAgICAuZ2V0QXV0aEhlYWRlcnMoKVxuICAgICAgLmNhdGNoKCgpID0+ICh7fSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPik7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5hcGl9dGlsZXMvaW5mbz9pbmZvPSR7aW5mb0I2NH1gO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIERFU0NSSVBUT1JfVElNRU9VVF9NUztcbiAgICBmb3IgKDs7KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgICAgIGlmIChyZXNwLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgY29uc3QgYm9keSA9IChhd2FpdCByZXNwLmpzb24oKSkgYXMgVGlsZURlc2NyaXB0b3I7XG4gICAgICAgICAgaWYgKGJvZHk/LmxldmVscz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmRlc2NyaXB0b3IgPSBib2R5O1xuICAgICAgICAgICAgdGhpcy5kZXNjcmlwdG9yS2V5ID0gaW5mb0I2NDtcbiAgICAgICAgICAgIHJldHVybiBib2R5O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyAyMDIgKHN0aWxsIGNhY2hpbmcpIG9yIGVtcHR5IGJvZHkg4oaSIHJlLXBvbGwgdW50aWwgdGhlIGRlYWRsaW5lLlxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gdGlsZXMvaW5mbyBwb2xsIHJldHJ5JywgZXJyKTtcbiAgICAgIH1cbiAgICAgIGlmIChEYXRlLm5vdygpID4gZGVhZGxpbmUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSB0aWxlcy9pbmZvIG5vdCByZWFkeTsgZmFsbGluZyBiYWNrIHRvIHNpbmdsZS10aWxlIGZldGNoJyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgMTIwMCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBhIENPTVBMRVRFIHJlbmRlcmVkIHNsaWNlIGFzIGFuIGBJbWFnZUJpdG1hcGAgYnkgc3RpdGNoaW5nIHRoZSBzZXJ2ZXIncyBSRUFMIHRpbGUgZ3JpZFxuICAgKiAoZnJvbSBgL3RpbGVzL2luZm9gKSDigJQgbm90IGp1c3QgdGhlIHRvcC1sZWZ0IHRpbGUsIHdoaWNoIG9ubHkgZXZlciBzaG93ZWQgYSBsYXJnZSBpbWFnZSdzXG4gICAqIGNvcm5lci4gUGlja3MgdGhlIGZpbmVzdCBweXJhbWlkIGxldmVsIHdob3NlIGdyaWQgZml0cyBgYnVkZ2V0VGlsZXNgIGFuZCB3aG9zZSBsb25nZXN0IHNpZGUgaXNcbiAgICogd2l0aGluIHRoZSBHUFUgdGV4dHVyZSBsaW1pdCwgZmV0Y2hlcyB0aGF0IGdyaWQgY29uY3VycmVudGx5LCBhbmQgc3RpdGNoZXMgaXQgaW50byBvbmUgY2FudmFzLlxuICAgKlxuICAgKiBgY2hhbm5lbGAgc2VsZWN0cyBhIHNpbmdsZSBiYW5kIGFzIGdyYXlzY2FsZSAocmVhbCBsZXZlbHMgb25seSk7IG9taXQgZm9yIHRoZSBzZXJ2ZXIgY29tcG9zaXRlLlxuICAgKiBgYnVkZ2V0VGlsZXNgIGNhcHMgdGhlIGdyaWQ6IHRoZSAyRCB2aWV3IHVzZXMgdGhlIGZ1bGwgYnVkZ2V0IGZvciBkZXRhaWw7IHRoZSAzRCB2b2x1bWUgcGFzc2VzXG4gICAqIDEgZm9yIGEgY2hlYXAgb3ZlcnZpZXcgdGlsZSBwZXIgc2xpY2UgKGl0IGRvd25zYW1wbGVzIHRvIHtAbGluayBWT0xVTUVfTUFYX1NMSUNFfSkuIEZhbGxzIGJhY2tcbiAgICogdG8gYSBzaW5nbGUgYGNvbD0wLHJvdz0wYCB0aWxlIHdoZW4gbm8gZGVzY3JpcHRvciBpcyBhdmFpbGFibGUgKHNtYWxsL3NpbXBsZSBpbWFnZXMsIHZvbHVtZXMpLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFNsaWNlKFxuICAgIHo6IG51bWJlcixcbiAgICBjaGFubmVsPzogbnVtYmVyLFxuICAgIGJ1ZGdldFRpbGVzOiBudW1iZXIgPSBNQVhfU1RJVENIX1RJTEVTLFxuICAgIC8qKiBXaGVuIGEgc3BlY2lmaWMgY2hhbm5lbCBoYXMgbm8gcHlyYW1pZCBsZXZlbCB3aXRoaW4gYGJ1ZGdldFRpbGVzYCwgZHJvcCB0byB0aGUgc2VydmVyXG4gICAgICogIENPTVBPU0lURSBvdmVydmlldyBpbnN0ZWFkIG9mIHN0aXRjaGluZyB0aGUgaHVnZSBwZXItY2hhbm5lbCBsZXZlbC4gT25seSBzYWZlIHdoZW4gdGhlIGNhbGxlclxuICAgICAqICB3YW50cyBhIHNpbmdsZSBkZWNpbWF0ZWQgcGxhbmUgKHRoZSBzdXJmYWNlIGhlaWdodCk6IGZvciBhIG11bHRpY2hhbm5lbCBWT0xVTUUgZXZlcnkgY2hhbm5lbFxuICAgICAqICB3b3VsZCB0aGVuIGZldGNoIHRoZSBzYW1lIGNvbXBvc2l0ZSBhbmQgdGhlIGNoYW5uZWxzIHdvdWxkIGNvbGxhcHNlIGludG8gb25lLCBzbyB2b2x1bWVcbiAgICAgKiAgYXNzZW1ibHkgbGVhdmVzIHRoaXMgYGZhbHNlYCB0byBrZWVwIGVhY2ggYmFuZCBkaXN0aW5jdC4gKi9cbiAgICBhbGxvd0NvbXBvc2l0ZUZhbGxiYWNrID0gZmFsc2UsXG4gICk6IFByb21pc2U8SW1hZ2VCaXRtYXA+IHtcbiAgICAvLyBTZWxmLWNvbnRhaW5lZCBtdWx0aS1zbGljZSBzdGFjayAodGlsZWQ6ZmFsc2UpOiBgemAgaW5kZXhlcyBhIGNvbXBsZXRlbHlcbiAgICAvLyBkaWZmZXJlbnQgZmlsZSdzIG93biBwcmV2aWV3IFVSTCwgbm90IGFuIGludGVybmFsIHNsaWNlIG9mIG9uZSBzZXJ2ZXItXG4gICAgLy8gdGlsZWQgZmlsZSDigJQgcmVzb2x2ZWQgYW5kIGZldGNoZWQgdmlhIFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZSAoc2hhcmVkXG4gICAgLy8gd2l0aCBPU0Q7IHNlZSBpdHMgZG9jcyBmb3Igd2h5IHRoaXMgY2FuJ3QgYmUgYSBiYXJlIGZldGNoKCkpIGluc3RlYWQgb2ZcbiAgICAvLyBidWlsZGluZyBhIC90aWxlP2luZm89Li4uJno9IHJlcXVlc3QgYWdhaW5zdCB3aGljaGV2ZXIgc2luZ2xlIGZpbGVcbiAgICAvLyBnZXRTZWxlY3RlZEluZm9CNjQoKSBwb2ludHMgYXQgKHdoaWNoIHdvdWxkIDQwMC9taXNtYXRjaCBmb3IgYW55IHpcbiAgICAvLyBiZXlvbmQgdGhhdCBvbmUgZmlsZSdzIG93biBleHRlbnQpLlxuICAgIGNvbnN0IGluZm8gPSB0aGlzLmxvYWRlZD8uaW1hZ2VJbmZvO1xuICAgIGlmICh0aGlzLnNpbXBsZVN0YWNrLmlzU2ltcGxlKGluZm8pKSB7XG4gICAgICAvLyBTZXJ2ZXJsZXNzIG11bHRpY2hhbm5lbCB2b2x1bWU6IGZldGNoIHRoZSByZXF1ZXN0ZWQgY2hhbm5lbCdzIE9XTiBwbGFuZVxuICAgICAgLy8gKGNoYW5uZWxVcmxzW3pdW2NoYW5uZWxdKSBzbyBlYWNoIGJhbmQgc3RheXMgZGlzdGluY3Qg4oCUIHRoZSBjbGllbnQtc2lkZVxuICAgICAgLy8gYW5hbG9nIG9mIHRoZSBzZXJ2ZXIncyBwZXItY2hhbm5lbCAvdGlsZT9jaGFubmVsPWMuIEVsc2UgdGhlIHotYW5jaG9yIFVSTC5cbiAgICAgIGNvbnN0IGNoVXJscyA9IChpbmZvIGFzIElJbWFnZUluZm8pLmNoYW5uZWxVcmxzO1xuICAgICAgY29uc3QgdXJsID0gY2hhbm5lbCAhPSBudWxsICYmIGNoVXJscz8uW3pdPy5bY2hhbm5lbF0gIT0gbnVsbFxuICAgICAgICA/IGNoVXJsc1t6XVtjaGFubmVsXVxuICAgICAgICA6IHRoaXMuc2ltcGxlU3RhY2sudXJsRm9yKGluZm8gYXMgSUltYWdlSW5mbywgeik7XG4gICAgICBpZiAoIXVybCkgdGhyb3cgbmV3IEVycm9yKGBbbmFwYXJpLWpzXSBubyBVUkwgZm9yIHNsaWNlICR7en1gKTtcbiAgICAgIHJldHVybiB0aGlzLnNpbXBsZVN0YWNrLmZldGNoQXNCaXRtYXAodXJsKTtcbiAgICB9XG4gICAgY29uc3QgaW5mb0I2NCA9IHRoaXMudGlsZXMuZ2V0U2VsZWN0ZWRJbmZvQjY0KCk7XG4gICAgaWYgKCFpbmZvQjY0KSB0aHJvdyBuZXcgRXJyb3IoJ1tuYXBhcmktanNdIG5vIHNlbGVjdGVkIGltYWdlIGluZm8gKGdldFNlbGVjdGVkSW5mb0I2NCBudWxsKScpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCB0aGlzLnRpbGVzXG4gICAgICAuZ2V0QXV0aEhlYWRlcnMoKVxuICAgICAgLmNhdGNoKCgpID0+ICh7fSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPik7XG4gICAgY29uc3QgZGVzYyA9IGF3YWl0IHRoaXMuZW5zdXJlRGVzY3JpcHRvcigpO1xuXG4gICAgLy8gVGhlIHJlcXVlc3RlZCBiYW5kOyBtYXkgYmUgZHJvcHBlZCB0byB0aGUgY29tcG9zaXRlICh1bmRlZmluZWQpIGJlbG93IHdoZW4gdGhlIGNoYW5uZWwgaGFzIG5vXG4gICAgLy8gcHlyYW1pZCBsZXZlbCBzbWFsbCBlbm91Z2ggdG8gc3RpdGNoIHdpdGhpbiBidWRnZXQuXG4gICAgbGV0IGVmZmVjdGl2ZUNoYW5uZWwgPSBjaGFubmVsO1xuICAgIGNvbnN0IGZldGNoVGlsZSA9IGFzeW5jIChcbiAgICAgIHJlczogbnVtYmVyLFxuICAgICAgY29sOiBudW1iZXIsXG4gICAgICByb3c6IG51bWJlcixcbiAgICAgIHQ6IG51bWJlcixcbiAgICApOiBQcm9taXNlPEltYWdlQml0bWFwPiA9PiB7XG4gICAgICBjb25zdCBjaCA9IGVmZmVjdGl2ZUNoYW5uZWwgPT0gbnVsbCA/ICcnIDogYCZjaGFubmVsPSR7ZWZmZWN0aXZlQ2hhbm5lbH1gO1xuICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5hcGl9dGlsZT9pbmZvPSR7aW5mb0I2NH0mcmVzPSR7cmVzfSZjb2w9JHtjb2x9JnJvdz0ke3Jvd30mej0ke3p9JnRpbGVTaXplPSR7dH0ke2NofWA7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgICBpZiAoIXJlc3Aub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbbmFwYXJpLWpzXSBzbGljZSBmZXRjaCBmYWlsZWQ6ICR7cmVzcC5zdGF0dXN9ICgke2NvbH0vJHtyb3d9IHJlcyAke3Jlc30pYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAoYXdhaXQgcmVzcC5ibG9iKCkpO1xuICAgIH07XG5cbiAgICAvLyBObyBkZXNjcmlwdG9yIOKGkiBzaW5nbGUgdG9wLWxlZnQgdGlsZSAobGVnYWN5IGZhbGxiYWNrOyBjb3JyZWN0IGZvciBzbWFsbC9zaW1wbGUgaW1hZ2VzKS5cbiAgICBpZiAoIWRlc2MgfHwgIWRlc2MubGV2ZWxzPy5sZW5ndGgpIHJldHVybiBmZXRjaFRpbGUoMCwgMCwgMCwgVElMRV9TSVpFKTtcblxuICAgIGNvbnN0IHQgPSBkZXNjLnRpbGVTaXplIHx8IFRJTEVfU0laRTtcbiAgICAvLyBQZXItY2hhbm5lbCB0aWxlcyBleGlzdCBPTkxZIGF0IFJFQUwgQmlvLUZvcm1hdHMgbGV2ZWxzICh0aGUgZnJvbnQgb2YgYGxldmVsc2ApOyB0aGUgc2VydmVyXG4gICAgLy8gY29tcG9zaXRlIGV4aXN0cyBhdCBldmVyeSBsZXZlbCwgaW5jbHVkaW5nIHRoZSBzbWFsbCBvdmVydmlld3MuXG4gICAgY29uc3QgcGVyQ2hhbm5lbExldmVscyA9IGRlc2MucmVhbExldmVscyA/PyBkZXNjLmxldmVscy5sZW5ndGg7XG4gICAgY29uc3QgdXNhYmxlID1cbiAgICAgIGNoYW5uZWwgPT0gbnVsbCA/IGRlc2MubGV2ZWxzIDogZGVzYy5sZXZlbHMuc2xpY2UoMCwgTWF0aC5tYXgoMSwgcGVyQ2hhbm5lbExldmVscykpO1xuXG4gICAgLy8gRmluZXN0IGxldmVsIHdob3NlIHN0aXRjaGVkIGdyaWQgZml0cyBCT1RIIHRoZSB0aWxlIGJ1ZGdldCBhbmQgdGhlIEdQVSB0ZXh0dXJlIGxpbWl0OyBpZiBub25lXG4gICAgLy8gZml0cywgdGhlIGNvYXJzZXN0IGF2YWlsYWJsZSAoZml0cz1mYWxzZSkuXG4gICAgY29uc3QgdGlsZXNGb3IgPSAobHZsOiBUaWxlTGV2ZWwpOiBudW1iZXIgPT5cbiAgICAgIE1hdGgubWF4KDEsIE1hdGguY2VpbChsdmwud2lkdGggLyB0KSkgKiBNYXRoLm1heCgxLCBNYXRoLmNlaWwobHZsLmhlaWdodCAvIHQpKTtcbiAgICBjb25zdCBwaWNrID0gKGxldmVsczogVGlsZUxldmVsW10pOiB7IGx2bDogVGlsZUxldmVsOyBmaXRzOiBib29sZWFuIH0gPT4ge1xuICAgICAgbGV0IGMgPSBsZXZlbHNbMF07XG4gICAgICBmb3IgKGNvbnN0IGx2bCBvZiBsZXZlbHMpIHtcbiAgICAgICAgYyA9IGx2bDtcbiAgICAgICAgaWYgKHRpbGVzRm9yKGx2bCkgPD0gYnVkZ2V0VGlsZXMgJiYgTWF0aC5tYXgobHZsLndpZHRoLCBsdmwuaGVpZ2h0KSA8PSBNQVhfVEVYVFVSRV9ESU0pIHtcbiAgICAgICAgICByZXR1cm4geyBsdmwsIGZpdHM6IHRydWUgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgbHZsOiBjLCBmaXRzOiBmYWxzZSB9O1xuICAgIH07XG5cbiAgICBsZXQgc2VsID0gcGljayh1c2FibGUpO1xuICAgIC8vIEEgc3BlY2lmaWMgY2hhbm5lbCBvbmx5IGhhcyB0aWxlcyBhdCB0aGUgKGZldywgbGFyZ2UpIHJlYWwgbGV2ZWxzLiBXaGVuIG5vbmUgb2YgdGhlbSBmaXQgdGhlXG4gICAgLy8gYnVkZ2V0IOKAlCBlLmcuIHRoZSBjb2Fyc2VzdCByZWFsIGxldmVsIGlzIHN0aWxsIDE0OTgyw5cxODY3MCDihpIgfjExMDAgZnVsbC1yZXMgdGlsZXMg4oCUIHN0aXRjaGluZ1xuICAgIC8vIGl0IHBlciBzbGljZSBmbG9vZHMgdGhlIHNlcnZlciAoNTA0cykgYW5kIHN0YWxscyB0aGUgbG9hZC4gVGhlIGNvbXBvc2l0ZSBweXJhbWlkIGhhcyBzbWFsbFxuICAgIC8vIG92ZXJ2aWV3IGxldmVscywgc28gZmV0Y2ggdGhlIGNvbXBvc2l0ZSBpbnN0ZWFkIGFuZCBkZXJpdmUgbHVtaW5hbmNlIGZyb20gaXQuIEV2ZXJ5IGNhbGxlciBoZXJlXG4gICAgLy8gKHN1cmZhY2UgaGVpZ2h0LCB2b2x1bWUgYXNzZW1ibHksIHJlYWRiYWNrKSBkb3duc2NhbGVzIHRoZSBwbGFuZSBhbnl3YXksIHNvIGEgY29tcG9zaXRlLWRlcml2ZWRcbiAgICAvLyBwbGFuZSBpcyB0aGUgcmlnaHQgdHJhZGUgZm9yIG9uZSB0aGF0IGFjdHVhbGx5IGxvYWRzLiBPbmx5IGtpY2tzIGluIHdoZW4gdGhlIGNoYW5uZWwgY2FuJ3QgZml0LlxuICAgIGlmIChhbGxvd0NvbXBvc2l0ZUZhbGxiYWNrICYmICFzZWwuZml0cyAmJiBjaGFubmVsICE9IG51bGwgJiYgZGVzYy5sZXZlbHMubGVuZ3RoID4gcGVyQ2hhbm5lbExldmVscykge1xuICAgICAgY29uc3QgY29tcG9zaXRlID0gcGljayhkZXNjLmxldmVscyk7XG4gICAgICBpZiAoY29tcG9zaXRlLmZpdHMgfHwgdGlsZXNGb3IoY29tcG9zaXRlLmx2bCkgPCB0aWxlc0ZvcihzZWwubHZsKSkge1xuICAgICAgICBlZmZlY3RpdmVDaGFubmVsID0gdW5kZWZpbmVkO1xuICAgICAgICBzZWwgPSBjb21wb3NpdGU7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW25hcGFyaS1qc10gY2hhbm5lbCAke2NoYW5uZWx9IGhhcyBubyBweXJhbWlkIGxldmVsIHdpdGhpbiB0aGUgJHtidWRnZXRUaWxlc30tdGlsZSBgICtcbiAgICAgICAgICAgIGBidWRnZXQ7IHVzaW5nIHRoZSBjb21wb3NpdGUgb3ZlcnZpZXcgKHJlcyAke3NlbC5sdmwucmVzfSwgJHtzZWwubHZsLndpZHRofcOXYCArXG4gICAgICAgICAgICBgJHtzZWwubHZsLmhlaWdodH0pIGZvciB0aGlzIHBsYW5lLmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGNob3NlbiA9IHNlbC5sdmw7XG4gICAgY29uc3QgY29scyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChjaG9zZW4ud2lkdGggLyB0KSk7XG4gICAgY29uc3Qgcm93cyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChjaG9zZW4uaGVpZ2h0IC8gdCkpO1xuICAgIGlmICghc2VsLmZpdHMgJiYgYnVkZ2V0VGlsZXMgPT09IE1BWF9TVElUQ0hfVElMRVMpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtuYXBhcmktanNdIGZ1bGwgcmVzb2x1dGlvbiBleGNlZWRzIHRoZSAke2J1ZGdldFRpbGVzfS10aWxlLyR7TUFYX1RFWFRVUkVfRElNfXB4IGJ1ZGdldDsgYCArXG4gICAgICAgICAgYGRpc3BsYXlpbmcgb3ZlcnZpZXcgbGV2ZWwgcmVzICR7Y2hvc2VuLnJlc30gKCR7Y2hvc2VuLndpZHRofcOXJHtjaG9zZW4uaGVpZ2h0fSkuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGNvbHMgPT09IDEgJiYgcm93cyA9PT0gMSkgcmV0dXJuIGZldGNoVGlsZShjaG9zZW4ucmVzLCAwLCAwLCB0KTtcblxuICAgIC8vIFN0aXRjaCBpbnRvIG9uZSBsZXZlbC1zaXplZCBjYW52YXMuIEZldGNoIHRoZSBncmlkIHdpdGggQk9VTkRFRCBjb25jdXJyZW5jeTogZmlyaW5nIGV2ZXJ5IHRpbGVcbiAgICAvLyBhdCBvbmNlIChhIGJpZyBncmlkID0gaHVuZHJlZHMgb2YgcmVxdWVzdHMpIG92ZXJ3aGVsbWVkIHRoZSB0aWxlIHNlcnZlciAoNTA0cykuIEVkZ2UgdGlsZXMgYXJlXG4gICAgLy8gbmFycm93ZXIvc2hvcnRlcjsgZHJhd0ltYWdlIHBsYWNlcyBlYWNoIGF0IGl0cyBncmlkIG9mZnNldCBzbyBwYXJ0aWFsIHRpbGVzIGxpbmUgdXAuXG4gICAgY29uc3QgY29vcmRzOiBBcnJheTx7IGNvbDogbnVtYmVyOyByb3c6IG51bWJlciB9PiA9IFtdO1xuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IHJvd3M7IHJvdysrKSB7XG4gICAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCBjb2xzOyBjb2wrKykgY29vcmRzLnB1c2goeyBjb2wsIHJvdyB9KTtcbiAgICB9XG4gICAgY29uc3QgdGlsZXM6IEFycmF5PHsgY29sOiBudW1iZXI7IHJvdzogbnVtYmVyOyBibXA6IEltYWdlQml0bWFwIH0+ID0gW107XG4gICAgY29uc3Qgc3RpdGNoV29ya2VyID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICBjb25zdCBqb2IgPSBjb29yZHMuc2hpZnQoKTtcbiAgICAgICAgaWYgKCFqb2IpIHJldHVybjtcbiAgICAgICAgY29uc3QgYm1wID0gYXdhaXQgZmV0Y2hUaWxlKGNob3Nlbi5yZXMsIGpvYi5jb2wsIGpvYi5yb3csIHQpO1xuICAgICAgICB0aWxlcy5wdXNoKHsgY29sOiBqb2IuY29sLCByb3c6IGpvYi5yb3csIGJtcCB9KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgQXJyYXkuZnJvbSh7IGxlbmd0aDogTWF0aC5taW4oVElMRV9GRVRDSF9DT05DVVJSRU5DWSwgY29vcmRzLmxlbmd0aCkgfSwgKCkgPT4gc3RpdGNoV29ya2VyKCkpLFxuICAgICk7XG5cbiAgICBsZXQgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IE9mZnNjcmVlbkNhbnZhcztcbiAgICBpZiAodHlwZW9mIE9mZnNjcmVlbkNhbnZhcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMoY2hvc2VuLndpZHRoLCBjaG9zZW4uaGVpZ2h0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICBjYW52YXMud2lkdGggPSBjaG9zZW4ud2lkdGg7XG4gICAgICBjYW52YXMuaGVpZ2h0ID0gY2hvc2VuLmhlaWdodDtcbiAgICB9XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJykgYXNcbiAgICAgIHwgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICB8IE9mZnNjcmVlbkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRFxuICAgICAgfCBudWxsO1xuICAgIGlmICghY3R4KSB0aHJvdyBuZXcgRXJyb3IoJ1tuYXBhcmktanNdIHNsaWNlIHN0aXRjaDogMkQgY29udGV4dCB1bmF2YWlsYWJsZScpO1xuICAgIGZvciAoY29uc3QgeyBjb2wsIHJvdywgYm1wIH0gb2YgdGlsZXMpIHtcbiAgICAgIGN0eC5kcmF3SW1hZ2UoYm1wLCBjb2wgKiB0LCByb3cgKiB0KTtcbiAgICAgIGJtcC5jbG9zZT8uKCk7XG4gICAgfVxuXG4gICAgLy8gU2FmZXR5IG5ldDogaWYgdGhlIGNob3NlbiBsZXZlbCBzdGlsbCBleGNlZWRzIHRoZSBHUFUgdGV4dHVyZSBsaW1pdCAoZS5nLiBhIG11bHRpY2hhbm5lbFxuICAgIC8vIGltYWdlIHdob3NlIGNvYXJzZXN0IFJFQUwgbGV2ZWwgaXMgaHVnZSDigJQgb3ZlcnZpZXcgbGV2ZWxzIGFyZSBjb21wb3NpdGUtb25seSksIGRvd25zY2FsZSB0aGVcbiAgICAvLyBzdGl0Y2hlZCBjYW52YXMgdG8gZml0IHNvIHRoZSBXZWJHUFUgdGV4dHVyZSB1cGxvYWQgY2FuJ3QgZmFpbC5cbiAgICBjb25zdCBsb25nZXN0ID0gTWF0aC5tYXgoY2hvc2VuLndpZHRoLCBjaG9zZW4uaGVpZ2h0KTtcbiAgICBpZiAobG9uZ2VzdCA+IE1BWF9URVhUVVJFX0RJTSkge1xuICAgICAgY29uc3Qgc2NhbGUgPSBNQVhfVEVYVFVSRV9ESU0gLyBsb25nZXN0O1xuICAgICAgY29uc3Qgb3V0VyA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IoY2hvc2VuLndpZHRoICogc2NhbGUpKTtcbiAgICAgIGNvbnN0IG91dEggPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKGNob3Nlbi5oZWlnaHQgKiBzY2FsZSkpO1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW25hcGFyaS1qc10gc3RpdGNoZWQgbGV2ZWwgJHtjaG9zZW4ud2lkdGh9w5cke2Nob3Nlbi5oZWlnaHR9IGV4Y2VlZHMgdGhlIGAgK1xuICAgICAgICAgIGAke01BWF9URVhUVVJFX0RJTX1weCB0ZXh0dXJlIGxpbWl0OyBkb3duc2NhbGluZyB0byAke291dFd9w5cke291dEh9LmAsXG4gICAgICApO1xuICAgICAgbGV0IG91dDogSFRNTENhbnZhc0VsZW1lbnQgfCBPZmZzY3JlZW5DYW52YXM7XG4gICAgICBpZiAodHlwZW9mIE9mZnNjcmVlbkNhbnZhcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgb3V0ID0gbmV3IE9mZnNjcmVlbkNhbnZhcyhvdXRXLCBvdXRIKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICBvdXQud2lkdGggPSBvdXRXO1xuICAgICAgICBvdXQuaGVpZ2h0ID0gb3V0SDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9jdHggPSBvdXQuZ2V0Q29udGV4dCgnMmQnKSBhc1xuICAgICAgICB8IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRFxuICAgICAgICB8IE9mZnNjcmVlbkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRFxuICAgICAgICB8IG51bGw7XG4gICAgICBpZiAoIW9jdHgpIHRocm93IG5ldyBFcnJvcignW25hcGFyaS1qc10gc2xpY2UgZG93bnNjYWxlOiAyRCBjb250ZXh0IHVuYXZhaWxhYmxlJyk7XG4gICAgICBvY3R4LmRyYXdJbWFnZShjYW52YXMgYXMgdW5rbm93biBhcyBDYW52YXNJbWFnZVNvdXJjZSwgMCwgMCwgb3V0Vywgb3V0SCk7XG4gICAgICByZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAob3V0IGFzIHVua25vd24gYXMgSW1hZ2VCaXRtYXBTb3VyY2UpO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAoY2FudmFzIGFzIHVua25vd24gYXMgSW1hZ2VCaXRtYXBTb3VyY2UpO1xuICB9XG5cbiAgLy8g4pSA4pSAIElEYXRhUmVuZGVyZXI6IGxvYWQgLyByZW5kZXIgLyB2aWV3cG9ydCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgYXN5bmMgbG9hZChpbWFnZUluZm86IElJbWFnZUluZm8sIHpJbmRleDogbnVtYmVyKTogUHJvbWlzZTxOYXBhcmlMb2FkZWQ+IHtcbiAgICAvLyBLZWVwcyBTaW1wbGVTbGljZUFjY2Vzc1NlcnZpY2UncyBibG9iIGNhY2hlIGluIHN5bmMgZXZlbiB3aGVuIHRoZSB1c2VyXG4gICAgLy8gc3dpdGNoZXMgYmFja2VuZHMgKGUuZy4gT1NEIEltYWdlIOKGkiBuYXBhcmkgVm9sdW1lKSBvbiB0aGUgc2FtZSBmaWxlIOKAlFxuICAgIC8vIHdoaWNoZXZlciBiYWNrZW5kIGxvYWRzIGEgZ2VudWluZWx5IGRpZmZlcmVudCBmaWxlIGZpcnN0IGV2aWN0cyBpdC5cbiAgICB0aGlzLnNpbXBsZVN0YWNrLm5vdGVBY3RpdmVGaWxlKGltYWdlSW5mby5maWxlTmFtZSk7XG4gICAgdGhpcy5sb2FkZWQgPSB7IGltYWdlSW5mbywgejogekluZGV4LCBmaWxlbmFtZTogaW1hZ2VJbmZvLmZpbGVOYW1lIH07XG4gICAgcmV0dXJuIHRoaXMubG9hZGVkO1xuICB9XG5cbiAgYXN5bmMgcGxvdChcbiAgICBwbG90RGl2OiBzdHJpbmcsXG4gICAgaW1hZ2VMb2FkZWQ6IHVua25vd24sXG4gICAgaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLFxuICAgIHNjcmVlbkhlaWdodDogbnVtYmVyLFxuICAgIHBsb3RUeXBlOiBQbG90VHlwZSxcbiAgICBfaW5QbGFjZT86IGJvb2xlYW4sXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGhvc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwbG90RGl2KTtcbiAgICBpZiAoIWhvc3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFtuYXBhcmktanNdIHBsb3QgdGFyZ2V0ICMke3Bsb3REaXZ9IG5vdCBmb3VuZGApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLnJlc2V0KCk7XG4gICAgdGhpcy5ob3N0ID0gaG9zdDtcbiAgICB0aGlzLnBsb3REaXZJZCA9IHBsb3REaXY7XG4gICAgdGhpcy5jdXJyZW50UGxvdFR5cGUgPSBwbG90VHlwZTtcblxuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICBjYW52YXMuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgY2FudmFzLnN0eWxlLmhlaWdodCA9IHNjcmVlbkhlaWdodCA/IGAke3NjcmVlbkhlaWdodH1weGAgOiAnMTAwJSc7XG4gICAgaG9zdC5hcHBlbmRDaGlsZChjYW52YXMpO1xuICAgIHRoaXMuY2FudmFzID0gY2FudmFzO1xuXG4gICAgY29uc3QgaW5mbyA9IChpbWFnZUxvYWRlZCBhcyBOYXBhcmlMb2FkZWQpPy5pbWFnZUluZm8gPz8gaW1hZ2VJbmZvO1xuICAgIGNvbnN0IHogPSAoaW1hZ2VMb2FkZWQgYXMgTmFwYXJpTG9hZGVkKT8ueiA/PyAwO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHZpZXdlciA9IG5ldyBWaWV3ZXIoe1xuICAgICAgICBjYW52YXMsXG4gICAgICAgIGJhY2tncm91bmQ6IHsgcjogMC4wNywgZzogMC4wNywgYjogMC4wOSwgYTogMSB9LFxuICAgICAgICAvLyBTZXQgaGVyZSByYXRoZXIgdGhhbiBsZWZ0IHRvIG5hcGFyaS1qcydzIG93biBkZWZhdWx0IHNvIHRoZSBnZW50bGVyXG4gICAgICAgIC8vIHN0ZXAgYXBwbGllcyB3aXRoIHRoZSB2ZXJzaW9uIGN1cnJlbnRseSBpbnN0YWxsZWQuIENob3NlbiB0byBtYXRjaCB0aGVcbiAgICAgICAgLy8gT1NEIGJhY2tlbmQncyBzdGVwIChzZWUgT1NEX1pPT01fUEVSX1NDUk9MTCk6IHRoZSB3aGVlbCBzaG91bGQgZmVlbCB0aGVcbiAgICAgICAgLy8gc2FtZSBvbiBhbiBpbWFnZSB3aGljaGV2ZXIgcmVuZGVyZXIgaXMgZHJhd2luZyBpdC4gVGhlIHN0ZXAgYXBwbGllcyBwZXJcbiAgICAgICAgLy8gc2Nyb2xsIEVWRU5ULCBhbmQgYSB0cmFja3BhZCBzZW5kcyBhIGJ1cnN0IG9mIHRoZW0gcGVyIHN3aXBlLCBzbyBhIHN0ZXBcbiAgICAgICAgLy8gdHVuZWQgdG8gYSBtb3VzZSBub3RjaCBydW5zIGF3YXkgdW5kZXIgYSB0cmFja3BhZC5cbiAgICAgICAgd2hlZWxab29tU3BlZWQ6IE5BUEFSSV9XSEVFTF9aT09NX1NQRUVELFxuICAgICAgICAvLyBUaGUgRklSU1QgM0QgbGF5ZXIgb2YgYSBzY2VuZSBmcmFtZXMgdGhlIG9yYml0IGNhbWVyYTsgZXZlcnkgbGF0ZXIgb25lIGxlYXZlcyB0aGVcbiAgICAgICAgLy8gcG9zZSBhbG9uZS4gQSBzcGF0aWFsIHNjZW5lIGlzIGJ1aWx0IGZyb20gc2V2ZXJhbCBsYXllcnMgYW5kIHJlYnVpbHQgY29uc3RhbnRseSDigJRcbiAgICAgICAgLy8gcmVjb2xvdXJpbmcgYnkgYSBjbGFzcywgcGlja2luZyBhIGdlbmUsIHN0ZXBwaW5nIGEgc2VjdGlvbiDigJQgYW5kIHdpdGggbmFwYXJpLWpzJ3NcbiAgICAgICAgLy8gcHJldmlvdXMgdW5jb25kaXRpb25hbCBmcmFtaW5nIGVhY2ggb2YgdGhvc2UgdGhyZXcgYXdheSBhbiBvcmJpdCB0aGUgdXNlciBoYWQgc2V0LlxuICAgICAgICAvLyBUaGUgcG9zZSBpdCBzbmFwcGVkIGJhY2sgdG8gZGVwZW5kZWQgb24gV0hJQ0ggbGF5ZXIgd2FzIHJlYnVpbHQsIHNvIGlzb2xhdGluZyBvbmVcbiAgICAgICAgLy8gc2VjdGlvbiB6b29tZWQgdG8gdGhhdCBzZWN0aW9uJ3MgYm91bmRzLiBgcmVzZXRGaXQzRCgpYCBvbiBhIGRhdGFzZXQgY2hhbmdlIGlzIHdoYXRcbiAgICAgICAgLy8gbGV0cyB0aGUgbmV4dCBzY2VuZSBmcmFtZSBpdHNlbGYuXG4gICAgICAgIGZpdDNkOiAnb25jZScsXG4gICAgICAgIC8vIEluIHRoZSBzcGF0aWFsIG1vZGVzIGEgcGxhaW4gY2xpY2sgU0VMRUNUUyB0aGUgY2xhc3MgdW5kZXIgdGhlIGN1cnNvcixcbiAgICAgICAgLy8gc28gbmFwYXJpJ3MgT1NELXN0eWxlIGNsaWNrLXRvLXpvb20gaXMgdHVybmVkIG9mZiB0aGVyZTogb3RoZXJ3aXNlIG9uZVxuICAgICAgICAvLyBjbGljayB3b3VsZCBib3RoIHNlbGVjdCBhIGNsYXNzIGFuZCB6b29tIDJ4IGFib3V0IHRoZSBjdXJzb3IsIGFuZCB0aGVcbiAgICAgICAgLy8gem9vbSB3b3VsZCB0aGVuIGhhbHZlIHRoZSBwaXhlbCByYWRpdXMgdGhlIG5leHQgY2xpY2sgaGl0LXRlc3RzIHdpdGguXG4gICAgICAgIC8vIFpvb21pbmcgaXMgc3RpbGwgb24gdGhlIHdoZWVsLCB0aGUgem9vbSBidXR0b25zIGFuZCB0aGUgem9vbS1ib3ggdG9vbC5cbiAgICAgICAgLi4uKGlzU3BhdGlhbE9taWNzKHBsb3RUeXBlKSB8fCBpc1NwYXRpYWxPbWljczNkKHBsb3RUeXBlKVxuICAgICAgICAgID8geyBjbGlja1pvb21GYWN0b3I6IDAgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgfSk7XG4gICAgICB0aGlzLnZpZXdlciA9IHZpZXdlcjtcbiAgICAgIGF3YWl0IHZpZXdlci5yZWFkeTtcblxuICAgICAgaWYgKGlzU3BhdGlhbE9taWNzM2QocGxvdFR5cGUpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubW91bnRTcGF0aWFsT21pY3MzZCh2aWV3ZXIsIGhvc3QpO1xuICAgICAgfSBlbHNlIGlmIChpc1NwYXRpYWxPbWljcyhwbG90VHlwZSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5tb3VudFNwYXRpYWxPbWljcyh2aWV3ZXIsIGhvc3QsIHopO1xuICAgICAgfSBlbHNlIGlmIChpc05hcGFyaVNjYXR0ZXIocGxvdFR5cGUpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubW91bnRTY2F0dGVyKHZpZXdlciwgaG9zdCwgeik7XG4gICAgICB9IGVsc2UgaWYgKGlzTmFwYXJpU2NhdHRlcjNkKHBsb3RUeXBlKSkge1xuICAgICAgICBhd2FpdCB0aGlzLm1vdW50U2NhdHRlcjNkKHZpZXdlciwgaW5mbyk7XG4gICAgICB9IGVsc2UgaWYgKGlzTmFwYXJpU3VyZmFjZShwbG90VHlwZSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5tb3VudFN1cmZhY2Uodmlld2VyKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNOYXBhcmkzZChwbG90VHlwZSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5tb3VudFZvbHVtZSh2aWV3ZXIsIGluZm8sIHBsb3RUeXBlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVuZGVySW1hZ2Uoeik7XG4gICAgICAgIHRoaXMuZml0Q2FtZXJhU29vbigpO1xuICAgICAgICB0aGlzLnN1YnNjcmliZURpc3BsYXlTdGF0ZSgpO1xuICAgICAgICB0aGlzLmluc3RhbGxTY2FsZUJhcigpO1xuICAgICAgICB0aGlzLmluc3RhbGxOYXZpZ2F0b3Ioeik7XG4gICAgICAgIHRoaXMuaW5zdGFsbDJkSW50ZXJhY3Rpb24odmlld2VyLCBob3N0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2NoZWR1bGVSZWFkYmFjaygpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbbmFwYXJpLWpzXSBwbG90IGZhaWxlZDonLCBlcnIpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBDaGFubmVsczogcGVyLWNoYW5uZWwgY29tcG9zaXRlLCBMVVQsIG5hdGl2ZSBoaXN0b2dyYW1zIChqaXQtdWkjMTAyKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogVGhlIGdyYXlzY2FsZSBkaXNwbGF5IGNvbG9ybWFwIGZyb20gdGhlIHN0b3JlIHNlbGVjdGlvbiAoK3JldmVyc2UpLCBkZWZhdWx0aW5nIHRvIGdyYXkuXG4gICAqICBNYXBzIHRoZSBqaXQtdWkgc3RvcmUgY29sb3JtYXAgbm9kZSB0byBhIG5hcGFyaSBgQ29sb3JtYXBgIHZpYSB0aGUgbGlicmFyeSdzIExVVCBmYWN0b3J5O1xuICAgKiAgdGhlIG11bHRpY2hhbm5lbCB0aW50IHJhbXBzIGFyZSBidWlsdCBpbnNpZGUge0BsaW5rIE11bHRpQ2hhbm5lbEltYWdlVmlld30gZnJvbSBlYWNoXG4gICAqICBjaGFubmVsJ3MgaGV4IGNvbG91ci4gKi9cbiAgcHJpdmF0ZSBncmF5c2NhbGVDb2xvcm1hcCgpOiBDb2xvcm1hcCB8IHN0cmluZyB7XG4gICAgY29uc3QgdmFsdWUgPSAodGhpcy5jdXJyZW50Q29sb3JtYXAgYXMgeyBkYXRhPzogeyB2YWx1ZT86IHVua25vd24gfSB9IHwgbnVsbCk/LmRhdGE/LnZhbHVlO1xuICAgIGNvbnN0IGx1dCA9IHZhbHVlICE9IG51bGwgPyBidWlsZENvbG9ybWFwTHV0KHZhbHVlLCB0aGlzLmN1cnJlbnRSZXZlcnNlKSA6IG51bGw7XG4gICAgaWYgKGx1dCkgcmV0dXJuIGNvbG9ybWFwRnJvbUx1dCgnZ3JheS1jbWFwJywgbHV0KTtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50UmV2ZXJzZVxuICAgICAgPyBjb2xvcm1hcEZyb21MdXQoJ2dyYXktcmV2JywgW1syNTUsIDI1NSwgMjU1XSwgWzAsIDAsIDBdXSBhcyBSZ2JbXSlcbiAgICAgIDogJ2dyYXknO1xuICB9XG5cbiAgLyoqIEZldGNoIGEgc3RpdGNoZWQgc2xpY2UgYW5kIHJlYWQgaXQgYmFjayBhcyBhIHNpbmdsZS1jaGFubmVsIHVpbnQ4IHBsYW5lLiBgY2hhbm5lbGAgc2VsZWN0cyBhXG4gICAqICBiYW5kIChtdWx0aWNoYW5uZWwpOyBvbWl0IGl0IGZvciB0aGUgZ3JheXNjYWxlIGNvbXBvc2l0ZSAoYWxsIG92ZXJ2aWV3IGxldmVscyBhdmFpbGFibGUsIHNvIGFcbiAgICogIGxhcmdlIGltYWdlIHBpY2tzIGEgZml0dGluZyBkb3duc2NhbGVkIGxldmVsIHJhdGhlciB0aGFuIG9ubHkgdGhlIGZ1bGwtcmVzIHJlYWwgbGV2ZWwpLiAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoQ2hhbm5lbERhdGEoXG4gICAgejogbnVtYmVyLFxuICAgIGNoYW5uZWw/OiBudW1iZXIsXG4gICAgYnVkZ2V0VGlsZXM/OiBudW1iZXIsXG4gICk6IFByb21pc2U8eyBkYXRhOiBVaW50OEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9PiB7XG4gICAgY29uc3QgYm1wID0gYXdhaXQgdGhpcy5mZXRjaFNsaWNlKHosIGNoYW5uZWwsIGJ1ZGdldFRpbGVzKTtcbiAgICByZXR1cm4gdGhpcy5iaXRtYXBUb0x1bWluYW5jZShibXApO1xuICB9XG5cbiAgLyoqIERlY29kZSBhbiBgSW1hZ2VCaXRtYXBgIChzZXJ2ZXIgYmFuZHMgYXJlIGdyYXlzY2FsZSwgUj1HPUIpIHRvIGEgc2luZ2xlLWNoYW5uZWwgdWludDggcGxhbmUuXG4gICAqICBgbWF4U2lkZWAgY2FwcyB0aGUgbG9uZ2VzdCBzaWRlIChkb3duc2NhbGluZyBvbiB0aGUgY2FudmFzIGRyYXcpIOKAlCB1c2VkIHRvIGtlZXAgcHJlLWxvYWRlZFxuICAgKiAgc3VyZmFjZSBzbGljZSBwbGFuZXMgc21hbGwuICovXG4gIHByaXZhdGUgYml0bWFwVG9MdW1pbmFuY2UoXG4gICAgYm1wOiBJbWFnZUJpdG1hcCxcbiAgICBtYXhTaWRlPzogbnVtYmVyLFxuICApOiB7IGRhdGE6IFVpbnQ4QXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0ge1xuICAgIGNvbnN0IHNjYWxlID0gbWF4U2lkZSA/IE1hdGgubWluKDEsIG1heFNpZGUgLyBNYXRoLm1heChibXAud2lkdGgsIGJtcC5oZWlnaHQsIDEpKSA6IDE7XG4gICAgY29uc3QgdyA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoYm1wLndpZHRoICogc2NhbGUpKTtcbiAgICBjb25zdCBoID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChibXAuaGVpZ2h0ICogc2NhbGUpKTtcbiAgICBsZXQgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IE9mZnNjcmVlbkNhbnZhcztcbiAgICBpZiAodHlwZW9mIE9mZnNjcmVlbkNhbnZhcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXModywgaCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgY2FudmFzLndpZHRoID0gdztcbiAgICAgIGNhbnZhcy5oZWlnaHQgPSBoO1xuICAgIH1cbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKSBhc1xuICAgICAgfCBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRcbiAgICAgIHwgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICB8IG51bGw7XG4gICAgaWYgKCFjdHgpIHRocm93IG5ldyBFcnJvcignW25hcGFyaS1qc10gY2hhbm5lbCByZWFkYmFjazogMkQgY29udGV4dCB1bmF2YWlsYWJsZScpO1xuICAgIC8vIFNjYWxlIHRoZSBXSE9MRSBiaXRtYXAgaW50byB0aGUgKHBvc3NpYmx5IHNtYWxsZXIpIHRhcmdldCBjYW52YXMg4oCUIGRyYXdpbmcgYXQgbmF0dXJhbCBzaXplXG4gICAgLy8gd291bGQgY3JvcCB0byB0aGUgdG9wLWxlZnQgd8OXaCBjb3JuZXIgd2hlbiBkb3duc2NhbGluZyBhIGxhcmdlIHNsaWNlIChtYXhTaWRlIDwgYm1wIHNpemUpLlxuICAgIGN0eC5kcmF3SW1hZ2UoYm1wLCAwLCAwLCB3LCBoKTtcbiAgICBibXAuY2xvc2U/LigpO1xuICAgIGNvbnN0IHJnYmEgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHcsIGgpLmRhdGE7XG4gICAgY29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KHcgKiBoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHcgKiBoOyBpKyspIGRhdGFbaV0gPSByZ2JhW2kgKiA0XTtcbiAgICByZXR1cm4geyBkYXRhLCB3aWR0aDogdywgaGVpZ2h0OiBoIH07XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoZSAyRCBpbWFnZSBmb3Igc2xpY2UgYHpgLiBXaXRoIGEgc2VydmVyIHB5cmFtaWQgZGVzY3JpcHRvciB3ZSB1c2UgYSBweXJhbWlkYWxcbiAgICoge0BsaW5rIFRpbGVkU291cmNlfSBwZXIgbGF5ZXIgc28gdGhlIHZpZXcgcmVmaW5lcyB0byBoaWdoZXIgcmVzb2x1dGlvbiBvbiB6b29tIChsaWtlIE9TRCkgYW5kXG4gICAqIHNpdHMgbmF0dXJhbGx5IGluIGZ1bGwtcmVzb2x1dGlvbiBjb29yZGluYXRlczsgd2l0aG91dCBvbmUgd2UgZmFsbCBiYWNrIHRvIHRoZSBzaW5nbGUtbGV2ZWxcbiAgICogc3RpdGNoLiBUaHJlZSBkaXNwbGF5IG1vZGVzIGVpdGhlciB3YXk6IG11bHRpY2hhbm5lbCBhZGRpdGl2ZSB0aW50LCBncmF5c2NhbGUgY29sb3JtYXAsIFJHQi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVuZGVySW1hZ2UoejogbnVtYmVyLCB0b2tlbj86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBpZiAoIXYpIHJldHVybjtcbiAgICBjb25zdCBkZXNjID0gYXdhaXQgdGhpcy5lbnN1cmVEZXNjcmlwdG9yKCk7XG4gICAgaWYgKGRlc2MgJiYgZGVzYy5sZXZlbHM/Lmxlbmd0aCkge1xuICAgICAgaWYgKHRva2VuICE9IG51bGwgJiYgdG9rZW4gIT09IHRoaXMuc2xpY2VSZXEpIHJldHVybjtcbiAgICAgIGF3YWl0IHRoaXMucmVuZGVySW1hZ2VUaWxlZCh6LCBkZXNjKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVuZGVySW1hZ2VTdGl0Y2hlZCh6LCB0b2tlbik7XG4gIH1cblxuICAvKiogU2luZ2xlLWxldmVsIHN0aXRjaCBmYWxsYmFjayAobm8gZGVzY3JpcHRvcik6IHRoZSBwcmUtdGlsaW5nIHBhdGguICovXG4gIHByaXZhdGUgYXN5bmMgcmVuZGVySW1hZ2VTdGl0Y2hlZCh6OiBudW1iZXIsIHRva2VuPzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIGNvbnN0IGRlc2MgPSBhd2FpdCB0aGlzLmVuc3VyZURlc2NyaXB0b3IoKTtcbiAgICBjb25zdCBzdGF0ZXMgPSB0aGlzLnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKCk7XG4gICAgY29uc3QgY2hhbm5lbENvdW50ID0gZGVzYz8uY2hhbm5lbHMgPz8gKHN0YXRlcy5sZW5ndGggfHwgMSk7XG4gICAgY29uc3QgbXVsdGljaGFubmVsID0gISFkZXNjPy5tdWx0aWNoYW5uZWwgJiYgY2hhbm5lbENvdW50ID4gMTtcblxuICAgIC8vIDEpIEZldGNoIGFsbCBwaXhlbCBkYXRhIEJFRk9SRSB0b3VjaGluZyB0aGUgdmlld2VyLCBzbyBhIHN1cGVyc2VkZWQgc2NydWIgY2FuIGJhaWwgd2l0aG91dFxuICAgIC8vICAgIGhhdmluZyB0b3JuIGRvd24gdGhlIHZpc2libGUgbGF5ZXJzIChhdm9pZHMgZmxpY2tlciAvIG91dC1vZi1vcmRlciBsYXllciBzdGF0ZSkuXG4gICAgbGV0IG1vZGU6ICdncmF5c2NhbGUnIHwgJ211bHRpY2hhbm5lbCcgfCAncmdiJztcbiAgICBsZXQgcGxhbmVzOiBBcnJheTx7IGRhdGE6IFVpbnQ4QXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+ID0gW107XG4gICAgbGV0IGJpdG1hcDogSW1hZ2VCaXRtYXAgfCBudWxsID0gbnVsbDtcbiAgICBpZiAobXVsdGljaGFubmVsKSB7XG4gICAgICBtb2RlID0gJ211bHRpY2hhbm5lbCc7XG4gICAgICBwbGFuZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgQXJyYXkuZnJvbSh7IGxlbmd0aDogY2hhbm5lbENvdW50IH0sIChfLCBjKSA9PiB0aGlzLmZldGNoQ2hhbm5lbERhdGEoeiwgYykpLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGNoYW5uZWxDb3VudCA9PT0gMSkge1xuICAgICAgbW9kZSA9ICdncmF5c2NhbGUnO1xuICAgICAgLy8gQ29tcG9zaXRlIGZldGNoIChubyBjaGFubmVsKSDihpIgYWxsIG92ZXJ2aWV3IGxldmVscyB1c2FibGUsIHNvIGEgbGFyZ2UgZ3JheXNjYWxlIGltYWdlXG4gICAgICAvLyBzZWxlY3RzIGEgZml0dGluZyBkb3duc2NhbGVkIGxldmVsIGluc3RlYWQgb2YgdGhlIGZ1bGwtcmVzIHJlYWwgbGV2ZWwgKHRleHR1cmUgbGltaXQpLlxuICAgICAgcGxhbmVzID0gW2F3YWl0IHRoaXMuZmV0Y2hDaGFubmVsRGF0YSh6KV07XG4gICAgfSBlbHNlIHtcbiAgICAgIG1vZGUgPSAncmdiJztcbiAgICAgIGJpdG1hcCA9IGF3YWl0IHRoaXMuZmV0Y2hTbGljZSh6KTtcbiAgICB9XG5cbiAgICAvLyAyKSBDb21taXQg4oCUIHVubGVzcyBhIG5ld2VyIHNjcnViIHN1cGVyc2VkZWQgdXMgb3IgdGhlIHZpZXdlciB3YXMgdG9ybiBkb3duLlxuICAgIGlmICgodG9rZW4gIT0gbnVsbCAmJiB0b2tlbiAhPT0gdGhpcy5zbGljZVJlcSkgfHwgdGhpcy52aWV3ZXIgIT09IHYpIHtcbiAgICAgIGJpdG1hcD8uY2xvc2U/LigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRoZSBkaXNwbGF5ZWQgdGV4dHVyZSBtYXkgYmUgYSBkb3duc2NhbGVkIHB5cmFtaWQgbGV2ZWw7IHNjYWxlIHRoZSBsYXllciBpbnRvIEZVTEwtUkVTT0xVVElPTlxuICAgIC8vIHdvcmxkIGNvb3JkaW5hdGVzIChsZXZlbC0wIHBpeGVscykgc28gdGhlIGNhbWVyYSwgcmVhZGJhY2sgYW5kIOKAlCBjcml0aWNhbGx5IOKAlCBwcmUtc2F2ZWRcbiAgICAvLyByZWdpb25zIChzdG9yZWQgaW4gZnVsbC1yZXMgY29vcmRzLCBlLmcuIG5kcGkpIGFsbCBsaW5lIHVwIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggbGV2ZWwgaXMgc2hvd24uXG4gICAgLy8gVGhpcyBtaXJyb3JzIE9TRCwgd2hvc2UgY29vcmRpbmF0ZSBzeXN0ZW0gaXMgYWx3YXlzIGxldmVsIDAuXG4gICAgY29uc3QgdGV4VyA9IG1vZGUgPT09ICdyZ2InID8gKGJpdG1hcCBhcyBJbWFnZUJpdG1hcCkud2lkdGggOiBwbGFuZXNbMF0/LndpZHRoID8/IDA7XG4gICAgY29uc3QgdGV4SCA9IG1vZGUgPT09ICdyZ2InID8gKGJpdG1hcCBhcyBJbWFnZUJpdG1hcCkuaGVpZ2h0IDogcGxhbmVzWzBdPy5oZWlnaHQgPz8gMDtcbiAgICBjb25zdCBmdWxsVyA9IGRlc2M/LndpZHRoIHx8IHRleFcgfHwgMTtcbiAgICBjb25zdCBmdWxsSCA9IGRlc2M/LmhlaWdodCB8fCB0ZXhIIHx8IDE7XG4gICAgY29uc3Qgc2NhbGU6IFtudW1iZXIsIG51bWJlcl0gPSBbdGV4VyA/IGZ1bGxXIC8gdGV4VyA6IDEsIHRleEggPyBmdWxsSCAvIHRleEggOiAxXTtcblxuICAgIHRoaXMuaW1hZ2VNb2RlID0gbW9kZTtcbiAgICBjb25zdCBpbnRlcnBvbGF0aW9uOiAnbGluZWFyJyB8ICduZWFyZXN0JyA9IHRoaXMuaW1hZ2VTbW9vdGhpbmcgPyAnbGluZWFyJyA6ICduZWFyZXN0JztcbiAgICB0aGlzLmNoYW5uZWxWaWV3ID0gbmV3IE11bHRpQ2hhbm5lbEltYWdlVmlldyh2KTtcbiAgICBpZiAobW9kZSA9PT0gJ211bHRpY2hhbm5lbCcpIHtcbiAgICAgIGNvbnN0IHZpZXdzOiBDaGFubmVsVmlld1tdID0gcGxhbmVzLm1hcCgoZCwgYykgPT4ge1xuICAgICAgICBjb25zdCBzdCA9IHN0YXRlcy5maW5kKChzKSA9PiBzLmluZGV4ID09PSBjKTtcbiAgICAgICAgY29uc3QgY29sb3IgPSBzdD8uY29sb3IgPz8gZGVzYz8uY2hhbm5lbEluZm8/LltjXT8uY29sb3IgPz8gdGludEZvcihjKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzb3VyY2U6IHsga2luZDogJ3R5cGVkJywgd2lkdGg6IGQud2lkdGgsIGhlaWdodDogZC5oZWlnaHQsIGNoYW5uZWxzOiAxLCBkdHlwZTogJ3VpbnQ4JywgZGF0YTogZC5kYXRhIH0sXG4gICAgICAgICAgdGludDogY29sb3IsXG4gICAgICAgICAgbmFtZTogc3Q/Lm5hbWUgPz8gYGNoJHtjfWAsXG4gICAgICAgICAgY29udHJhc3RMaW1pdHM6IFtzdD8ubWluID8/IDAsIHN0Py5tYXggPz8gMjU1XSxcbiAgICAgICAgICBnYW1tYTogc3Q/LmdhbW1hID8/IDEsXG4gICAgICAgICAgdmlzaWJsZTogc3Q/LnZpc2libGUgPz8gdHJ1ZSxcbiAgICAgICAgICBpbnZlcnQ6IHRoaXMuaW52ZXJ0RW5hYmxlZCxcbiAgICAgICAgICBzY2FsZSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jaGFubmVsVmlldy5yZW5kZXIoJ211bHRpY2hhbm5lbCcsIHZpZXdzLCB7IGludGVycG9sYXRpb24gfSk7XG4gICAgfSBlbHNlIGlmIChtb2RlID09PSAnZ3JheXNjYWxlJykge1xuICAgICAgY29uc3QgZCA9IHBsYW5lc1swXTtcbiAgICAgIGNvbnN0IHN0ID0gc3RhdGVzWzBdO1xuICAgICAgdGhpcy5jaGFubmVsVmlldy5yZW5kZXIoXG4gICAgICAgICdncmF5c2NhbGUnLFxuICAgICAgICBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgc291cmNlOiB7IGtpbmQ6ICd0eXBlZCcsIHdpZHRoOiBkLndpZHRoLCBoZWlnaHQ6IGQuaGVpZ2h0LCBjaGFubmVsczogMSwgZHR5cGU6ICd1aW50OCcsIGRhdGE6IGQuZGF0YSB9LFxuICAgICAgICAgICAgY29sb3JtYXA6IHRoaXMuZ3JheXNjYWxlQ29sb3JtYXAoKSxcbiAgICAgICAgICAgIGNvbnRyYXN0TGltaXRzOiBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV0sXG4gICAgICAgICAgICBnYW1tYTogc3Q/LmdhbW1hID8/IDEsXG4gICAgICAgICAgICBpbnZlcnQ6IHRoaXMuaW52ZXJ0RW5hYmxlZCxcbiAgICAgICAgICAgIHNjYWxlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHsgaW50ZXJwb2xhdGlvbiB9LFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jaGFubmVsVmlldy5yZW5kZXIoJ3JnYicsIFt7IHNvdXJjZTogYml0bWFwIGFzIEltYWdlQml0bWFwLCBzY2FsZSB9XSwgeyBpbnRlcnBvbGF0aW9uIH0pO1xuICAgIH1cbiAgICB0aGlzLmltYWdlVyA9IGZ1bGxXO1xuICAgIHRoaXMuaW1hZ2VIID0gZnVsbEg7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoZSAyRCBpbWFnZSB3aXRoIHB5cmFtaWRhbCB7QGxpbmsgVGlsZWRTb3VyY2V9cyDigJQgdGhlIHZpZXcgcmVmaW5lcyB0byBoaWdoZXIgcmVzb2x1dGlvblxuICAgKiBhcyB5b3Ugem9vbSBpbiAodGhlIHZpc3VhbCBmZXRjaGVzIHRoZSBsZXZlbCB3aG9zZSB0ZXhlbHMg4omIIHNjcmVlbiBwaXhlbHMpIGFuZCBzaXRzIGluIGZ1bGwtcmVzXG4gICAqIGNvb3JkaW5hdGVzIHNvIHJlZ2lvbnMgYWxpZ24uIFNhbWUgdGhyZWUgbW9kZXMgYXMgdGhlIHN0aXRjaCBwYXRoLiBQZXItY2hhbm5lbCBsYXllcnMgdXNlIHRoZVxuICAgKiBSRUFMIHB5cmFtaWQgbGV2ZWxzIChwZXItY2hhbm5lbCB0aWxlcyBvbmx5IGV4aXN0IHRoZXJlKTsgdGhlIGNvbXBvc2l0ZSB1c2VzIGFsbCBsZXZlbHMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlbmRlckltYWdlVGlsZWQoejogbnVtYmVyLCBkZXNjOiBUaWxlRGVzY3JpcHRvcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBpZiAoIXYpIHJldHVybjtcbiAgICBjb25zdCBzdGF0ZXMgPSB0aGlzLnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKCk7XG4gICAgY29uc3QgY2hhbm5lbENvdW50ID0gZGVzYy5jaGFubmVscyA/PyAoc3RhdGVzLmxlbmd0aCB8fCAxKTtcbiAgICBjb25zdCBtdWx0aWNoYW5uZWwgPSAhIWRlc2MubXVsdGljaGFubmVsICYmIGNoYW5uZWxDb3VudCA+IDE7XG4gICAgY29uc3QgaW50ZXJwb2xhdGlvbjogJ2xpbmVhcicgfCAnbmVhcmVzdCcgPSB0aGlzLmltYWdlU21vb3RoaW5nID8gJ2xpbmVhcicgOiAnbmVhcmVzdCc7XG5cbiAgICB0aGlzLnRpbGVkID0gdHJ1ZTtcbiAgICB0aGlzLmNoYW5uZWxWaWV3ID0gbmV3IE11bHRpQ2hhbm5lbEltYWdlVmlldyh2KTtcblxuICAgIGlmIChtdWx0aWNoYW5uZWwpIHtcbiAgICAgIHRoaXMuaW1hZ2VNb2RlID0gJ211bHRpY2hhbm5lbCc7XG4gICAgICBjb25zdCB2aWV3czogQ2hhbm5lbFZpZXdbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjaGFubmVsQ291bnQ7IGMrKykge1xuICAgICAgICBjb25zdCBzdCA9IHN0YXRlcy5maW5kKChzKSA9PiBzLmluZGV4ID09PSBjKTtcbiAgICAgICAgY29uc3QgY29sb3IgPSBzdD8uY29sb3IgPz8gZGVzYy5jaGFubmVsSW5mbz8uW2NdPy5jb2xvciA/PyB0aW50Rm9yKGMpO1xuICAgICAgICB2aWV3cy5wdXNoKHtcbiAgICAgICAgICBzb3VyY2U6IHRoaXMuYnVpbGRUaWxlZFNvdXJjZShkZXNjLCBjLCAxKSxcbiAgICAgICAgICB0aW50OiBjb2xvcixcbiAgICAgICAgICBuYW1lOiBzdD8ubmFtZSA/PyBgY2gke2N9YCxcbiAgICAgICAgICBjb250cmFzdExpbWl0czogW3N0Py5taW4gPz8gMCwgc3Q/Lm1heCA/PyAyNTVdLFxuICAgICAgICAgIGdhbW1hOiBzdD8uZ2FtbWEgPz8gMSxcbiAgICAgICAgICB2aXNpYmxlOiBzdD8udmlzaWJsZSA/PyB0cnVlLFxuICAgICAgICAgIGludmVydDogdGhpcy5pbnZlcnRFbmFibGVkLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2hhbm5lbFZpZXcucmVuZGVyKCdtdWx0aWNoYW5uZWwnLCB2aWV3cywgeyBpbnRlcnBvbGF0aW9uIH0pO1xuICAgIH0gZWxzZSBpZiAoY2hhbm5lbENvdW50ID09PSAxKSB7XG4gICAgICB0aGlzLmltYWdlTW9kZSA9ICdncmF5c2NhbGUnO1xuICAgICAgY29uc3Qgc3QgPSBzdGF0ZXNbMF07XG4gICAgICB0aGlzLmNoYW5uZWxWaWV3LnJlbmRlcihcbiAgICAgICAgJ2dyYXlzY2FsZScsXG4gICAgICAgIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuYnVpbGRUaWxlZFNvdXJjZShkZXNjLCB1bmRlZmluZWQsIDEpLFxuICAgICAgICAgICAgY29sb3JtYXA6IHRoaXMuZ3JheXNjYWxlQ29sb3JtYXAoKSxcbiAgICAgICAgICAgIGNvbnRyYXN0TGltaXRzOiBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV0sXG4gICAgICAgICAgICBnYW1tYTogc3Q/LmdhbW1hID8/IDEsXG4gICAgICAgICAgICBpbnZlcnQ6IHRoaXMuaW52ZXJ0RW5hYmxlZCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICB7IGludGVycG9sYXRpb24gfSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW1hZ2VNb2RlID0gJ3JnYic7XG4gICAgICB0aGlzLmNoYW5uZWxWaWV3LnJlbmRlcigncmdiJywgW3sgc291cmNlOiB0aGlzLmJ1aWxkVGlsZWRTb3VyY2UoZGVzYywgdW5kZWZpbmVkLCA0KSB9XSwge1xuICAgICAgICBpbnRlcnBvbGF0aW9uLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuaW1hZ2VXID0gZGVzYy53aWR0aDtcbiAgICB0aGlzLmltYWdlSCA9IGRlc2MuaGVpZ2h0O1xuICAgIC8vIEF3YWl0IG9uIHRoZSBpbml0aWFsIHJlbmRlciBzbyBnZXRIaXN0b2dyYW0vYXV0b0NvbnRyYXN0IGhhdmUgZGF0YSBpbW1lZGlhdGVseTsgc2xpY2UgY2hhbmdlc1xuICAgIC8vIHJlZnJlc2ggZmlyZS1hbmQtZm9yZ2V0ICh0aGUgaGlzdG9ncmFtIHBhbmUgcmV0cmllcykuXG4gICAgYXdhaXQgdGhpcy5yZWZyZXNoSGlzdG9ncmFtU2FtcGxlcyh6LCBkZXNjKTtcbiAgfVxuXG4gIC8qKiBCdWlsZCBhIHB5cmFtaWRhbCBUaWxlZFNvdXJjZSBiYWNrZWQgYnkgdGhlIHNlcnZlciBgL3RpbGVgIGVuZHBvaW50LiBgY2hhbm5lbGAgc2VsZWN0cyBhIGJhbmRcbiAgICogIChncmF5c2NhbGUgbHVtaW5hbmNlLCByZWFsIGxldmVscyBvbmx5KTsgb21pdCBpdCBmb3IgdGhlIGNvbXBvc2l0ZSAoUkdCQSwgYWxsIGxldmVscykuICovXG4gIHByaXZhdGUgYnVpbGRUaWxlZFNvdXJjZShcbiAgICBkZXNjOiBUaWxlRGVzY3JpcHRvcixcbiAgICBjaGFubmVsOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgY2hhbm5lbHM6IDEgfCA0LFxuICApOiBUaWxlZFNvdXJjZSB7XG4gICAgY29uc3QgaW5mb0I2NCA9IHRoaXMudGlsZXMuZ2V0U2VsZWN0ZWRJbmZvQjY0KCkgPz8gJyc7XG4gICAgLy8gUGVyLWNoYW5uZWwgdGlsZXMgZXhpc3Qgb25seSBhdCBSRUFMIEJpby1Gb3JtYXRzIGxldmVsczsgdGhlIGNvbXBvc2l0ZSBleGlzdHMgYXQgYWxsIGxldmVscy5cbiAgICBjb25zdCB1c2FibGUgPVxuICAgICAgY2hhbm5lbCA9PSBudWxsXG4gICAgICAgID8gZGVzYy5sZXZlbHNcbiAgICAgICAgOiBkZXNjLmxldmVscy5zbGljZSgwLCBNYXRoLm1heCgxLCBkZXNjLnJlYWxMZXZlbHMgPz8gZGVzYy5sZXZlbHMubGVuZ3RoKSk7XG4gICAgY29uc3QgbGV2ZWxTY2FsZXMgPSB1c2FibGUubWFwKChsKSA9PiBkZXNjLndpZHRoIC8gTWF0aC5tYXgoMSwgbC53aWR0aCkpOyAvLyBsZXZlbC0wIHB4IHBlciBsZXZlbCBweFxuICAgIGNvbnN0IHRpbGVTaXplID0gZGVzYy50aWxlU2l6ZSB8fCBUSUxFX1NJWkU7XG4gICAgY29uc3QgY2ggPSBjaGFubmVsID09IG51bGwgPyAnJyA6IGAmY2hhbm5lbD0ke2NoYW5uZWx9YDtcbiAgICBjb25zdCBhcGkgPSB0aGlzLmFwaTtcbiAgICByZXR1cm4ge1xuICAgICAga2luZDogJ3RpbGVkJyxcbiAgICAgIHdpZHRoOiBkZXNjLndpZHRoLFxuICAgICAgaGVpZ2h0OiBkZXNjLmhlaWdodCxcbiAgICAgIHRpbGVTaXplLFxuICAgICAgbGV2ZWxzOiB1c2FibGUubGVuZ3RoLFxuICAgICAgbGV2ZWxTY2FsZXMsXG4gICAgICBkZXB0aDogTWF0aC5tYXgoMSwgZGVzYy56IHx8IDEpLFxuICAgICAgY2hhbm5lbHMsXG4gICAgICBkdHlwZTogJ3VpbnQ4JyxcbiAgICAgIGZldGNoVGlsZTogYXN5bmMgKGtleTogVGlsZUtleSk6IFByb21pc2U8UGl4ZWxDaHVuaz4gPT4ge1xuICAgICAgICBjb25zdCByZXMgPSB1c2FibGVba2V5LmxldmVsXT8ucmVzID8/IGtleS5sZXZlbDtcbiAgICAgICAgY29uc3QgdXJsID0gYCR7YXBpfXRpbGU/aW5mbz0ke2luZm9CNjR9JnJlcz0ke3Jlc30mY29sPSR7a2V5LmNvbH0mcm93PSR7a2V5LnJvd30mej0ke2tleS56fSZ0aWxlU2l6ZT0ke3RpbGVTaXplfSR7Y2h9YDtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IGF3YWl0IHRoaXMudGlsZXNcbiAgICAgICAgICAuZ2V0QXV0aEhlYWRlcnMoKVxuICAgICAgICAgIC5jYXRjaCgoKSA9PiAoe30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xuICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgICAgIGlmICghcmVzcC5vaykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgW25hcGFyaS1qc10gdGlsZSAke2tleS5sZXZlbH0vJHtrZXkuY29sfS8ke2tleS5yb3d9IOKGkiAke3Jlc3Auc3RhdHVzfWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJtcCA9IGF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKGF3YWl0IHJlc3AuYmxvYigpKTtcbiAgICAgICAgaWYgKGNoYW5uZWxzID09PSA0KSByZXR1cm4geyB3aWR0aDogYm1wLndpZHRoLCBoZWlnaHQ6IGJtcC5oZWlnaHQsIGRhdGE6IGJtcCB9O1xuICAgICAgICByZXR1cm4gdGhpcy5iaXRtYXBUb0x1bWluYW5jZShibXApO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIChSZSlmZXRjaCBhIGNvYXJzZSBwZXItY2hhbm5lbCBsdW1pbmFuY2Ugc2FtcGxlIGZvciB0aGUgaGlzdG9ncmFtICh0aWxlZCBtb2RlIGhhcyBubyBmdWxsXG4gICAqICBpbi1tZW1vcnkgcGl4ZWxzKS4gT25lIGNoZWFwIG92ZXJ2aWV3IHRpbGUgcGVyIGNoYW5uZWw7IGNhY2hlZCBieSBjaGFubmVsIGluZGV4LiAqL1xuICBwcml2YXRlIGFzeW5jIHJlZnJlc2hIaXN0b2dyYW1TYW1wbGVzKHo6IG51bWJlciwgZGVzYzogVGlsZURlc2NyaXB0b3IpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmhpc3RTYW1wbGVzLmNsZWFyKCk7XG4gICAgaWYgKHRoaXMuaW1hZ2VNb2RlID09PSAncmdiJykgcmV0dXJuOyAvLyBSR0IgdXNlcyB0aGUgZGlzcGxheWVkLXBpeGVsIHJlYWRiYWNrIChyZ2JIaXN0b2dyYW0pXG4gICAgY29uc3QgY2hhbm5lbENvdW50ID0gdGhpcy5pbWFnZU1vZGUgPT09ICdtdWx0aWNoYW5uZWwnID8gZGVzYy5jaGFubmVscyA/PyAxIDogMTtcbiAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNoYW5uZWxDb3VudDsgYysrKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjaCA9IHRoaXMuaW1hZ2VNb2RlID09PSAnbXVsdGljaGFubmVsJyA/IGMgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGQgPSBhd2FpdCB0aGlzLmZldGNoQ2hhbm5lbERhdGEoeiwgY2gsIDEpOyAvLyBidWRnZXQgMSDihpIgY29hcnNlc3Qgc2luZ2xlIHRpbGVcbiAgICAgICAgdGhpcy5oaXN0U2FtcGxlcy5zZXQoYywgZC5kYXRhKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvKiBsZWF2ZSB0aGlzIGNoYW5uZWwncyBzYW1wbGUgdW5zZXQgKi9cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogU3Vic2NyaWJlIGNoYW5uZWwgc3RhdGVzICsgZ3JheXNjYWxlIGNvbG9ybWFwIOKGkiBsaXZlLWFwcGx5IHRvIHRoZSByZW5kZXJlZCBsYXllcnMgKG5vXG4gICAqICByZS1mZXRjaDsgb25seSB6IGNoYW5nZXMgcmUtZmV0Y2gpLiBSZXBsYWNlcyBhbnkgcHJpb3Igc3Vic2NyaXB0aW9uLiAqL1xuICBwcml2YXRlIHN1YnNjcmliZURpc3BsYXlTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BsYXlTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5kaXNwbGF5U3ViID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnN0b3JlLmdldENoYW5uZWxTdGF0ZXMoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXAoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0UmV2ZXJzZVNjYWxlKCksXG4gICAgICB0aGlzLnN0b3JlLmdldEludmVydCgpLFxuICAgIF0pLnN1YnNjcmliZSgoW2NoYW5uZWxzLCBjb2xvcm1hcCwgcmV2ZXJzZSwgaW52ZXJ0XSkgPT4ge1xuICAgICAgdGhpcy5jdXJyZW50Q29sb3JtYXAgPSAoY29sb3JtYXAgYXMgQ29sb3JtYXBOb2RlKSA/PyBudWxsO1xuICAgICAgdGhpcy5jdXJyZW50UmV2ZXJzZSA9IHJldmVyc2U7XG4gICAgICB0aGlzLmludmVydEVuYWJsZWQgPSBpbnZlcnQ7XG4gICAgICB0aGlzLmFwcGx5RGlzcGxheVN0YXRlKGNoYW5uZWxzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBTdWJzY3JpYmUgdGhlIHN0b3JlIGNvbG9ybWFwICgrcmV2ZXJzZSksIGludmVydCwgYW5kIGNoYW5uZWwgc3RhdGUg4oaSIHRoZSB2b2x1bWUvaXNvc3VyZmFjZVxuICAgKiAgdHJhbnNmZXIgZnVuY3Rpb246IGNvbG91ciAoY2hhbm5lbCB0aW50IG9yIHNlbGVjdGVkIGNvbG9ybWFwKSwgdGhlIGludGVuc2l0eSAqKndpbmRvd1xuICAgKiAgKG1pbi9tYXgg4oaSIGNvbnRyYXN0TGltaXRzKSoqIGFuZCAqKmdhbW1hKiosIG1pcnJvcmluZyB0aGUgZ3JheXNjYWxlIGltYWdlJ3MgZGlzcGxheSBjb250cm9sc1xuICAgKiAgc28gdGhlIGhpc3RvZ3JhbSBwYW5lIGRyaXZlcyB0aGUgM0QgcmVuZGVyLiBSZXBsYWNlcyBhbnkgcHJpb3Igc3Vic2NyaXB0aW9uLiAqL1xuICBwcml2YXRlIHN1YnNjcmliZVZvbHVtZURpc3BsYXlTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BsYXlTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5kaXNwbGF5U3ViID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnN0b3JlLmdldENvbG9ybWFwKCksXG4gICAgICB0aGlzLnN0b3JlLmdldFJldmVyc2VTY2FsZSgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRJbnZlcnQoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q2hhbm5lbFN0YXRlcygpLFxuICAgIF0pLnN1YnNjcmliZSgoW2NvbG9ybWFwLCByZXZlcnNlLCBpbnZlcnQsIGNoYW5uZWxzXSkgPT4ge1xuICAgICAgdGhpcy5jdXJyZW50Q29sb3JtYXAgPSAoY29sb3JtYXAgYXMgQ29sb3JtYXBOb2RlKSA/PyBudWxsO1xuICAgICAgdGhpcy5jdXJyZW50UmV2ZXJzZSA9IHJldmVyc2U7XG4gICAgICB0aGlzLmludmVydEVuYWJsZWQgPSBpbnZlcnQ7XG4gICAgICBjb25zdCB2aWV3ID0gdGhpcy52b2x1bWVWaWV3O1xuICAgICAgaWYgKCF2aWV3KSByZXR1cm47XG4gICAgICBpZiAodGhpcy52b2x1bWVNdWx0aWNoYW5uZWwpIHtcbiAgICAgICAgLy8gRWFjaCBjaGFubmVsJ3MgbGF5ZXIgaXMgdGludGVkIGJ5IGl0cyBjb2xvdXIgYW5kIGdldHMgaXRzIG93biB3aW5kb3cvZ2FtbWEvdmlzaWJpbGl0eS5cbiAgICAgICAgdmlldy5sYXllcnMuZm9yRWFjaCgoXywgYykgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0ID0gY2hhbm5lbHMuZmluZCgocykgPT4gcy5pbmRleCA9PT0gYyk7XG4gICAgICAgICAgdmlldy51cGRhdGVDaGFubmVsKGMsIHtcbiAgICAgICAgICAgIGNvbG9ybWFwOiB0aGlzLmNoYW5uZWxUaW50Q29sb3JtYXAoc3Q/LmNvbG9yID8/ICcjZmZmZmZmJyksXG4gICAgICAgICAgICAuLi4oc3RcbiAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICBjb250cmFzdExpbWl0czogW3N0Lm1pbiwgc3QubWF4XSBhcyBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgICAgICAgICAgICAgZ2FtbWE6IHN0LmdhbW1hLFxuICAgICAgICAgICAgICAgICAgdmlzaWJsZTogc3QudmlzaWJsZSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHN0ID0gY2hhbm5lbHNbMF07XG4gICAgICAgIHZpZXcudXBkYXRlQ2hhbm5lbCgwLCB7XG4gICAgICAgICAgY29sb3JtYXA6IHRoaXMudm9sdW1lQ29sb3JtYXAoc3QpLFxuICAgICAgICAgIC4uLihzdCA/IHsgY29udHJhc3RMaW1pdHM6IFtzdC5taW4sIHN0Lm1heF0gYXMgW251bWJlciwgbnVtYmVyXSwgZ2FtbWE6IHN0LmdhbW1hIH0gOiB7fSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEEgY2hhbm5lbCdzIHRpbnQgY29sb3JtYXAgKGJsYWNr4oaSY29sb3VyKSB3aXRoIHJldmVyc2Utc2NhbGUgLyBpbnZlcnQgYXBwbGllZCBieSBmbGlwcGluZy4gKi9cbiAgcHJpdmF0ZSBjaGFubmVsVGludENvbG9ybWFwKGNvbG9yOiBzdHJpbmcpOiBDb2xvcm1hcCB8IHN0cmluZyB7XG4gICAgbGV0IGNtYXA6IENvbG9ybWFwIHwgc3RyaW5nID0gdGludENvbG9ybWFwKGNvbG9yKTtcbiAgICBpZiAodGhpcy5jdXJyZW50UmV2ZXJzZSkgY21hcCA9IHJldmVyc2VDb2xvcm1hcChjbWFwKTtcbiAgICBpZiAodGhpcy5pbnZlcnRFbmFibGVkKSBjbWFwID0gcmV2ZXJzZUNvbG9ybWFwKGNtYXApO1xuICAgIHJldHVybiBjbWFwO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbG91ciBtYXAgZm9yIHRoZSB2b2x1bWUvaXNvc3VyZmFjZS4gQSByZWFsIGNvbG9ybWFwIHNlbGVjdGlvbiAodmlyaWRpcy9tYWdtYS/igKYpIHdpbnM7XG4gICAqIG90aGVyd2lzZSB0aGUgY2hhbm5lbCdzIGNvbG91ciB0aW50cyBpdCAoc28gdGhlIGNoYW5uZWwtZGlhbG9nIGNvbG91ciBzd2F0Y2ggcmVjb2xvcnMgdGhlIDNEXG4gICAqIHJlbmRlcikuIFJldmVyc2Utc2NhbGUgYW5kIGludmVydCBlYWNoIGZsaXAgdGhlIHJhbXAg4oCUIHRoZSBgVm9sdW1lTGF5ZXJgIGhhcyBubyBwZXItbGF5ZXJcbiAgICogaW52ZXJ0LCBzbyBib3RoIGFyZSBlbXVsYXRlZCBieSByZXZlcnNpbmcgdGhlIGNvbG9ybWFwLlxuICAgKi9cbiAgcHJpdmF0ZSB2b2x1bWVDb2xvcm1hcChzdDogSUNoYW5uZWxTdGF0ZSB8IHVuZGVmaW5lZCk6IENvbG9ybWFwIHwgc3RyaW5nIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5jdXJyZW50Q29sb3JtYXAgYXMgeyBsYWJlbD86IHN0cmluZzsgZGF0YT86IHsgdmFsdWU/OiB1bmtub3duIH0gfSB8IG51bGw7XG4gICAgLy8gQSBjb2xvcmVkIGNvbG9ybWFwICh2aXJpZGlzL21hZ21hL+KApikgZHJpdmVzIHRoZSB2b2x1bWU7IHRoZSBkZWZhdWx0IGdyYXlzY2FsZSBmYW1pbHlcbiAgICAvLyAoZ3JheSAvIEdyZXlzIC8gR3JleXMgSW52KSB5aWVsZHMgdG8gdGhlIGNoYW5uZWwncyBjb2xvdXIgc28gdGhlIGRpYWxvZyBjb2xvdXIgc3dhdGNoXG4gICAgLy8gcmVjb2xvcnMgdGhlIDNEIHJlbmRlci5cbiAgICBjb25zdCBsYWJlbCA9IChub2RlPy5sYWJlbCA/PyAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBncmF5RmFtaWx5ID0gbGFiZWwgPT09ICcnIHx8IGxhYmVsLmluY2x1ZGVzKCdncmV5JykgfHwgbGFiZWwuaW5jbHVkZXMoJ2dyYXknKTtcbiAgICBjb25zdCB2YWx1ZSA9IG5vZGU/LmRhdGE/LnZhbHVlO1xuICAgIGNvbnN0IGx1dCA9ICFncmF5RmFtaWx5ICYmIHZhbHVlICE9IG51bGwgPyBidWlsZENvbG9ybWFwTHV0KHZhbHVlLCBmYWxzZSkgOiBudWxsO1xuICAgIGxldCBjbWFwOiBDb2xvcm1hcCB8IHN0cmluZyA9IGx1dFxuICAgICAgPyBjb2xvcm1hcEZyb21MdXQoJ3ZvbC1jbWFwJywgbHV0KVxuICAgICAgOiB0aW50Q29sb3JtYXAoc3Q/LmNvbG9yID8/ICcjZmZmZmZmJyk7XG4gICAgLy8gUmV2ZXJzZS1zY2FsZSBhbmQgaW52ZXJ0IGVhY2ggZmxpcCB0aGUgcmFtcCAodGhlIFZvbHVtZUxheWVyIGhhcyBubyBwZXItbGF5ZXIgaW52ZXJ0KS5cbiAgICBpZiAodGhpcy5jdXJyZW50UmV2ZXJzZSkgY21hcCA9IHJldmVyc2VDb2xvcm1hcChjbWFwKTtcbiAgICBpZiAodGhpcy5pbnZlcnRFbmFibGVkKSBjbWFwID0gcmV2ZXJzZUNvbG9ybWFwKGNtYXApO1xuICAgIHJldHVybiBjbWFwO1xuICB9XG5cbiAgLyoqIEFwcGx5IHRoZSBjdXJyZW50IGNoYW5uZWwgc3RhdGVzIC8gY29sb3JtYXAgdG8gdGhlIGxpdmUgbGF5ZXJzIChubyByZS1mZXRjaCksIGRlbGVnYXRpbmcgdGhlXG4gICAqICBwZXItY2hhbm5lbCBsYXllciBtdXRhdGlvbnMgdG8gdGhlIHtAbGluayBNdWx0aUNoYW5uZWxJbWFnZVZpZXd9LiAqL1xuICBwcml2YXRlIGFwcGx5RGlzcGxheVN0YXRlKGNoYW5uZWxzOiBJQ2hhbm5lbFN0YXRlW10pOiB2b2lkIHtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5jaGFubmVsVmlldztcbiAgICBpZiAoIXRoaXMudmlld2VyIHx8ICF2aWV3KSByZXR1cm47XG4gICAgaWYgKHRoaXMuaW1hZ2VNb2RlID09PSAnbXVsdGljaGFubmVsJykge1xuICAgICAgdmlldy5sYXllcnMuZm9yRWFjaCgoXywgYykgPT4ge1xuICAgICAgICBjb25zdCBzdCA9IGNoYW5uZWxzLmZpbmQoKHMpID0+IHMuaW5kZXggPT09IGMpO1xuICAgICAgICBpZiAoIXN0KSByZXR1cm47XG4gICAgICAgIHZpZXcudXBkYXRlQ2hhbm5lbChjLCB7XG4gICAgICAgICAgdGludDogc3QuY29sb3IsXG4gICAgICAgICAgY29udHJhc3RMaW1pdHM6IFtzdC5taW4sIHN0Lm1heF0sXG4gICAgICAgICAgZ2FtbWE6IHN0LmdhbW1hLFxuICAgICAgICAgIHZpc2libGU6IHN0LnZpc2libGUsXG4gICAgICAgICAgaW52ZXJ0OiB0aGlzLmludmVydEVuYWJsZWQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmltYWdlTW9kZSA9PT0gJ2dyYXlzY2FsZScpIHtcbiAgICAgIGNvbnN0IHN0ID0gY2hhbm5lbHNbMF07XG4gICAgICB2aWV3LnVwZGF0ZUNoYW5uZWwoMCwge1xuICAgICAgICBjb2xvcm1hcDogdGhpcy5ncmF5c2NhbGVDb2xvcm1hcCgpLFxuICAgICAgICBpbnZlcnQ6IHRoaXMuaW52ZXJ0RW5hYmxlZCxcbiAgICAgICAgLi4uKHN0ID8geyBjb250cmFzdExpbWl0czogW3N0Lm1pbiwgc3QubWF4XSBhcyBbbnVtYmVyLCBudW1iZXJdLCBnYW1tYTogc3QuZ2FtbWEgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiAoUmUpaW5zdGFsbCB0aGUgcGh5c2ljYWwgc2NhbGUgYmFyIG92ZXIgdGhlIDJEIGltYWdlLCBzaXplZCBmcm9tIHRoZSBpbWFnZSdzIMK1bS9waXhlbFxuICAgKiAgKGAvdGlsZXMvaW5mb2AgbXBwWCwgZmFsbGluZyBiYWNrIHRvIHRoZSBpbWFnZSBtZXRhZGF0YSkuIE5vLW9wIHdpdGhvdXQgYSBwaHlzaWNhbCBzaXplLiAqL1xuICBwcml2YXRlIGluc3RhbGxTY2FsZUJhcigpOiB2b2lkIHtcbiAgICB0aGlzLnNjYWxlQmFyPy5kZXN0cm95KCk7XG4gICAgdGhpcy5zY2FsZUJhciA9IG51bGw7XG4gICAgY29uc3QgbXBwWCA9IHRoaXMuZGVzY3JpcHRvcj8ubXBwWCB8fCB0aGlzLmxvYWRlZD8uaW1hZ2VJbmZvLmltYWdlTWV0YT8uWzBdPy5tcHBYIHx8IDA7XG4gICAgaWYgKHRoaXMudmlld2VyICYmIHRoaXMuaG9zdCAmJiBtcHBYID4gMCkge1xuICAgICAgdGhpcy5zY2FsZUJhciA9IG5ldyBOYXBhcmlTY2FsZUJhcih0aGlzLmhvc3QsIHRoaXMudmlld2VyLmNhbWVyYSwgbXBwWCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBvdmVydmlldyBuYXZpZ2F0b3IgZm9yIGEgMkQgdmlldyB3aXRoIGFuIGltYWdlOiBhIGNvYXJzZSB0aHVtYm5haWwgb2YgdGhlIHdob2xlXG4gICAqIGltYWdlIHdpdGggdGhlIHZpZXdwb3J0IG9uIGl0OyBjbGljayBvciBkcmFnIHRvIHBhbiBhdCB0aGUgY3VycmVudCB6b29tIChhcyBPU0QpLlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsTmF2aWdhdG9yKHo6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubmF2aWdhdG9yPy5kZXN0cm95KCk7XG4gICAgdGhpcy5uYXZpZ2F0b3IgPSBudWxsO1xuICAgIGlmICghdGhpcy52aWV3ZXIgfHwgIXRoaXMuaG9zdCB8fCAhdGhpcy5pbWFnZVcgfHwgIXRoaXMuaW1hZ2VIKSByZXR1cm47XG4gICAgdGhpcy5uYXZpZ2F0b3IgPSBuZXcgTmFwYXJpTmF2aWdhdG9yKFxuICAgICAgdGhpcy5ob3N0LCB0aGlzLnZpZXdlci5jYW1lcmEsIHRoaXMuaW1hZ2VXLCB0aGlzLmltYWdlSCwgKCkgPT4gdGhpcy5zcGF0aWFsVG9vbHRpcD8uaGlkZSgpLFxuICAgICk7XG4gICAgdGhpcy5uYXZpZ2F0b3Iuc2V0VmlzaWJsZSh0aGlzLm5hdmlnYXRvclZpc2libGUpO1xuICAgIHZvaWQgdGhpcy5yZWZyZXNoTmF2aWdhdG9ySW1hZ2Uoeik7XG4gIH1cblxuICAvKipcbiAgICogRHJhdyB0aGUgbmF2aWdhdG9yJ3MgdGh1bWJuYWlsIGZyb20gdGhlIGNvYXJzZXN0IHB5cmFtaWQgbGV2ZWwuIEEgbXVsdGljaGFubmVsIGltYWdlXG4gICAqIGlzIGNvbXBvc2l0ZWQgZnJvbSBpdHMgY2hhbm5lbHMgaW4gdGhlaXIgZGlzcGxheSBjb2xvdXJzLCBzbyB0aGUgb3ZlcnZpZXcgbG9va3MgbGlrZVxuICAgKiB0aGUgdmlldyByYXRoZXIgdGhhbiBsaWtlIGNoYW5uZWwgMCBpbiBncmV5LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoTmF2aWdhdG9ySW1hZ2UoejogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbmF2ID0gdGhpcy5uYXZpZ2F0b3I7XG4gICAgaWYgKCFuYXYpIHJldHVybjtcbiAgICBjb25zdCB0b2tlbiA9ICsrdGhpcy5uYXZpZ2F0b3JUb2tlbjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGVzYyA9IGF3YWl0IHRoaXMuZW5zdXJlRGVzY3JpcHRvcigpO1xuICAgICAgY29uc3QgY2hhbm5lbHMgPSBkZXNjPy5tdWx0aWNoYW5uZWwgPyBkZXNjLmNoYW5uZWxJbmZvID8/IFtdIDogW107XG4gICAgICBsZXQgaW1hZ2U6IENhbnZhc0ltYWdlU291cmNlO1xuICAgICAgaWYgKGNoYW5uZWxzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgY29uc3QgYml0bWFwcyA9IGF3YWl0IFByb21pc2UuYWxsKGNoYW5uZWxzLm1hcCgoX2MsIGMpID0+IHRoaXMuZmV0Y2hTbGljZSh6LCBjLCAxKSkpO1xuICAgICAgICBpbWFnZSA9IHRpbnRlZENvbXBvc2l0ZShiaXRtYXBzLCBjaGFubmVscy5tYXAoKGMpID0+IGMuY29sb3IgPz8gJyNmZmZmZmYnKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbWFnZSA9IGF3YWl0IHRoaXMuZmV0Y2hTbGljZSh6LCB1bmRlZmluZWQsIDEpO1xuICAgICAgfVxuICAgICAgaWYgKHRva2VuID09PSB0aGlzLm5hdmlnYXRvclRva2VuICYmIHRoaXMubmF2aWdhdG9yID09PSBuYXYpIG5hdi5zZXRJbWFnZShpbWFnZSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIG5hdmlnYXRvciB0aHVtYm5haWwgdW5hdmFpbGFibGUnLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTaG93L2hpZGUgdGhlIG92ZXJ2aWV3IG5hdmlnYXRvciAoc2FtZSBzZXR0aW5nIGFzIE9TRCdzKS4gKi9cbiAgc2V0TmF2aWdhdG9yVmlzaWJsZSh2aXNpYmxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5uYXZpZ2F0b3JWaXNpYmxlID0gdmlzaWJsZTtcbiAgICB0aGlzLm5hdmlnYXRvcj8uc2V0VmlzaWJsZSh2aXNpYmxlKTtcbiAgfVxuXG4gIC8qKiBDb252ZXJ0IGEgbmFwYXJpLWpzIGBIaXN0b2dyYW1gIChiaW4gY291bnQgKyBtaW4vbWF4KSB0byB0aGUgcGFuZSdzIGBJSGlzdG9ncmFtYCAoYmluIGVkZ2VzKS4gKi9cbiAgcHJpdmF0ZSB0b0lIaXN0b2dyYW0oaDogeyBjb3VudHM6IFVpbnQzMkFycmF5OyBiaW5zOiBudW1iZXI7IG1pbjogbnVtYmVyOyBtYXg6IG51bWJlciB9KTogSUhpc3RvZ3JhbSB7XG4gICAgY29uc3Qgc3BhbiA9IGgubWF4IC0gaC5taW4gfHwgMTtcbiAgICBjb25zdCBiaW5zID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogaC5iaW5zIH0sIChfLCBpKSA9PiBoLm1pbiArIChpICogc3BhbikgLyBoLmJpbnMpO1xuICAgIGNvbnN0IGNvdW50cyA9IEFycmF5LmZyb20oaC5jb3VudHMpO1xuICAgIHJldHVybiB7IGJpbnMsIGNvdW50cywgbWF4OiBjb3VudHMucmVkdWNlKChtLCBjKSA9PiAoYyA+IG0gPyBjIDogbSksIDApIH07XG4gIH1cblxuICAvKipcbiAgICogTW91bnQgdGhlIDNEIHZvbHVtZS9pc29zdXJmYWNlLiBBIG11bHRpY2hhbm5lbCBpbWFnZSBiZWNvbWVzIG9uZSBhZGRpdGl2ZSwgdGludGVkXG4gICAqIHtAbGluayBWb2x1bWVMYXllcn0gcGVyIGNoYW5uZWwgKHNvIGVhY2ggY2hhbm5lbCdzIGNvbG91ciBjb21wb3NpdGVzIGludG8gdGhlIHJlbmRlcik7IGFcbiAgICogZ3JheXNjYWxlL2NvbXBvc2l0ZSBpbWFnZSB1c2VzIGEgc2luZ2xlIHZvbHVtZS4gQWRkcyB0aGUgYXhlcyBnaXptbyArIGxhYmVscyBhbmQgd2lyZXMgdGhlXG4gICAqIGRpc3BsYXktc3RhdGUgc3Vic2NyaXB0aW9uLiBUaGUgY2FsbGVyIG93bnMgYHZpZXdlci5yZWFkeWAuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG1vdW50Vm9sdW1lKFxuICAgIHZpZXdlcjogVmlld2VyLFxuICAgIGluZm86IElJbWFnZUluZm8gfCB1bmRlZmluZWQsXG4gICAgcGxvdFR5cGU6IFBsb3RUeXBlLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMubG9hZFRva2VuOyAvLyBiYWlsIGJlZm9yZSByZW5kZXJpbmcgaWYgYSBDYW5jZWwgLyBuZXcgcGxvdCBidW1wcyB0aGlzXG4gICAgY29uc3QgZGVzYyA9IGF3YWl0IHRoaXMuZW5zdXJlRGVzY3JpcHRvcigpO1xuICAgIC8vIFNlcnZlcmxlc3MgbXVsdGljaGFubmVsICh0aWxlZDpmYWxzZSArIGNoYW5uZWxVcmxzKTogbm8gdGlsZSBkZXNjcmlwdG9yLCBzb1xuICAgIC8vIGRlcml2ZSB0aGUgY2hhbm5lbCBjb3VudCBmcm9tIGltYWdlTWV0YSBhbmQgYXNzZW1ibGUgZWFjaCBiYW5kIGZyb20gaXRzIG93blxuICAgIC8vIGNoYW5uZWxVcmxzW3pdW2NdIHBsYW5lIChmZXRjaFNsaWNlIGRvZXMgdGhlIHBlci1jaGFubmVsIHJvdXRpbmcpLlxuICAgIGNvbnN0IHNpbXBsZU1jID0gdGhpcy5zaW1wbGVTdGFjay5pc1NpbXBsZShpbmZvKSAmJiAhIWluZm8/LmNoYW5uZWxVcmxzPy5sZW5ndGhcbiAgICAgICYmIChpbmZvPy5pbWFnZU1ldGE/LlswXT8uY2hhbm5lbENvdW50ID8/IDEpID4gMTtcbiAgICBjb25zdCBjaGFubmVsQ291bnQgPSBzaW1wbGVNYyA/IGluZm8hLmltYWdlTWV0YSFbMF0uY2hhbm5lbENvdW50IDogKGRlc2M/LmNoYW5uZWxzID8/IDEpO1xuICAgIGNvbnN0IG11bHRpY2hhbm5lbCA9IHNpbXBsZU1jIHx8ICghIWRlc2M/Lm11bHRpY2hhbm5lbCAmJiBjaGFubmVsQ291bnQgPiAxKTtcbiAgICBjb25zdCByZXMgPSB2b2x1bWVSZXNvbHV0aW9uRm9yKHRoaXMucmVzb2x1dGlvblNjYWxlKTtcbiAgICBjb25zdCByZW5kZXJpbmc6ICdpc28nIHwgJ21pcCcgPSBpc05hcGFyaUlzb3N1cmZhY2UocGxvdFR5cGUpID8gJ2lzbycgOiAnbWlwJztcbiAgICBjb25zdCBzdGF0ZXMgPSB0aGlzLnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKCk7XG5cbiAgICB0aGlzLnZvbHVtZUNoYW5uZWxEYXRhLmNsZWFyKCk7XG4gICAgdGhpcy52b2x1bWVNdWx0aWNoYW5uZWwgPSBtdWx0aWNoYW5uZWw7XG4gICAgdGhpcy5pbWFnZU1vZGUgPSB0aGlzLnZvbHVtZU11bHRpY2hhbm5lbCA/ICdtdWx0aWNoYW5uZWwnIDogJ2dyYXlzY2FsZSc7XG4gICAgY29uc3QgdmlldyA9IG5ldyBNdWx0aUNoYW5uZWxWb2x1bWVWaWV3KHZpZXdlcik7XG4gICAgdGhpcy52b2x1bWVWaWV3ID0gdmlldztcblxuICAgIC8vIEFzc2VtYmxlIHBlci1jaGFubmVsIHNjYWxhciB2b2x1bWVzIGZyb20gdGhlIHNlcnZlciB0aWxlcyAoaml0LXNwZWNpZmljKTsgdGhlIG5hcGFyaS1qcyB2aWV3XG4gICAgLy8gb3ducyB0aGUgbGF5ZXIgb3JjaGVzdHJhdGlvbiAob25lIGFkZGl0aXZlIHRpbnRlZCB2b2x1bWUgcGVyIGNoYW5uZWwsIG9yIGEgc2luZ2xlIGdyYXlzY2FsZVxuICAgIC8vIHZvbHVtZSkuIFRoZSBhZGFwdGVyIGNvbXB1dGVzIGVhY2ggY2hhbm5lbCdzIGNvbG9ybWFwIChpbmNsLiBpbnZlcnQvcmV2ZXJzZSBmbGlwcykuXG4gICAgbGV0IGRpbXM6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXI7IGRlcHRoOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IGNoYW5uZWxzOiBWb2x1bWVDaGFubmVsW10gPSBbXTtcbiAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dCh0cnVlKTtcbiAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICAgIHRyeSB7XG4gICAgICBpZiAobXVsdGljaGFubmVsKSB7XG4gICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2hhbm5lbENvdW50OyBjKyspIHtcbiAgICAgICAgICBjb25zdCB2b2wgPSBhd2FpdCB0aGlzLmFzc2VtYmxlVm9sdW1lKGluZm8sIHJlcywgYyk7XG4gICAgICAgICAgaWYgKCF2b2wpIGNvbnRpbnVlO1xuICAgICAgICAgIGRpbXMgPSB2b2w7XG4gICAgICAgICAgdGhpcy52b2x1bWVDaGFubmVsRGF0YS5zZXQoYywgdm9sLmRhdGEpO1xuICAgICAgICAgIGNvbnN0IHN0ID0gc3RhdGVzLmZpbmQoKHMpID0+IHMuaW5kZXggPT09IGMpO1xuICAgICAgICAgIGNvbnN0IGNvbG9yID0gc3Q/LmNvbG9yID8/IGRlc2M/LmNoYW5uZWxJbmZvPy5bY10/LmNvbG9yID8/IHRpbnRGb3IoYyk7XG4gICAgICAgICAgY2hhbm5lbHMucHVzaCh7XG4gICAgICAgICAgICBkYXRhOiB2b2wuZGF0YSxcbiAgICAgICAgICAgIHdpZHRoOiB2b2wud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IHZvbC5oZWlnaHQsXG4gICAgICAgICAgICBkZXB0aDogdm9sLmRlcHRoLFxuICAgICAgICAgICAgY29sb3JtYXA6IHRoaXMuY2hhbm5lbFRpbnRDb2xvcm1hcChjb2xvciksXG4gICAgICAgICAgICBjb250cmFzdExpbWl0czogW3N0Py5taW4gPz8gMCwgc3Q/Lm1heCA/PyAyNTVdLFxuICAgICAgICAgICAgZ2FtbWE6IHN0Py5nYW1tYSA/PyAxLFxuICAgICAgICAgICAgdmlzaWJsZTogc3Q/LnZpc2libGUgPz8gdHJ1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgdm9sID0gYXdhaXQgdGhpcy5hc3NlbWJsZVZvbHVtZShpbmZvLCByZXMpO1xuICAgICAgICBpZiAodm9sKSB7XG4gICAgICAgICAgZGltcyA9IHZvbDtcbiAgICAgICAgICB0aGlzLnZvbHVtZUNoYW5uZWxEYXRhLnNldCgwLCB2b2wuZGF0YSk7XG4gICAgICAgICAgY29uc3Qgc3QgPSBzdGF0ZXNbMF07XG4gICAgICAgICAgY2hhbm5lbHMucHVzaCh7XG4gICAgICAgICAgICBkYXRhOiB2b2wuZGF0YSxcbiAgICAgICAgICAgIHdpZHRoOiB2b2wud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IHZvbC5oZWlnaHQsXG4gICAgICAgICAgICBkZXB0aDogdm9sLmRlcHRoLFxuICAgICAgICAgICAgY29sb3JtYXA6IHRoaXMudm9sdW1lQ29sb3JtYXAoc3QpLFxuICAgICAgICAgICAgY29udHJhc3RMaW1pdHM6IFtzdD8ubWluID8/IDAsIHN0Py5tYXggPz8gMjU1XSxcbiAgICAgICAgICAgIGdhbW1hOiBzdD8uZ2FtbWEgPz8gMSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICAgIH1cblxuICAgIGlmICghZGltcyB8fCAhY2hhbm5lbHMubGVuZ3RoIHx8IHRoaXMubG9hZFRva2VuICE9PSB0b2tlbikgcmV0dXJuOyAvLyBjYW5jZWxsZWQg4oaSIGRvbid0IHJlbmRlclxuXG4gICAgLy8gUmVzb2x1dGlvbi1pbnZhcmlhbnQgd29ybGQgYm94LiBTaXppbmcgdGhlIGJveCBieSB0aGUgc2FtcGxlZCB2b3hlbCBjb3VudHMgbWFkZSBoaWdoZXJcbiAgICAvLyBpbi1wbGFuZSByZXNvbHV0aW9uIGdyb3cgWC9ZIHdoaWxlIHRoZSBkZXB0aCBzdGF5ZWQgdGhlIChjb25zdGFudCkgc2xpY2UgY291bnQg4oCUIHNvIFogYXBwZWFyZWRcbiAgICAvLyB0byBzaHJpbmsgYXQgaGlnaGVyIHJlc29sdXRpb24uIEluc3RlYWQgYW5jaG9yIHRoZSBpbi1wbGFuZSBsb25nIHNpZGUgdG8gYSBmaXhlZCByZWZlcmVuY2UgYW5kXG4gICAgLy8gbGV0IFogc3BhbiB0aGUgZnVsbCBzbGljZSBjb3VudDsgdGhlIGJveCBzaGFwZSBpcyB0aGVuIGlkZW50aWNhbCBhdCBldmVyeSBkZWNpbWF0ZSBmYWN0b3IuIFRoZVxuICAgIC8vIHBlci1heGlzIGB2b3hlbFNpemVgIChuYXBhcmkgYHNjYWxlYCkgbWFwcyB0aGUgc2FtcGxlZCBncmlkIG9udG8gdGhhdCBmaXhlZCB3b3JsZCBib3guXG4gICAgLy8gQSBzdGFjayB0aGF0IGRlY2xhcmVzIGl0cyBwaHlzaWNhbCBzcGFjaW5nIG9uIEFMTCBUSFJFRSBheGVzIGdldHMgaXRzIHRydWVcbiAgICAvLyBleHRlbnQgYXMgdGhlIHdvcmxkIGJveCDigJQgdGhlIG9ubHkgd2F5IGFuaXNvdHJvcHkgc3Vydml2ZXMsIGFuZCB3aGF0IG1ha2VzIGFcbiAgICAvLyByZXNhbXBsZWQgNDAgeCA0MCB4IDIwMCDCtW0gdm9sdW1lIHJlYWQgYXMgYSBicmFpbiBpbnN0ZWFkIG9mIGEgY3ViZS1hc3BlY3RcbiAgICAvLyBicmljay4gSXQgbmVlZHMgbm9uZSBvZiB0aGUgcmVmZXJlbmNlLWJveCBhcml0aG1ldGljOiBhIHBoeXNpY2FsIGJveCBpc1xuICAgIC8vIGFscmVhZHkgaW5kZXBlbmRlbnQgb2YgdGhlIGRlY2ltYXRlIGZhY3Rvci5cbiAgICAvL1xuICAgIC8vIEV2ZXJ5dGhpbmcgZWxzZSBrZWVwcyB0aGF0IGFyaXRobWV0aWMuIFNpemluZyB0aGUgYm94IGJ5IHRoZSBzYW1wbGVkIHZveGVsXG4gICAgLy8gY291bnRzIG1hZGUgaGlnaGVyIGluLXBsYW5lIHJlc29sdXRpb24gZ3JvdyBYL1kgd2hpbGUgdGhlIGRlcHRoIHN0YXllZCB0aGVcbiAgICAvLyAoY29uc3RhbnQpIHNsaWNlIGNvdW50IOKAlCBzbyBaIGFwcGVhcmVkIHRvIHNocmluayBhdCBoaWdoZXIgcmVzb2x1dGlvbi5cbiAgICAvLyBBbmNob3JpbmcgdGhlIGluLXBsYW5lIGxvbmcgc2lkZSB0byBhIGZpeGVkIHJlZmVyZW5jZSBhbmQgbGV0dGluZyBaIHNwYW4gdGhlXG4gICAgLy8gZnVsbCBzbGljZSBjb3VudCBtYWtlcyB0aGUgYm94IHNoYXBlIGlkZW50aWNhbCBhdCBldmVyeSBkZWNpbWF0ZSBmYWN0b3IuXG4gICAgY29uc3QgbWV0YSA9IHRoaXMubG9hZGVkPy5pbWFnZUluZm8uaW1hZ2VNZXRhPy5bMF07XG4gICAgY29uc3QgbXBwWFlaOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gfCBudWxsID1cbiAgICAgIG1ldGE/Lm1wcFggJiYgbWV0YT8ubXBwWSAmJiBtZXRhPy5tcHBaID8gW21ldGEubXBwWCwgbWV0YS5tcHBZLCBtZXRhLm1wcFpdIDogbnVsbDtcbiAgICAvLyBUaGUgaW1hZ2UncyBERUNMQVJFRCBwaXhlbCBkaW1lbnNpb25zLCB3aGljaCBpcyB3aGF0IG1wcCBpcyBwZXI6IHRoZSBzYW1wbGVkXG4gICAgLy8gZGltcyBhcmUgZGVjaW1hdGVkLCBzbyBzaXppbmcgYSBwaHlzaWNhbCBib3ggYnkgdGhlbSB3b3VsZCBtYWtlIHRoZSB3b3JsZFxuICAgIC8vIGJveCBkZXBlbmQgb24gdGhlIHJlc29sdXRpb24gdGhlIHVzZXIgaGFwcGVucyB0byBiZSB2aWV3aW5nIGF0LlxuICAgIGNvbnN0IGZ1bGxXID0gdGhpcy5kZXNjcmlwdG9yPy53aWR0aCA/PyBtZXRhPy54ID8/IGRpbXMud2lkdGg7XG4gICAgY29uc3QgZnVsbEggPSB0aGlzLmRlc2NyaXB0b3I/LmhlaWdodCA/PyBtZXRhPy55ID8/IGRpbXMuaGVpZ2h0O1xuICAgIGNvbnN0IGZ1bGxEID0gbWV0YT8ueiB8fCB0aGlzLmxvYWRlZD8uaW1hZ2VJbmZvLnVybHM/Lmxlbmd0aCB8fCBkaW1zLmRlcHRoO1xuICAgIGxldCB3b3JsZDogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlcjsgZGVwdGg6IG51bWJlciB9O1xuICAgIGlmIChtcHBYWVopIHtcbiAgICAgIHdvcmxkID0ge1xuICAgICAgICB3aWR0aDogZnVsbFcgKiBtcHBYWVpbMF0sXG4gICAgICAgIGhlaWdodDogZnVsbEggKiBtcHBYWVpbMV0sXG4gICAgICAgIGRlcHRoOiBmdWxsRCAqIG1wcFhZWlsyXSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZ1bGxMb25nID0gTWF0aC5tYXgoMSwgZnVsbFcsIGZ1bGxIKTtcbiAgICAgIHdvcmxkID0ge1xuICAgICAgICB3aWR0aDogKGZ1bGxXICogVk9MVU1FX1dPUkxEX0lOUExBTkVfUkVGKSAvIGZ1bGxMb25nLFxuICAgICAgICBoZWlnaHQ6IChmdWxsSCAqIFZPTFVNRV9XT1JMRF9JTlBMQU5FX1JFRikgLyBmdWxsTG9uZyxcbiAgICAgICAgZGVwdGg6IGZ1bGxELFxuICAgICAgfTtcbiAgICB9XG4gICAgLy8gQmFzZSBib3ggKFotc2NhbGUgPSAxKSArIHRoZSBzYW1wbGVkIGRlcHRoIGRyaXZlIHRoZSBsaXZlIFotaGVpZ2h0IGhhbmRsZSBiZWxvdzsgdGhlIHBlcnNpc3RlZFxuICAgIC8vIGB2b2x1bWVaU2NhbGVgICh1c2VyIGRyYWcpIGFwcGxpZXMgb24gdG9wIHNvIGNoYW5naW5nIHJlc29sdXRpb24ga2VlcHMgdGhlIGNob3NlbiBoZWlnaHQuXG4gICAgdGhpcy52b2x1bWVXb3JsZEJhc2UgPSB3b3JsZDtcbiAgICB0aGlzLnZvbHVtZVNhbXBsZWREZXB0aCA9IE1hdGgubWF4KDEsIGRpbXMuZGVwdGgpO1xuICAgIGNvbnN0IHdvcmxkWiA9IHdvcmxkLmRlcHRoICogdGhpcy52b2x1bWVaU2NhbGU7XG4gICAgY29uc3Qgdm94ZWxTaXplOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbXG4gICAgICB3b3JsZC53aWR0aCAvIGRpbXMud2lkdGgsXG4gICAgICB3b3JsZC5oZWlnaHQgLyBkaW1zLmhlaWdodCxcbiAgICAgIHdvcmxkWiAvIHRoaXMudm9sdW1lU2FtcGxlZERlcHRoLFxuICAgIF07XG4gICAgZm9yIChjb25zdCBjaCBvZiBjaGFubmVscykgY2gudm94ZWxTaXplID0gdm94ZWxTaXplO1xuXG4gICAgdmlldy5yZW5kZXIodGhpcy52b2x1bWVNdWx0aWNoYW5uZWwgPyAnbXVsdGljaGFubmVsJyA6ICdncmF5c2NhbGUnLCBjaGFubmVscywgeyByZW5kZXJpbmcgfSk7XG4gICAgdGhpcy5pbWFnZVcgPSBkaW1zLndpZHRoO1xuICAgIHRoaXMuaW1hZ2VIID0gZGltcy5oZWlnaHQ7XG4gICAgdGhpcy52b2x1bWVEaW1zID0gZGltcztcblxuICAgIC8vIDNEIGNvb3JkaW5hdGUtYXhlcyAvIHNjYWxlIGdpem1vICsgbGFiZWxzLCBzaGFyaW5nIHRoZSB2b2x1bWUncyB3b3JsZCBib3ggc28gdGhlIGdpem1vIHRyYWNrc1xuICAgIC8vIHRoZSByZW5kZXJlZCBwcm9wb3J0aW9ucy4gUGh5c2ljYWwgc2NhbGUgdGV4dCBzdGlsbCBjb21lcyBmcm9tIHRoZSBGVUxMIGltYWdlIGV4dGVudC5cbiAgICB0aGlzLmF4ZXNMYXllciA9IHZpZXdlci5hZGRBeGVzKHdvcmxkLndpZHRoLCB3b3JsZC5oZWlnaHQsIHdvcmxkWiwgeyB2aXNpYmxlOiB0aGlzLmF4ZXNWaXNpYmxlIH0pO1xuICAgIGlmICh0aGlzLmhvc3QpIHtcbiAgICAgIHRoaXMuYXhlc0xhYmVscyA9IG5ldyBOYXBhcmlBeGVzTGFiZWxzKFxuICAgICAgICB0aGlzLmhvc3QsXG4gICAgICAgIHZpZXdlci5jYW1lcmEzZCxcbiAgICAgICAgdGhpcy5idWlsZEF4ZXNMYWJlbHMoeyB3aWR0aDogd29ybGQud2lkdGgsIGhlaWdodDogd29ybGQuaGVpZ2h0LCBkZXB0aDogd29ybGRaIH0pLFxuICAgICAgKTtcbiAgICAgIHRoaXMuYXhlc0xhYmVscy5zZXRWaXNpYmxlKHRoaXMuYXhlc1Zpc2libGUpO1xuICAgICAgLy8gSW4tdmlldyBkcmFnIGhhbmRsZSBhdCB0aGUgVE9QIEVORCBPRiBUSEUgWiBBWElTICh0aGUgYm94J3MgbWluLVhZIGNvcm5lciwgd2hlcmUgdGhlIGJsdWVcbiAgICAgIC8vIFwiWlwiIGF4aXMgKyBsYWJlbCBsaXZlKSwgc28gaXQgcmVhZHMgYXMgdGhlIFotaGVpZ2h0IGNvbnRyb2wuIEZsb2F0ZWQgYSBsaXR0bGUgcGFzdCB0aGUgYXhpc1xuICAgICAgLy8gdGlwICjDlzEuMTIpIHNvIHRoZSBncmlwIGNsZWFycyB0aGUgXCJaIMK3IOKAplwiIGxhYmVsLiBEcmFnIOKGlSB0byByZXN0cmV0Y2ggWiBsaXZlLlxuICAgICAgdGhpcy56SGFuZGxlID0gbmV3IE5hcGFyaVZvbHVtZVpIYW5kbGUodGhpcy5ob3N0LCB2aWV3ZXIuY2FtZXJhM2QsIHtcbiAgICAgICAgdG9wQW5jaG9yOiAoKSA9PiBbXG4gICAgICAgICAgLXRoaXMudm9sdW1lV29ybGRCYXNlIS53aWR0aCAvIDIsXG4gICAgICAgICAgLXRoaXMudm9sdW1lV29ybGRCYXNlIS5oZWlnaHQgLyAyLFxuICAgICAgICAgICgodGhpcy52b2x1bWVXb3JsZEJhc2UhLmRlcHRoICogdGhpcy52b2x1bWVaU2NhbGUpIC8gMikgKiAxLjEyLFxuICAgICAgICBdLFxuICAgICAgICBnZXRTY2FsZTogKCkgPT4gdGhpcy52b2x1bWVaU2NhbGUsXG4gICAgICAgIHNldFNjYWxlOiAocykgPT4gdGhpcy5zZXRWb2x1bWVaU2NhbGUocyksXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5zdWJzY3JpYmVWb2x1bWVEaXNwbGF5U3RhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0cmV0Y2ggdGhlIHZvbHVtZSdzIFogaGVpZ2h0IGxpdmUgKGRyaXZlbiBieSB0aGUgaW4tdmlldyB7QGxpbmsgTmFwYXJpVm9sdW1lWkhhbmRsZX0pLiBPbmx5XG4gICAqIHRoZSBwZXItYXhpcyBgdm94ZWxTaXplYCAvIGF4ZXMgZGVwdGggY2hhbmdlIOKAlCB0aGUgdm94ZWwgdGV4dHVyZXMgYXJlIHVudG91Y2hlZCDigJQgc28gZHJhZ2dpbmcgaXNcbiAgICogc21vb3RoLiBgZmFjdG9yYCBpcyByZWxhdGl2ZSB0byB0aGUgdm9sdW1lJ3MgbmF0dXJhbCBwcm9wb3J0aW9ucyAoMSkuIFBlcnNpc3RzIGFjcm9zcyByZS1tb3VudHNcbiAgICogKHJlc29sdXRpb24gY2hhbmdlcykgc28gdGhlIGNob3NlbiBoZWlnaHQgc3RpY2tzLlxuICAgKi9cbiAgcHJpdmF0ZSBzZXRWb2x1bWVaU2NhbGUoZmFjdG9yOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnZvbHVtZVpTY2FsZSA9IE1hdGgubWluKDEwLCBNYXRoLm1heCgwLjEsIGZhY3RvcikpO1xuICAgIGNvbnN0IGJhc2UgPSB0aGlzLnZvbHVtZVdvcmxkQmFzZTtcbiAgICBpZiAoIWJhc2UgfHwgIXRoaXMudm9sdW1lVmlldykgcmV0dXJuO1xuICAgIGNvbnN0IHdvcmxkWiA9IGJhc2UuZGVwdGggKiB0aGlzLnZvbHVtZVpTY2FsZTtcbiAgICBjb25zdCB2c1ogPSB3b3JsZFogLyB0aGlzLnZvbHVtZVNhbXBsZWREZXB0aDtcbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMudm9sdW1lVmlldy5sYXllcnMpIHtcbiAgICAgIGNvbnN0IFtzeCwgc3ldID0gbGF5ZXIudm94ZWxTaXplO1xuICAgICAgbGF5ZXIudm94ZWxTaXplID0gW3N4LCBzeSwgdnNaXTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYXhlc0xheWVyKSB0aGlzLmF4ZXNMYXllci5kZXB0aCA9IHdvcmxkWjtcbiAgICB0aGlzLmF4ZXNMYWJlbHM/LnVwZGF0ZUFuY2hvcnMoXG4gICAgICB0aGlzLmJ1aWxkQXhlc0xhYmVscyh7IHdpZHRoOiBiYXNlLndpZHRoLCBoZWlnaHQ6IGJhc2UuaGVpZ2h0LCBkZXB0aDogd29ybGRaIH0pLFxuICAgICk7XG4gICAgdGhpcy56SGFuZGxlPy5yZXBvc2l0aW9uKCk7XG4gICAgdGhpcy52aWV3ZXI/LnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKiBCdWlsZCB0aGUgWC9ZL1ogYXhpcy1lbmQgbGFiZWwgc3BlY3MgZm9yIHRoZSAzRCBnaXptby4gQW5jaG9ycyBhcmUgaW4gdGhlIHZvbHVtZSdzIGNlbnRyZWRcbiAgICogIHdvcmxkIGJveCAobWF0Y2hpbmcgdGhlIEF4ZXNMYXllciBnZW9tZXRyeSk7IHRoZSBzY2FsZSB0ZXh0IHJlZmxlY3RzIHRoZSBGVUxMIGltYWdlIGV4dGVudCDigJRcbiAgICogIHBoeXNpY2FsIMK1bSB3aGVuIMK1bS9waXhlbCBpcyBrbm93biwgZWxzZSBwaXhlbCAoWC9ZKSAvIHNsaWNlIChaKSBjb3VudHMuICovXG4gIHByaXZhdGUgYnVpbGRBeGVzTGFiZWxzKFxuICAgIHZvbDogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlcjsgZGVwdGg6IG51bWJlciB9LFxuICApOiBBeGlzTGFiZWxTcGVjW10ge1xuICAgIGNvbnN0IGh4ID0gdm9sLndpZHRoIC8gMjtcbiAgICBjb25zdCBoeSA9IHZvbC5oZWlnaHQgLyAyO1xuICAgIGNvbnN0IGh6ID0gdm9sLmRlcHRoIC8gMjtcbiAgICAvLyBNZWFzdXJlZCBmcm9tIHRoZSBJTUFHRSdzIG93biBleHRlbnQsIG5ldmVyIGZyb20gdGhlIHdvcmxkIGJveDogdGhlIGJveCBpcyBhXG4gICAgLy8gc2hhcGUgKGFuZCBmb3IgYSBwaHlzaWNhbGx5IHNpemVkIHZvbHVtZSBpdCBpcyBhbHJlYWR5IGluIMK1bSwgc28gcmVhZGluZyBhXG4gICAgLy8gcGl4ZWwgY291bnQgb2ZmIGl0IGFuZCBtdWx0aXBseWluZyBieSBtcHAgd291bGQgc2NhbGUgdGhlIGxhYmVsIHR3aWNlKS5cbiAgICBjb25zdCB7IHB4LCBtcHAgfSA9IHRoaXMuaW1hZ2VFeHRlbnQoKTtcbiAgICBjb25zdCBsZW4gPSAobjogbnVtYmVyLCB1bTogbnVtYmVyKTogc3RyaW5nID0+ICh1bSA+IDAgPyBmb3JtYXRVbShuICogdW0pIDogYCR7bn0gcHhgKTtcbiAgICByZXR1cm4gW1xuICAgICAgeyBhbmNob3I6IFtoeCwgLWh5LCAtaHpdLCB0ZXh0OiBgWCDCtyAke2xlbihweFswXSwgbXBwWzBdKX1gLCBjb2xvcjogJyNlZDQ1NDUnIH0sXG4gICAgICB7IGFuY2hvcjogWy1oeCwgaHksIC1oel0sIHRleHQ6IGBZIMK3ICR7bGVuKHB4WzFdLCBtcHBbMV0pfWAsIGNvbG9yOiAnIzRkZDk1OScgfSxcbiAgICAgIC8vIFBoeXNpY2FsIHdoZW4gdGhlIHN0YWNrIGRlY2xhcmVzIGl0cyBzbGljZSBzcGFjaW5nIChgbXBwWmApIOKAlCBhIHJlc2FtcGxlZFxuICAgICAgLy8gdm9sdW1lIGtub3dzIGhvdyB0aGljayBpdCBpczsgYSBwbGFpbiB6LXN0YWNrIGNhbiBvbmx5IHNheSBob3cgbWFueSBzbGljZXMuXG4gICAgICB7IGFuY2hvcjogWy1oeCwgLWh5LCBoel0sIHRleHQ6IGBaIMK3ICR7bGVuKHB4WzJdLCBtcHBbMl0pfWAsIGNvbG9yOiAnIzY2OGNmZicgfSxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBpbWFnZSdzIGRlY2xhcmVkIGV4dGVudCBpbiBwaXhlbHMvc2xpY2VzLCBhbmQgaXRzIHBoeXNpY2FsIHNwYWNpbmcgcGVyXG4gICAqIGF4aXMgaW4gwrVtICgwID0gdW5kZWNsYXJlZCwgYW5kIHRoZW4gdGhhdCBheGlzIHJlYWRzIGluIHBpeGVscykuXG4gICAqXG4gICAqIE9uZSBwbGFjZSwgYmVjYXVzZSB0aGUgdm9sdW1lIHdvcmxkIGJveCBhbmQgdGhlIGF4aXMgbGFiZWxzIGhhdmUgdG8gYWdyZWVcbiAgICogYWJvdXQgd2hhdCB0aGUgaW1hZ2UncyByZWFsIGRpbWVuc2lvbnMgYXJlIOKAlCB0aGUgc2FtcGxlZCBncmlkIGlzIGRlY2ltYXRlZCBhbmRcbiAgICogc2F5cyBub3RoaW5nIGFib3V0IGVpdGhlci5cbiAgICovXG4gIHByaXZhdGUgaW1hZ2VFeHRlbnQoKTogeyBweDogW251bWJlciwgbnVtYmVyLCBudW1iZXJdOyBtcHA6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB9IHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5sb2FkZWQ/LmltYWdlSW5mby5pbWFnZU1ldGE/LlswXTtcbiAgICBjb25zdCBkaW1zID0gdGhpcy52b2x1bWVEaW1zO1xuICAgIGNvbnN0IG1wcFggPSB0aGlzLmRlc2NyaXB0b3I/Lm1wcFggfHwgbWV0YT8ubXBwWCB8fCAwO1xuICAgIHJldHVybiB7XG4gICAgICBweDogW1xuICAgICAgICB0aGlzLmRlc2NyaXB0b3I/LndpZHRoID8/IG1ldGE/LnggPz8gZGltcz8ud2lkdGggPz8gMSxcbiAgICAgICAgdGhpcy5kZXNjcmlwdG9yPy5oZWlnaHQgPz8gbWV0YT8ueSA/PyBkaW1zPy5oZWlnaHQgPz8gMSxcbiAgICAgICAgbWV0YT8ueiB8fCB0aGlzLmxvYWRlZD8uaW1hZ2VJbmZvLnVybHM/Lmxlbmd0aCB8fCBkaW1zPy5kZXB0aCB8fCAxLFxuICAgICAgXSxcbiAgICAgIC8vIEEgZGVzY3JpcHRvciB0aGF0IHJlcG9ydHMgb25seSBtcHBYIGlzIHNxdWFyZS1waXhlbCBieSBjb252ZW50aW9uLCB3aGljaCBpc1xuICAgICAgLy8gd2hhdCB0aGUgMkQgc2NhbGUgYmFyIGFscmVhZHkgYXNzdW1lcyBvZiBpdC5cbiAgICAgIG1wcDogW21wcFgsIHRoaXMuZGVzY3JpcHRvcj8ubXBwWSB8fCBtZXRhPy5tcHBZIHx8IG1wcFgsIG1ldGE/Lm1wcFogfHwgMF0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NlbWJsZSBhIGRvd25zYW1wbGVkIHVpbnQ4IHZvbHVtZSAobHVtaW5hbmNlKSBmcm9tIHRoZSBwZXItc2xpY2UgdGlsZSBlbmRwb2ludC4gU2xpY2VzIGFyZVxuICAgKiBmZXRjaGVkIHdpdGggYm91bmRlZCBjb25jdXJyZW5jeSAoa2VlcHMgdGhlIGNvbm5lY3Rpb24gcG9vbCBmdWxsIHdpdGhvdXQgZmxvb2RpbmcgaXQgb24gYSBkZWVwXG4gICAqIHN0YWNrKSBhbmQgcmVhZCBpbnRvIHRoZSB2b2x1bWUgYXMgZWFjaCBhcnJpdmVzLCBkcml2aW5nIHtAbGluayBzdGFja0xvYWRpbmdQcm9ncmVzcyR9IHNvIHRoZVxuICAgKiBob3N0IHNob3dzIGEgZGV0ZXJtaW5hdGUgcHJvZ3Jlc3MgYmFyIGluc3RlYWQgb2YgYSBiYXJlIHNwaW5uZXIuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGFzc2VtYmxlVm9sdW1lKFxuICAgIGluZm86IElJbWFnZUluZm8gfCB1bmRlZmluZWQsXG4gICAgb3B0czogeyBtYXhTbGljZT86IG51bWJlcjsgc2xpY2VTdGVwPzogbnVtYmVyIH0gPSB7fSxcbiAgICBjaGFubmVsPzogbnVtYmVyLFxuICApOiBQcm9taXNlPHsgZGF0YTogVWludDhBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXI7IGRlcHRoOiBudW1iZXIgfSB8IG51bGw+IHtcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMubG9hZFRva2VuOyAvLyBiYWlsIGlmIGEgQ2FuY2VsIC8gbmV3IHBsb3QgYnVtcHMgdGhpcyB3aGlsZSB3ZSBmZXRjaFxuICAgIGNvbnN0IGZ1bGxEZXB0aCA9IGluZm8/LmltYWdlTWV0YT8uWzBdPy56IHx8IGluZm8/LnVybHM/Lmxlbmd0aCB8fCAxO1xuICAgIGlmIChmdWxsRGVwdGggPCAxKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIG5vIHNsaWNlcyB0byBhc3NlbWJsZSBhIHZvbHVtZScpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHN0ZXAgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKG9wdHMuc2xpY2VTdGVwID8/IDEpKTtcbiAgICBjb25zdCBtYXhTbGljZSA9IG9wdHMubWF4U2xpY2UgPz8gVk9MVU1FX01BWF9TTElDRTtcbiAgICAvLyBTb3VyY2Utc2xpY2UgaW5kaWNlcyBzYW1wbGVkIGludG8gdGhlIHZvbHVtZSAoZXZlcnkgYHN0ZXBgdGggcGxhbmUg4oaSIGxvdy1yZXMgaXMgZmFzdGVyKS5cbiAgICBjb25zdCB6SW5kaWNlczogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGxldCB6ID0gMDsgeiA8IGZ1bGxEZXB0aDsgeiArPSBzdGVwKSB6SW5kaWNlcy5wdXNoKHopO1xuICAgIGNvbnN0IGRlcHRoID0gekluZGljZXMubGVuZ3RoO1xuXG4gICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dCgwKTtcbiAgICB0cnkge1xuICAgICAgLy8gRmV0Y2ggZWFjaCBzbGljZSBhdCBhIHB5cmFtaWQgbGV2ZWwgbWF0Y2hpbmcgYG1heFNsaWNlYCAoYnVkZ2V0IHNjYWxlcyB3aXRoIHRoZSBkZWNpbWF0ZVxuICAgICAgLy8gZmFjdG9yKSwgc28gYSBoaWdoZXIgZmFjdG9yIHB1bGxzIGEgZmluZXIgbGV2ZWwg4oaSIG1vcmUgcmVhbCBpbi1wbGFuZSBkZXRhaWw7IHRoZW4gZG93bnNhbXBsZVxuICAgICAgLy8gdG8gYG1heFNsaWNlYC4gYGNoYW5uZWxgIHNlbGVjdHMgYSBiYW5kIChtdWx0aWNoYW5uZWwgdm9sdW1lKTsgb21pdCBmb3IgdGhlIGdyYXlzY2FsZVxuICAgICAgLy8gY29tcG9zaXRlLiBUaGUgY2FsbGVyIG93bnMgdGhlIHN0YWNrTG9hZGluZyBmbGFnIChtdWx0aWNoYW5uZWwgYXNzZW1ibGVzIGNoYW5uZWxzIGluIHR1cm4pLlxuICAgICAgY29uc3QgYnVkZ2V0ID0gdGhpcy50aWxlQnVkZ2V0Rm9yKG1heFNsaWNlKTtcbiAgICAgIGNvbnN0IGZpcnN0ID0gYXdhaXQgdGhpcy5mZXRjaFNsaWNlKHpJbmRpY2VzWzBdLCBjaGFubmVsLCBidWRnZXQpO1xuICAgICAgY29uc3Qgc2NhbGUgPSBNYXRoLm1pbigxLCBtYXhTbGljZSAvIE1hdGgubWF4KGZpcnN0LndpZHRoLCBmaXJzdC5oZWlnaHQsIDEpKTtcbiAgICAgIGNvbnN0IHdpZHRoID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChmaXJzdC53aWR0aCAqIHNjYWxlKSk7XG4gICAgICBjb25zdCBoZWlnaHQgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGZpcnN0LmhlaWdodCAqIHNjYWxlKSk7XG4gICAgICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkod2lkdGggKiBoZWlnaHQgKiBkZXB0aCk7XG5cbiAgICAgIGxldCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgT2Zmc2NyZWVuQ2FudmFzO1xuICAgICAgaWYgKHR5cGVvZiBPZmZzY3JlZW5DYW52YXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMod2lkdGgsIGhlaWdodCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICB9XG4gICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKSBhc1xuICAgICAgICB8IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRFxuICAgICAgICB8IE9mZnNjcmVlbkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRFxuICAgICAgICB8IG51bGw7XG4gICAgICBpZiAoIWN0eCkgdGhyb3cgbmV3IEVycm9yKCduYXBhcmktanMgdm9sdW1lIGFzc2VtYmx5OiAyRCBjb250ZXh0IHVuYXZhaWxhYmxlJyk7XG5cbiAgICAgIC8vIFJlYWQgb25lIGZldGNoZWQgc2xpY2UgYml0bWFwIGludG8gdGhlIHZvbHVtZSBwbGFuZSBgemAgKGx1bWluYW5jZSkuIFN5bmNocm9ub3VzIGJldHdlZW5cbiAgICAgIC8vIGF3YWl0cywgc28gdGhlIHNoYXJlZCAyRCBjb250ZXh0IGlzIHNhZmUgdG8gcmV1c2UgYWNyb3NzIHRoZSBjb25jdXJyZW50IGZldGNoIHdvcmtlcnMuXG4gICAgICBsZXQgZG9uZSA9IDA7XG4gICAgICBjb25zdCByZWFkU2xpY2UgPSAoejogbnVtYmVyLCBibXA6IEltYWdlQml0bWFwKTogdm9pZCA9PiB7XG4gICAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIGN0eC5kcmF3SW1hZ2UoYm1wLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgY29uc3QgcmdiYSA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgd2lkdGgsIGhlaWdodCkuZGF0YTtcbiAgICAgICAgY29uc3QgYmFzZSA9IHogKiB3aWR0aCAqIGhlaWdodDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3aWR0aCAqIGhlaWdodDsgaSsrKSB7XG4gICAgICAgICAgZGF0YVtiYXNlICsgaV0gPVxuICAgICAgICAgICAgKHJnYmFbaSAqIDRdICogMC4yOTkgKyByZ2JhW2kgKiA0ICsgMV0gKiAwLjU4NyArIHJnYmFbaSAqIDQgKyAyXSAqIDAuMTE0KSB8IDA7XG4gICAgICAgIH1cbiAgICAgICAgYm1wLmNsb3NlPy4oKTtcbiAgICAgICAgZG9uZSsrO1xuICAgICAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KE1hdGgucm91bmQoKGRvbmUgLyBkZXB0aCkgKiAxMDApKTtcbiAgICAgIH07XG5cbiAgICAgIHJlYWRTbGljZSgwLCBmaXJzdCk7XG5cbiAgICAgIC8vIFJlbWFpbmluZyBwbGFuZXMgdmlhIGEgc21hbGwgcG9vbCBvZiB3b3JrZXJzIGRyYWluaW5nIGEgc2hhcmVkIHF1ZXVlLiBFYWNoIHBsYW5lIGBwYFxuICAgICAgLy8gbWFwcyB0byBzb3VyY2Ugc2xpY2UgYHpJbmRpY2VzW3BdYCAoc3Vic2FtcGxlZCBmb3IgbG93LXJlcykuXG4gICAgICBjb25zdCBwZW5kaW5nOiBudW1iZXJbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgcCA9IDE7IHAgPCBkZXB0aDsgcCsrKSBwZW5kaW5nLnB1c2gocCk7XG4gICAgICBjb25zdCB3b3JrZXIgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBjb25zdCBwID0gcGVuZGluZy5zaGlmdCgpO1xuICAgICAgICAgIGlmIChwID09PSB1bmRlZmluZWQgfHwgdGhpcy5sb2FkVG9rZW4gIT09IHRva2VuKSByZXR1cm47XG4gICAgICAgICAgcmVhZFNsaWNlKHAsIGF3YWl0IHRoaXMuZmV0Y2hTbGljZSh6SW5kaWNlc1twXSwgY2hhbm5lbCwgYnVkZ2V0KSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBwb29sU2l6ZSA9IE1hdGgubWluKFZPTFVNRV9GRVRDSF9DT05DVVJSRU5DWSwgTWF0aC5tYXgoMSwgZGVwdGggLSAxKSk7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChBcnJheS5mcm9tKHsgbGVuZ3RoOiBwb29sU2l6ZSB9LCAoKSA9PiB3b3JrZXIoKSkpO1xuXG4gICAgICBpZiAodGhpcy5sb2FkVG9rZW4gIT09IHRva2VuKSByZXR1cm4gbnVsbDsgLy8gY2FuY2VsbGVkIOKGkiBkb24ndCByZW5kZXIgYSBwYXJ0aWFsIHZvbHVtZVxuICAgICAgcmV0dXJuIHsgZGF0YSwgd2lkdGgsIGhlaWdodCwgZGVwdGggfTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dCgwKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTW91bnQgdGhlIE5BUEFSSV9TQ0FUVEVSIDJEIHNjYXR0ZXI6IHRoZSBzbGljZSBpbWFnZSB3aXRoIGEgcG9pbnRzIGxheWVyIGF0IGVhY2ggcmVnaW9uJ3NcbiAgICogY2VudHJvaWQgKG5hcGFyaS1qcyBhbmFsb2cgb2YgUGxvdGx5J3MgcmVnaW9uLWNlbnRyb2lkIHNjYXR0ZXIpLiBSZWJ1aWxkcyB0aGUgcG9pbnRzIGxpdmUgYXNcbiAgICogcmVnaW9ucyBjaGFuZ2UuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG1vdW50U2NhdHRlcih2aWV3ZXI6IFZpZXdlciwgaG9zdDogSFRNTEVsZW1lbnQsIHo6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucmVuZGVySW1hZ2Uoeik7XG4gICAgdGhpcy5maXRDYW1lcmFTb29uKCk7XG4gICAgdGhpcy5zdWJzY3JpYmVEaXNwbGF5U3RhdGUoKTtcbiAgICB0aGlzLmluc3RhbGxTY2FsZUJhcigpO1xuICAgIHRoaXMuaW5zdGFsbE5hdmlnYXRvcih6KTtcbiAgICAvLyBUaGlzIG1vZGUgcGxvdHMgUkVHSU9OIGNlbnRyb2lkcywgc28gd2l0aG91dCB0aGUgcmVnaW9uIHRvb2xzIHRoZXJlIGlzIG5vXG4gICAgLy8gd2F5IHRvIHByb2R1Y2UgYSBwb2ludCDigJQgZHJhd2luZyBhIHJlZ2lvbiBub3cgYWRkcyBvbmUgaW1tZWRpYXRlbHkuXG4gICAgdGhpcy5pbnN0YWxsMmRJbnRlcmFjdGlvbih2aWV3ZXIsIGhvc3QpO1xuICAgIHRoaXMucmVidWlsZFNjYXR0ZXJQb2ludHMoKTtcbiAgICB0aGlzLnNjYXR0ZXJSZWdpb25TdWIgPSB0aGlzLnJlZ2lvblN0b3JlXG4gICAgICAuZ2V0UmVnaW9uVXBkYXRlRXZlbnQoKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLnJlYnVpbGRTY2F0dGVyUG9pbnRzKCkpO1xuICAgIHRoaXMuc2NoZWR1bGVSZWFkYmFjaygpO1xuICB9XG5cbiAgLyoqIChSZSlidWlsZCB0aGUgMkQgc2NhdHRlcidzIHBvaW50IGxheWVyIGF0IHRoZSBjdXJyZW50IHJlZ2lvbiBjZW50cm9pZHMuICovXG4gIHByaXZhdGUgcmVidWlsZFNjYXR0ZXJQb2ludHMoKTogdm9pZCB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIGlmICh0aGlzLnNjYXR0ZXIyZFBvaW50cykge1xuICAgICAgdi5sYXllcnMucmVtb3ZlKHRoaXMuc2NhdHRlcjJkUG9pbnRzKTtcbiAgICAgIHRoaXMuc2NhdHRlcjJkUG9pbnRzID0gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgY2VudHJvaWRzID0gdGhpcy5yZWdpb25DZW50cm9pZHMoKTtcbiAgICBpZiAoY2VudHJvaWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIHRoaXMuc2NhdHRlcjJkUG9pbnRzID0gdi5hZGRQb2ludHMoY2VudHJvaWRzLCB7XG4gICAgICBzaXplOiAxMixcbiAgICAgIGZhY2VDb2xvcjogWzEsIDAuODUsIDAuMiwgMV0sXG4gICAgICBib3JkZXJDb2xvcjogWzAsIDAsIDAsIDFdLFxuICAgICAgYm9yZGVyV2lkdGg6IDIsXG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVnaW9uIGNlbnRyb2lkcyBhcyBmbGF0IGBbeCwgeSwg4oCmXWAgZGF0YSBjb29yZHMgKHJlY3RhbmdsZSAvIHBvbHlnb24gLyBtdWx0aXBvbHlnb24pLiAqL1xuICBwcml2YXRlIHJlZ2lvbkNlbnRyb2lkcygpOiBGbG9hdDMyQXJyYXkge1xuICAgIGNvbnN0IG91dDogbnVtYmVyW10gPSBbXTtcbiAgICBjb25zdCBwb2x5Q2VudHJvaWQgPSAoeHM6IG51bWJlcltdLCB5czogbnVtYmVyW10pOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IG4gPSB4cy5sZW5ndGg7XG4gICAgICBpZiAobiA9PT0gMCkgcmV0dXJuO1xuICAgICAgbGV0IGN4ID0gMDtcbiAgICAgIGxldCBjeSA9IDA7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICBjeCArPSB4c1tpXTtcbiAgICAgICAgY3kgKz0geXNbaV07XG4gICAgICB9XG4gICAgICBvdXQucHVzaChjeCAvIG4sIGN5IC8gbik7XG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCkpIHtcbiAgICAgIGNvbnN0IGIgPSByLmJvdW5kcyBhc1xuICAgICAgICB8IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH1cbiAgICAgICAgfCB7IHhwb2ludHM6IG51bWJlcltdOyB5cG9pbnRzOiBudW1iZXJbXSB9XG4gICAgICAgIHwgeyBwb2x5Z29uczogeyB4cG9pbnRzOiBudW1iZXJbXTsgeXBvaW50czogbnVtYmVyW10gfVtdIH1cbiAgICAgICAgfCBudWxsXG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKCFiKSBjb250aW51ZTtcbiAgICAgIGlmICgnd2lkdGgnIGluIGIgJiYgJ3gnIGluIGIpIHtcbiAgICAgICAgb3V0LnB1c2goYi54ICsgYi53aWR0aCAvIDIsIGIueSArIGIuaGVpZ2h0IC8gMik7XG4gICAgICB9IGVsc2UgaWYgKCd4cG9pbnRzJyBpbiBiKSB7XG4gICAgICAgIHBvbHlDZW50cm9pZChiLnhwb2ludHMsIGIueXBvaW50cyk7XG4gICAgICB9IGVsc2UgaWYgKCdwb2x5Z29ucycgaW4gYikge1xuICAgICAgICBmb3IgKGNvbnN0IHAgb2YgYi5wb2x5Z29ucykgcG9seUNlbnRyb2lkKHAueHBvaW50cywgcC55cG9pbnRzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkob3V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgaW50ZXJhY3Rpb24gc3RhY2sgZXZlcnkgMkQgbW9kZSBuZWVkczogdGhlIHJlZ2lvbiBvdmVybGF5IChkcmF3L3NlbGVjdC9lZGl0KSwgdGhlIHBpeGVsXG4gICAqIHRvb2xzIHRoYXQgcmVhZCBiYWNrIGRpc3BsYXllZCBwaXhlbHMgKHdhbmQsIGJydXNoLCB2ZXJ0ZXggZXJhc2VyLCB6b29tLXRvLWJveCwgU0FNL2NlbGxwb3NlKSxcbiAgICogYW5kIGEgY2FtZXJhIGhvb2sgdGhhdCBrZWVwcyB0aGF0IHJlYWRiYWNrIGN1cnJlbnQgYXMgdGhlIHZpZXcgcGFucy96b29tcyBhbmQgdGlsZWQgbGV2ZWxzXG4gICAqIGxvYWQuXG4gICAqXG4gICAqIEV4dHJhY3RlZCBiZWNhdXNlIGZvcmdldHRpbmcgaXQgaXMgaW52aXNpYmxlOiB0aGUgdG9vbGJhciBnYXRlcyBpdHMgcmVnaW9uIGJ1dHRvbnMgb24gMkQtdnMtM0RcbiAgICogcmF0aGVyIHRoYW4gb24gcGxvdCB0eXBlLCBzbyBhIDJEIG1vZGUgdGhhdCBza2lwcyB0aGlzIHNob3dzIGV2ZXJ5IHRvb2wgYW5kIHNpbGVudGx5IGRvZXNcbiAgICogbm90aGluZy4gVGhhdCBpcyBleGFjdGx5IHdoYXQgaGFwcGVuZWQgdG8gdGhlIHNwYXRpYWwgYW5kIHJlZ2lvbi1jZW50cm9pZCBzY2F0dGVyIG1vZGVzLlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsMmRJbnRlcmFjdGlvbih2aWV3ZXI6IFZpZXdlciwgaG9zdDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbk92ZXJsYXkgPSBuZXcgTmFwYXJpUmVnaW9uT3ZlcmxheShob3N0LCB2aWV3ZXIsIHRoaXMucmVnaW9uU3RvcmUpO1xuICAgIHRoaXMuYnVpbGRUb29sSG9zdHMoKTtcbiAgICB0aGlzLmNhbWVyYVJlYWRiYWNrT2ZmID0gdmlld2VyLmNhbWVyYS5jaGFuZ2VkLmNvbm5lY3QoKCkgPT4gdGhpcy5hcm1SZWFkYmFjaygpKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBTcGF0aWFsIG9taWNzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBNYXJrZXIgcmFkaXVzIChpbWFnZSBweCkgZm9yIGEgZGF0YXNldCB0aGF0IGRlY2xhcmVzIG5vbmUg4oCUIHNlZ21lbnRlZCBjZWxscyBvZnRlbiBkb24ndC4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU1BBVElBTF9GQUxMQkFDS19SQURJVVMgPSA0O1xuICAvKiogU21hbGxlc3QgbWFya2VyIERJQU1FVEVSLCBpbiBzbGljZSBwaXhlbHMsIG92ZXIgYSB2b2x1bWUtYmFja2VkIGRhdGFzZXQuIEEgY2VsbCdzIHJlYWxcbiAgICogIHNpemUgaXMgaG9ub3VyZWQgd2hlcmV2ZXIgaXQgc3Vydml2ZXMgdGhlIGdyaWQ6IHRoZSBBQkMgYXRsYXMgc2VydmVzIDUgwrVtIHJhZGlpIG9uIGFcbiAgICogIDQwIMK1bS9weCB0ZW1wbGF0ZSwgc28gZHJhd2luZyB0aGVtIHRvIHNjYWxlIHdvdWxkIHB1dCBldmVyeSBjZWxsIGEgZmlmdGggb2YgYSBwaXhlbCB3aWRlXG4gICAqICBhbmQgdGhlIHNlY3Rpb24gd291bGQgY29tZSB1cCBlbXB0eS4gVGhlIHBvaW50LXNpemUgY29udHJvbCBzY2FsZXMgdXAgZnJvbSB0aGlzIGZsb29yLiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTUEFUSUFMX1NMSUNFX01JTl9ESUFNRVRFUl9QWCA9IDEuNTtcbiAgLyoqIExvbmdlc3Qgc2lkZSBvZiB0aGUgZ2VuZS1tYXAgcmFzdGVyLCBpbiBmaWVsZCBwaXhlbHMuIEEgZ2VuZSBtYXAgaXMgYSBzbW9vdGhcbiAgICogIGZpZWxkIHJlYWQgYXMgdGVycml0b3J5LCBzbyBpdCBnYWlucyBub3RoaW5nIGZyb20gbWF0Y2hpbmcgYSAyIEdweCBzbGlkZSdzXG4gICAqICByZXNvbHV0aW9uIOKAlCBhbmQgdGhlIGVzdGltYXRlIGNvc3RzIG9uZSBwYXNzIG92ZXIgdGhpcyBtYW55IHBpeGVscy4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgR0VORV9NQVBfTUFYX1NJREUgPSA1MTI7XG4gIC8qKiBLZXJuZWwgz4MgaW4gZmllbGQgcGl4ZWxzIGF0IHNtb290aGluZyAxOiB3aWRlIGVub3VnaCB0byByZWFkIGJldHdlZW4gY2VsbHMsXG4gICAqICB0aWdodCBlbm91Z2ggdG8ga2VlcCBhIG51Y2xldXMtc2NhbGUgc3RydWN0dXJlIGRpc3RpbmN0LiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBHRU5FX01BUF9TSUdNQSA9IDIuNTtcbiAgLyoqIENsdXN0ZXJzIGRyYXduIGFzIGRlbnNpdHkgdm9sdW1lcyBhdCBvbmNlLiBQYXN0IGEgaGFuZGZ1bCwgYWRkaXRpdmUgdHJhbnNsdWNlbnRcbiAgICogIGNsb3VkcyBzdG9wIGJlaW5nIHNlcGFyYWJsZSBieSBleWUg4oCUIGFuZCBlYWNoIG9uZSBpcyBhIGZ1bGwgcmFzdGVyaXNhdGlvbi4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVOU0lUWV9NQVhfQ0xVU1RFUlMgPSA2O1xuICAvKiogQ29sb3VyIGZvciBvYnNlcnZhdGlvbnMgd2hlbiBub3RoaW5nIGlzIHNlbGVjdGVkIHRvIGNvbG91ciBieTogdmlzaWJsZSwgbmV1dHJhbCwgYW5kXG4gICAqICBvYnZpb3VzbHkgbm90IGVuY29kaW5nIGFueXRoaW5nLiAqL1xuICAvKiogSG93IG11Y2ggbGFyZ2VyIGEgc2VsZWN0ZWQgbWFya2VyIGlzIGRyYXduLCBzbyBhIHNtYWxsIHNlbGVjdGlvbiBpcyBmaW5kYWJsZSBpbnNpZGUgYVxuICAgKiAgMy43TS1wb2ludCBjbG91ZCByYXRoZXIgdGhhbiBtZXJlbHkgYnJpZ2h0ZXIuICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNQQVRJQUxfU0VMRUNURURfU0laRV9TQ0FMRSA9IDEuNjtcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTUEFUSUFMX05FVVRSQUxfQ09MT1I6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID1cbiAgICBbMC4zNSwgMC43MiwgMC45NSwgMC45XTtcblxuICAvKipcbiAgICogTW91bnQgdGhlIFNQQVRJQUxfT01JQ1MgdmlldzogdGhlIHRpc3N1ZSBpbWFnZSB3aXRoIG9uZSBtYXJrZXIgcGVyIG9ic2VydmF0aW9uLCBjb2xvdXJlZCBieVxuICAgKiBhbiBhbm5vdGF0aW9uIGNvbHVtbiBvciBhIGdlbmUuIFRoZSBtYXJrZXJzIHJlYnVpbGQgd2hlbmV2ZXIgdGhlIGRhdGFzZXQgb3IgdGhlIHZpZXcgc3RhdGVcbiAgICogY2hhbmdlcywgc28gc3dpdGNoaW5nIHRoZSBjb2xvdXItYnkgY29sdW1uIGRvZXMgbm90IHJlbW91bnQgdGhlIHNjZW5lLlxuICAgKlxuICAgKiBTZXRzIHVwIHRoZSBmdWxsIDJEIGludGVyYWN0aW9uIHN0YWNrIOKAlCByZWdpb24gb3ZlcmxheSwgcGl4ZWwtdG9vbCBob3N0cywgcmVhZGJhY2sgY3VycmVuY3kg4oCUXG4gICAqIGV4YWN0bHkgYXMgdGhlIHBsYWluIGltYWdlIHZpZXcgZG9lcy4gVGhhdCBpcyBOT1Qgb3B0aW9uYWwgaGVyZTogdGhpcyBtb2RlJ3Mgc2VsZWN0aW9uIGlzXG4gICAqIGRyaXZlbiBieSBkcmF3biBST0lzLCBzbyB3aXRob3V0IHRoZSBvdmVybGF5IHRoZXJlIGlzIG5vIHdheSB0byBtYWtlIGEgc2VsZWN0aW9uIGF0IGFsbC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbW91bnRTcGF0aWFsT21pY3Modmlld2VyOiBWaWV3ZXIsIGhvc3Q6IEhUTUxFbGVtZW50LCB6OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnJlbmRlckltYWdlKHopO1xuICAgIC8vIE9ubHkgZml0IHRvIHRoZSBpbWFnZSB3aGVuIHRoaXMgZGF0YXNldCBhY3R1YWxseSBoYXMgb25lLiBPdGhlcndpc2UgdGhlcmUgaXNcbiAgICAvLyBub3RoaW5nIHRvIGZpdCwgYGltYWdlV2AvYGltYWdlSGAgc3RpbGwgaG9sZCB0aGUgTEFTVCBpbWFnZSdzIGRpbWVuc2lvbnMsIGFuZFxuICAgIC8vIHRoaXMgZml0cyB0byB0aG9zZSDigJQgYW5kIGJlY2F1c2UgaXQgZGVmZXJzIHRvIGEgZnJhbWUsIGl0IGxhbmRzIEFGVEVSIHRoZSBwb2ludHNcbiAgICAvLyBhcmUgYWRkZWQgYW5kIG92ZXJ3cml0ZXMgdGhlIGZyYW1pbmcgdGhleSBzZXQuIFRoYXQgaXMgd2hhdCBsZWZ0IGFuIGltYWdlLWxlc3NcbiAgICAvLyBkYXRhc2V0IGFzIGEgdGVuLXBpeGVsIHNwZWNrIG9mZiB0byBvbmUgc2lkZS5cbiAgICBpZiAodGhpcy5zcGF0aWFsTGF0ZXN0Py5bMF0/LmltYWdlUmVmKSB0aGlzLmZpdENhbWVyYVNvb24oKTtcbiAgICB0aGlzLnN1YnNjcmliZURpc3BsYXlTdGF0ZSgpO1xuICAgIHRoaXMuaW5zdGFsbFNjYWxlQmFyKCk7XG4gICAgdGhpcy5pbnN0YWxsTmF2aWdhdG9yKHopO1xuICAgIHRoaXMuaW5zdGFsbDJkSW50ZXJhY3Rpb24odmlld2VyLCBob3N0KTtcbiAgICB0aGlzLmluc3RhbGxTcGF0aWFsSG92ZXIoaG9zdCk7XG4gICAgdGhpcy5zcGF0aWFsVGlsZXMoKT8uYXR0YWNoKHZpZXdlcik7XG4gICAgdGhpcy5zdWJzY3JpYmVTcGF0aWFsKCk7XG4gICAgdGhpcy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgMkQgb2JzZXJ2YXRpb24gbWFya2VycyBhcmUgZHJhd246IHdoZW4gdGhlIHVzZXIgd2FudHMgdGhlbSwgYW5kIG5vdCB3aGlsZVxuICAgKiBjZWxsIG91dGxpbmVzIGFyZSBvbiBzY3JlZW4g4oCUIHRoZW4gYSBjZWxsIElTIGl0cyBvdXRsaW5lLCBhbmQgYSBjaXJjbGUgb24gdG9wIG9mIGl0IGlzXG4gICAqIG5vaXNlLiBab29tZWQgb3V0IHBhc3QgdGhlIG91dGxpbmUgdGhyZXNob2xkLCB0aGUgY2lyY2xlcyBzdGFuZCBpbiBmb3IgdGhlIGNlbGxzLlxuICAgKi9cbiAgcHJpdmF0ZSBzcGF0aWFsUG9pbnRzVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5zcGF0aWFsTGF0ZXN0Py5bMV07XG4gICAgcmV0dXJuICh2aWV3Py5zaG93UG9pbnRzID8/IHRydWUpICYmICF0aGlzLnNwYXRpYWxUaWxlc01ncj8ub3V0bGluZXNTaG93bjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdGlsZWQtZ2VvbWV0cnkgbWFuYWdlciwgYnVpbHQgb24gZmlyc3QgdXNlLiBJdHMgaG9zdCBjYWxsYmFja3MgcmVhZCB0aGlzXG4gICAqIHNlcnZpY2UncyBsaXZlIHN0YXRlLCBzbyBpdCBuZXZlciBob2xkcyBhIHN0YWxlIGRhdGFzZXQgb3IgY29sb3JtYXAuXG4gICAqL1xuICBwcml2YXRlIHNwYXRpYWxUaWxlcygpOiBOYXBhcmlTcGF0aWFsVGlsZUxheWVycyB8IG51bGwge1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnNwYXRpYWxEYXRhO1xuICAgIGlmICghcG9ydCkgcmV0dXJuIG51bGw7XG4gICAgdGhpcy5zcGF0aWFsVGlsZXNNZ3IgPz89IG5ldyBOYXBhcmlTcGF0aWFsVGlsZUxheWVycyhwb3J0LCB7XG4gICAgICBsYXRlc3Q6ICgpID0+IHRoaXMuc3BhdGlhbExhdGVzdCxcbiAgICAgIGNhbnZhc1NpemU6ICgpID0+IFt0aGlzLmNhbnZhcz8uY2xpZW50V2lkdGggPz8gMCwgdGhpcy5jYW52YXM/LmNsaWVudEhlaWdodCA/PyAwXSxcbiAgICAgIGNvbnRpbnVvdXNMdXQ6ICh2aWV3KSA9PiB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmN1cnJlbnRDb2xvcm1hcCBhcyB7IGRhdGE/OiB7IHZhbHVlPzogdW5rbm93biB9IH0gfCBudWxsO1xuICAgICAgICByZXR1cm4gc3BhdGlhbENvbnRpbnVvdXNMdXQobm9kZT8uZGF0YT8udmFsdWUsIHRoaXMuY3VycmVudFJldmVyc2UsIHZpZXcuY29udGludW91c0NvbG9ybWFwKTtcbiAgICAgIH0sXG4gICAgICBlc3RpbWF0ZUNoYW5nZWQ6IChlKSA9PiB0aGlzLnRyYW5zY3JpcHRFc3RpbWF0ZSQubmV4dChlKSxcbiAgICAgIGRlbnNpdHlDaGFuZ2VkOiAoZCkgPT4gdGhpcy5kZW5zaXR5U3RhdHMkLm5leHQoZCksXG4gICAgICBwb2x5Z29uc1Nob3duQ2hhbmdlZDogKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5zcGF0aWFsUG9pbnRzKSB0aGlzLnNwYXRpYWxQb2ludHMudmlzaWJsZSA9IHRoaXMuc3BhdGlhbFBvaW50c1Zpc2libGUoKTtcbiAgICAgICAgdGhpcy52aWV3ZXI/LnJlcXVlc3RSZW5kZXIoKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuc3BhdGlhbFRpbGVzTWdyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lvbiBkcmF3aW5nIGZvciB0aGUgM0QgY2xvdWQuXG4gICAqXG4gICAqIFJldXNlcyB7QGxpbmsgTmFwYXJpUmVnaW9uT3ZlcmxheX0gdmVyYmF0aW0gYnkgaGFuZGluZyBpdCBhIFNDUkVFTi1TUEFDRSB2aWV3ZXI6IHRoZSBkcmF3blxuICAgKiBzaGFwZSBpcyBhIGxhc3NvIGluIGNhbnZhcyBwaXhlbHMsIHNvIFwid29ybGRcIiBpcyB0aGUgY2FudmFzIGFuZCBib3RoIHRyYW5zZm9ybXMgYXJlIGlkZW50aXR5XG4gICAqIChiYXIgdGhlIGNsaWVudOKGkmNhbnZhcyBvZmZzZXQpLiBFdmVyeSBleGlzdGluZyB0b29sIOKAlCByZWN0YW5nbGUsIHBvbHlnb24sIGZyZWVoYW5kIOKAlCB0aGVyZWZvcmVcbiAgICogd29ya3MgaW4gM0Qgd2l0aCBubyBuZXcgZHJhd2luZyBjb2RlLlxuICAgKlxuICAgKiBBIHNjcmVlbi1zcGFjZSBzaGFwZSBzdG9wcyBtZWFuaW5nIGFueXRoaW5nIHRoZSBtb21lbnQgdGhlIGNhbWVyYSBtb3Zlcywgc28gYW4gb3JiaXQgY2xlYXJzXG4gICAqIHRoZSBkcmF3biByZWdpb25zLiBUaGUgU0VMRUNUSU9OIGl0IHByb2R1Y2VkIGlzIGtlcHQ6IHRoYXQgaXMgdGhlIGR1cmFibGUgYXJ0ZWZhY3QsIGFuZCB0aGVcbiAgICogaGlnaGxpZ2h0ZWQgcG9pbnRzIHN0YXkgaGlnaGxpZ2h0ZWQgZnJvbSBldmVyeSBhbmdsZS5cbiAgICovXG4gIHByaXZhdGUgaW5zdGFsbDNkSW50ZXJhY3Rpb24odmlld2VyOiBWaWV3ZXIsIGhvc3Q6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3QgY2FudmFzUmVjdCA9ICgpID0+IHRoaXMuY2FudmFzPy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBzY3JlZW5TcGFjZTogT3ZlcmxheVZpZXdlciA9IHtcbiAgICAgIGNhbnZhc1RvV29ybGQ6IChjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCByID0gY2FudmFzUmVjdCgpO1xuICAgICAgICByZXR1cm4gciA/IFtjbGllbnRYIC0gci5sZWZ0LCBjbGllbnRZIC0gci50b3BdIDogW2NsaWVudFgsIGNsaWVudFldO1xuICAgICAgfSxcbiAgICAgIC8vIEFscmVhZHkgY2FudmFzIHBpeGVscy5cbiAgICAgIHdvcmxkVG9DYW52YXM6ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gW3gsIHldLFxuICAgICAgc2V0Q29udHJvbHNFbmFibGVkOiAoZW5hYmxlZDogYm9vbGVhbikgPT4gdmlld2VyLnNldENvbnRyb2xzRW5hYmxlZChlbmFibGVkKSxcbiAgICAgIGNhbWVyYTogdmlld2VyLmNhbWVyYTNkLFxuICAgIH07XG4gICAgdGhpcy5yZWdpb25PdmVybGF5ID0gbmV3IE5hcGFyaVJlZ2lvbk92ZXJsYXkoaG9zdCwgc2NyZWVuU3BhY2UsIHRoaXMucmVnaW9uU3RvcmUpO1xuICAgIHRoaXMuYnVpbGRUb29sSG9zdHMoKTtcbiAgICB0aGlzLmNhbWVyYVJlYWRiYWNrT2ZmID0gdmlld2VyLmNhbWVyYTNkLmNoYW5nZWQuY29ubmVjdCgoKSA9PiB7XG4gICAgICAvLyBPbmx5IHdoaWxlIG5vdGhpbmcgaXMgYmVpbmcgZHJhd24g4oCUIGNsZWFyaW5nIG1pZC1nZXN0dXJlIHdvdWxkIGRlbGV0ZSB0aGVcbiAgICAgIC8vIHNoYXBlIHVuZGVyIHRoZSB1c2VyJ3MgY3Vyc29yLlxuICAgICAgaWYgKHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpLmxlbmd0aCA+IDApIHRoaXMucmVnaW9uU3RvcmUuc2V0UmVnaW9ucyhbXSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogTW92ZW1lbnQsIGluIHNjcmVlbiBwaXhlbHMsIHVuZGVyIHdoaWNoIGEgcHJlc3MtcmVsZWFzZSBpcyBhIENMSUNLIGFuZCBub3QgYVxuICAgKiAgZHJhZy4gQW4gb3JiaXQgb3IgYSBwYW4gc3RhcnRzIHRoZSBzYW1lIHdheSwgc28gdGhlIHR3byBoYXZlIHRvIGJlIHRvbGRcbiAgICogIGFwYXJ0IGJ5IGhvdyBmYXIgdGhlIHBvaW50ZXIgdHJhdmVsbGVkLiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDTElDS19TTE9QX1BYID0gNDtcbiAgLyoqIExvbmdlc3QgcHJlc3MtcmVsZWFzZSBzdGlsbCB0cmVhdGVkIGFzIGEgY2xpY2suIEEgbG9uZyBwcmVzcyB3aXRoIHRoZSBtb3VzZVxuICAgKiAgaGVsZCBzdGlsbCBpcyBtb3JlIGxpa2VseSBhbiBpbnRlcnJ1cHRlZCBkcmFnIHRoYW4gYSBzZWxlY3Rpb24uICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENMSUNLX01BWF9NUyA9IDYwMDtcbiAgLyoqIFBvaW50ZXIgZGlzdGFuY2UsIGluIHNjcmVlbiBwaXhlbHMsIHRoYXQgc3RpbGwgY291bnRzIGFzIFwib25cIiBhIG1hcmtlci5cbiAgICogIEdlbmVyb3VzIHJlbGF0aXZlIHRvIGEgMS41cHggZGlzYzogdGhlIGN1cnNvciBpcyBhIGJsdW50IGluc3RydW1lbnQsIGFuZCBhXG4gICAqICB0b29sdGlwIHlvdSBoYXZlIHRvIGh1bnQgZm9yIGlzIHdvcnNlIHRoYW4gbm9uZS4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgSE9WRVJfUkFESVVTX1BYID0gMTA7XG5cbiAgLyoqXG4gICAqIEN1cnNvciB0b29sdGlwIGZvciB0aGUgc3BhdGlhbCB2aWV3czogaG92ZXIgYSBtYXJrZXIsIHJlYWQgaXRzIGNsYXNzLlxuICAgKlxuICAgKiBBIDM0LWVudHJ5IGxlZ2VuZCBjYW5ub3QgYmUgcmVhZCBiYWNrIGZyb20gYSBkb3Qg4oCUIHNldmVyYWwgY2xhc3NlcyBnZXRcbiAgICogc2ltaWxhciBjb2xvdXJzLCBhbmQgbWF0Y2hpbmcgb25lIHRvIGEgc3dhdGNoIGJ5IGV5ZSBpcyBleGFjdGx5IHRoZSB0YXNrIHRoaXNcbiAgICogcmVtb3Zlcy4gSXQgcmVwb3J0cyB3aGF0ZXZlciB0aGUgY2xvdWQgaXMgQ1VSUkVOVExZIGNvbG91cmVkIGJ5LCBzbyBpdCBhbmRcbiAgICogdGhlIGxlZ2VuZCBjYW4gbmV2ZXIgc2F5IGRpZmZlcmVudCB0aGluZ3MuXG4gICAqXG4gICAqIExpc3RlbnMgb24gdGhlIEhPU1QgcmF0aGVyIHRoYW4gdGhlIGNhbnZhcyBzbyBpdCBrZWVwcyB3b3JraW5nIG92ZXIgdGhlIHJlZ2lvblxuICAgKiBvdmVybGF5IChhbiBTVkcgY292ZXJpbmcgdGhlIGNhbnZhcywgd2hpY2ggd291bGQgb3RoZXJ3aXNlIHN3YWxsb3cgZXZlcnlcbiAgICogbW92ZSksIGFuZCB0aHJvdHRsZXMgdG8gb25lIGhpdC10ZXN0IHBlciBhbmltYXRpb24gZnJhbWU6IGEgcG9pbnRlcm1vdmUgY2FuXG4gICAqIGZpcmUgZmFyIG1vcmUgb2Z0ZW4gdGhhbiB0aGF0LCBhbmQgZWFjaCB0ZXN0IGlzIGEgcGFzcyBvdmVyIHRoZSBjbG91ZC5cbiAgICovXG4gIHByaXZhdGUgaW5zdGFsbFNwYXRpYWxIb3Zlcihob3N0OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIHRoaXMucmVtb3ZlU3BhdGlhbEhvdmVyKCk7XG4gICAgdGhpcy5zcGF0aWFsVG9vbHRpcCA9IG5ldyBOYXBhcmlTcGF0aWFsVG9vbHRpcChob3N0KTtcblxuICAgIGNvbnN0IG9uTW92ZSA9IChlOiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuY2FudmFzO1xuICAgICAgaWYgKCFjYW52YXMpIHJldHVybjtcbiAgICAgIGNvbnN0IHJlY3QgPSBjYW52YXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICB0aGlzLmhvdmVyUG9pbnRlciA9IHtcbiAgICAgICAgeDogZS5jbGllbnRYIC0gcmVjdC5sZWZ0LFxuICAgICAgICB5OiBlLmNsaWVudFkgLSByZWN0LnRvcCxcbiAgICAgICAgY2xpZW50WDogZS5jbGllbnRYLFxuICAgICAgICBjbGllbnRZOiBlLmNsaWVudFksXG4gICAgICB9O1xuICAgICAgaWYgKHRoaXMuaG92ZXJGcmFtZSkgcmV0dXJuO1xuICAgICAgdGhpcy5ob3ZlckZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgdGhpcy5ob3ZlckZyYW1lID0gMDtcbiAgICAgICAgdGhpcy51cGRhdGVIb3Zlcihob3N0KTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgY29uc3Qgb25MZWF2ZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuaG92ZXJQb2ludGVyID0gbnVsbDtcbiAgICAgIHRoaXMuc3BhdGlhbFRvb2x0aXA/LmhpZGUoKTtcbiAgICB9O1xuXG4gICAgLy8gQSBjbGljayBvbiBhIG1hcmtlciBzZWxlY3RzIGl0cyBjbGFzcywgZXhhY3RseSBhcyBjbGlja2luZyB0aGF0IGNsYXNzIGluIHRoZVxuICAgIC8vIHBhbmVsJ3MgbGVnZW5kIGRvZXMg4oCUIGluY2x1ZGluZyBjbGlja2luZyBhZ2FpbiB0byBjbGVhciwgc28gYSBjbGljayBpc1xuICAgIC8vIGFsd2F5cyByZXZlcnNpYmxlLiBUcmFja2VkIGFzIGRvd24vdXAgcmF0aGVyIHRoYW4gYm91bmQgdG8gYGNsaWNrYCBzbyBhIERSQUdcbiAgICAvLyAoYW4gb3JiaXQgaW4gM0QsIGEgcGFuIGluIDJEKSBjYW4gYmUgdG9sZCBhcGFydCBmcm9tIGEgY2xpY2s6IHRoZSBnZXN0dXJlXG4gICAgLy8gaGFzIHRvIG1vdmUgbGVzcyB0aGFuIGEgZmV3IHBpeGVscyBhbmQgYmUgb3ZlciBxdWlja2x5LlxuICAgIGxldCBkb3duOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB0OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IG9uRG93biA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBkb3duID0geyB4OiBlLmNsaWVudFgsIHk6IGUuY2xpZW50WSwgdDogRGF0ZS5ub3coKSB9O1xuICAgIH07XG4gICAgY29uc3Qgb25VcCA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBzdGFydCA9IGRvd247XG4gICAgICBkb3duID0gbnVsbDtcbiAgICAgIGlmICghc3RhcnQpIHJldHVybjtcbiAgICAgIGNvbnN0IG1vdmVkID0gTWF0aC5oeXBvdChlLmNsaWVudFggLSBzdGFydC54LCBlLmNsaWVudFkgLSBzdGFydC55KTtcbiAgICAgIGlmIChtb3ZlZCA+IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLkNMSUNLX1NMT1BfUFgpIHJldHVybjtcbiAgICAgIGlmIChEYXRlLm5vdygpIC0gc3RhcnQudCA+IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLkNMSUNLX01BWF9NUykgcmV0dXJuO1xuICAgICAgLy8gQSByZWdpb24gdG9vbCBvd25zIHRoZSBwb2ludGVyIHdoaWxlIGl0IGlzIGFjdGl2ZSwgYW5kIHBsYWNpbmcgYSBwb2x5Z29uXG4gICAgICAvLyB2ZXJ0ZXggaXMgYWxzbyBhIGNsaWNrIHRoYXQgZG9lcyBub3QgbW92ZS5cbiAgICAgIGlmICh0aGlzLnJlZ2lvbk92ZXJsYXk/LnRvb2xBY3RpdmUpIHJldHVybjtcbiAgICAgIHRoaXMuc2VsZWN0Q2xhc3NBdChlLmNsaWVudFgsIGUuY2xpZW50WSk7XG4gICAgfTtcblxuICAgIGhvc3QuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCBvbk1vdmUpO1xuICAgIGhvc3QuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmxlYXZlJywgb25MZWF2ZSk7XG4gICAgaG9zdC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIG9uRG93bik7XG4gICAgaG9zdC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCBvblVwKTtcbiAgICB0aGlzLmhvdmVyT2ZmLnB1c2goKCkgPT4gaG9zdC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIG9uTW92ZSkpO1xuICAgIHRoaXMuaG92ZXJPZmYucHVzaCgoKSA9PiBob3N0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJsZWF2ZScsIG9uTGVhdmUpKTtcbiAgICB0aGlzLmhvdmVyT2ZmLnB1c2goKCkgPT4gaG9zdC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIG9uRG93bikpO1xuICAgIHRoaXMuaG92ZXJPZmYucHVzaCgoKSA9PiBob3N0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIG9uVXApKTtcblxuICAgIC8vIEluIDNEIHRoZSBjYWNoZWQgcG9zaXRpb25zIGFyZSBzY3JlZW4gcGl4ZWxzLCBzbyBhbiBvcmJpdCBpbnZhbGlkYXRlcyB0aGVtLlxuICAgIGNvbnN0IGNhbWVyYSA9IHRoaXMudmlld2VyPy5jYW1lcmEzZDtcbiAgICBpZiAoY2FtZXJhICYmIGlzU3BhdGlhbE9taWNzM2QodGhpcy5jdXJyZW50UGxvdFR5cGUpKSB7XG4gICAgICBjb25zdCBvZmYgPSBjYW1lcmEuY2hhbmdlZC5jb25uZWN0KCgpID0+IHtcbiAgICAgICAgdGhpcy5zcGF0aWFsU2NlbmVSZXYrKztcbiAgICAgIH0pO1xuICAgICAgdGhpcy5ob3Zlck9mZi5wdXNoKG9mZik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVTcGF0aWFsSG92ZXIoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBvZmYgb2YgdGhpcy5ob3Zlck9mZikgb2ZmKCk7XG4gICAgdGhpcy5ob3Zlck9mZiA9IFtdO1xuICAgIGlmICh0aGlzLmhvdmVyRnJhbWUpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuaG92ZXJGcmFtZSk7XG4gICAgdGhpcy5ob3ZlckZyYW1lID0gMDtcbiAgICB0aGlzLmhvdmVyUG9pbnRlciA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsVG9vbHRpcD8uZGlzcG9zZSgpO1xuICAgIHRoaXMuc3BhdGlhbFRvb2x0aXAgPSBudWxsO1xuICAgIHRoaXMuaG92ZXJQb3NpdGlvbnMgPSBudWxsO1xuICAgIHRoaXMuaG92ZXJQb3NpdGlvbnNSZXYgPSAtMTtcbiAgICB0aGlzLmhvdmVySW5kZXggPSBudWxsO1xuICB9XG5cbiAgLyoqIEhpdC10ZXN0IHRoZSBsYXN0IHBvaW50ZXIgcG9zaXRpb24gYW5kIHNob3cgb3IgaGlkZSB0aGUgdG9vbHRpcC4gKi9cbiAgcHJpdmF0ZSB1cGRhdGVIb3Zlcihob3N0OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRpcCA9IHRoaXMuc3BhdGlhbFRvb2x0aXA7XG4gICAgY29uc3QgcG9pbnRlciA9IHRoaXMuaG92ZXJQb2ludGVyO1xuICAgIGNvbnN0IGRhdGFzZXQgPSB0aGlzLnNwYXRpYWxMYXRlc3Q/LlswXTtcbiAgICBpZiAoIXRpcCB8fCAhcG9pbnRlciB8fCAhZGF0YXNldCkgcmV0dXJuO1xuXG4gICAgY29uc3QgaXMzZCA9IGlzU3BhdGlhbE9taWNzM2QodGhpcy5jdXJyZW50UGxvdFR5cGUpO1xuICAgIC8vIFRyYW5zY3JpcHQgbWFya2VycyBzaXQgb24gdG9wIG9mIGV2ZXJ5dGhpbmcsIHNvIHRoZXkgYXJlIGFza2VkIGZpcnN0LlxuICAgIGlmICghaXMzZCAmJiB0aGlzLnNwYXRpYWxUaWxlc01nciAmJiB0aGlzLnZpZXdlcikge1xuICAgICAgY29uc3Qgd29ybGQgPSB0aGlzLnZpZXdlci5jYW52YXNUb1dvcmxkKHBvaW50ZXIuY2xpZW50WCwgcG9pbnRlci5jbGllbnRZKTtcbiAgICAgIGNvbnN0IHpvb20gPSB0aGlzLnZpZXdlci5jYW1lcmEuem9vbTtcbiAgICAgIGNvbnN0IHJhZGl1cyA9IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLkhPVkVSX1JBRElVU19QWCAvICh6b29tID4gMCA/IHpvb20gOiAxKTtcbiAgICAgIGNvbnN0IGxpbmVzID0gd29ybGQgPyB0aGlzLnNwYXRpYWxUaWxlc01nci5ob3ZlckF0KHdvcmxkWzBdLCB3b3JsZFsxXSwgcmFkaXVzLCAoZGV0YWlscykgPT4ge1xuICAgICAgICBjb25zdCBwID0gdGhpcy5ob3ZlclBvaW50ZXI7XG4gICAgICAgIGlmICghcCB8fCAhdGhpcy5zcGF0aWFsVG9vbHRpcCkgcmV0dXJuO1xuICAgICAgICBjb25zdCByID0gaG9zdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdGhpcy5zcGF0aWFsVG9vbHRpcC5zaG93KGRldGFpbHMsIHAuY2xpZW50WCAtIHIubGVmdCwgcC5jbGllbnRZIC0gci50b3ApO1xuICAgICAgfSkgOiBudWxsO1xuICAgICAgaWYgKGxpbmVzKSB7XG4gICAgICAgIGNvbnN0IHJlY3QgPSBob3N0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB0aXAuc2hvdyhsaW5lcywgcG9pbnRlci5jbGllbnRYIC0gcmVjdC5sZWZ0LCBwb2ludGVyLmNsaWVudFkgLSByZWN0LnRvcCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwb3NpdGlvbnMgPSB0aGlzLmhvdmVyUG9zaXRpb25zRm9yKGRhdGFzZXQub2JzZXJ2YXRpb25zKTtcbiAgICBpZiAoIXBvc2l0aW9ucykge1xuICAgICAgdGlwLmhpZGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gM0QgY29tcGFyZXMgc2NyZWVuIHBpeGVscyBkaXJlY3RseTsgMkQgaG9sZHMgd29ybGQgcG9zaXRpb25zLCBzbyB0aGUgcmFkaXVzXG4gICAgLy8gaXMgY29udmVydGVkIG9uY2UgaW5zdGVhZCBvZiBwcm9qZWN0aW5nIHRoZSB3aG9sZSBjbG91ZC5cbiAgICBjb25zdCB6b29tID0gaXMzZCA/IDEgOiAodGhpcy52aWV3ZXI/LmNhbWVyYS56b29tID8/IDEpO1xuICAgIGNvbnN0IHJhZGl1cyA9IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLkhPVkVSX1JBRElVU19QWCAvICh6b29tID4gMCA/IHpvb20gOiAxKTtcbiAgICBsZXQgeCA9IHBvaW50ZXIueDtcbiAgICBsZXQgeSA9IHBvaW50ZXIueTtcbiAgICBpZiAoIWlzM2QpIHtcbiAgICAgIGNvbnN0IHdvcmxkID0gdGhpcy52aWV3ZXI/LmNhbnZhc1RvV29ybGQocG9pbnRlci5jbGllbnRYLCBwb2ludGVyLmNsaWVudFkpO1xuICAgICAgaWYgKCF3b3JsZCkge1xuICAgICAgICB0aXAuaGlkZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBbeCwgeV0gPSB3b3JsZDtcbiAgICB9XG5cbiAgICBjb25zdCBoaXQgPSB0aGlzLnBpY2tPYnNlcnZhdGlvbihwb3NpdGlvbnMsIHgsIHksIHJhZGl1cywgaXMzZCk7XG4gICAgY29uc3QgbGluZXMgPSBob3ZlclRleHQodGhpcy5ob3ZlclNvdXJjZSwgaGl0KTtcbiAgICBpZiAoIWxpbmVzKSB7XG4gICAgICB0aXAuaGlkZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZWN0ID0gaG9zdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB0aXAuc2hvdyhsaW5lcywgcG9pbnRlci5jbGllbnRYIC0gcmVjdC5sZWZ0LCBwb2ludGVyLmNsaWVudFkgLSByZWN0LnRvcCk7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0IHRoZSBjbGFzcyBvZiB0aGUgbWFya2VyIGF0IGEgY2xpZW50IHBvc2l0aW9uIOKAlCB0aGUgY2FudmFzIGVxdWl2YWxlbnQgb2ZcbiAgICogY2xpY2tpbmcgdGhhdCBjbGFzcyBpbiB0aGUgcGFuZWwncyBsZWdlbmQsIGFuZCB0aGUgc2FtZSBzZWxlY3Rpb24gb2JqZWN0LCBzb1xuICAgKiB0aGUgdHdvIGNvbnRyb2xzIGNhbm5vdCBwcm9kdWNlIGRpZmZlcmVudCByZXN1bHRzLlxuICAgKlxuICAgKiBDbGlja2luZyBhIGNsYXNzIHRoYXQgaXMgYWxyZWFkeSB0aGUgd2hvbGUgc2VsZWN0aW9uIENMRUFSUyBpdCwgd2hpY2ggaXMgd2hhdFxuICAgKiB0aGUgbGVnZW5kIGRvZXMuIENvbXBhcmVkIGFnYWluc3QgdGhlIHNlbGVjdGlvbiBpdHNlbGYgcmF0aGVyIHRoYW4gYWdhaW5zdCBhXG4gICAqIHJlbWVtYmVyZWQgY2xpY2ssIHNvIHNlbGVjdGluZyBmcm9tIHRoZSBsZWdlbmQgYW5kIHRoZW4gY2xpY2tpbmcgdGhlIHNhbWVcbiAgICogY2xhc3Mgb24gdGhlIGNhbnZhcyBzdGlsbCB0b2dnbGVzLlxuICAgKi9cbiAgcHJpdmF0ZSBzZWxlY3RDbGFzc0F0KGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3Qgc291cmNlID0gdGhpcy5ob3ZlclNvdXJjZTtcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuc2VsZWN0aW9uU3RvcmU7XG4gICAgY29uc3QgZGF0YXNldCA9IHRoaXMuc3BhdGlhbExhdGVzdD8uWzBdO1xuICAgIC8vIE9ubHkgYSBjYXRlZ29yaWNhbCBzb3VyY2UgaGFzIGNsYXNzZXMgdG8gc2VsZWN0LiBBIGdlbmUgaXMgY29udGludW91czpcbiAgICAvLyB0aGVyZSBpcyBubyBzZXQgb2YgY2VsbHMgdGhhdCBcImlzXCIgYSB2YWx1ZS5cbiAgICBpZiAoIXN0b3JlIHx8ICFkYXRhc2V0IHx8IHNvdXJjZT8ua2luZCAhPT0gJ2NhdGVnb3JpY2FsJykgcmV0dXJuO1xuXG4gICAgY29uc3QgcG9zaXRpb25zID0gdGhpcy5ob3ZlclBvc2l0aW9uc0ZvcihkYXRhc2V0Lm9ic2VydmF0aW9ucyk7XG4gICAgaWYgKCFwb3NpdGlvbnMpIHJldHVybjtcbiAgICBjb25zdCBjYW52YXMgPSB0aGlzLmNhbnZhcztcbiAgICBpZiAoIWNhbnZhcykgcmV0dXJuO1xuICAgIGNvbnN0IHJlY3QgPSBjYW52YXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgaXMzZCA9IGlzU3BhdGlhbE9taWNzM2QodGhpcy5jdXJyZW50UGxvdFR5cGUpO1xuICAgIGNvbnN0IHpvb20gPSBpczNkID8gMSA6ICh0aGlzLnZpZXdlcj8uY2FtZXJhLnpvb20gPz8gMSk7XG4gICAgY29uc3QgcmFkaXVzID0gTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuSE9WRVJfUkFESVVTX1BYIC8gKHpvb20gPiAwID8gem9vbSA6IDEpO1xuICAgIGxldCB4ID0gY2xpZW50WCAtIHJlY3QubGVmdDtcbiAgICBsZXQgeSA9IGNsaWVudFkgLSByZWN0LnRvcDtcbiAgICBpZiAoIWlzM2QpIHtcbiAgICAgIGNvbnN0IHdvcmxkID0gdGhpcy52aWV3ZXI/LmNhbnZhc1RvV29ybGQoY2xpZW50WCwgY2xpZW50WSk7XG4gICAgICBpZiAoIXdvcmxkKSByZXR1cm47XG4gICAgICBbeCwgeV0gPSB3b3JsZDtcbiAgICB9XG5cbiAgICBjb25zdCBoaXQgPSBuZWFyZXN0T2JzZXJ2YXRpb24ocG9zaXRpb25zLCB4LCB5LCByYWRpdXMpO1xuICAgIGlmIChoaXQgPCAwKSByZXR1cm47XG4gICAgY29uc3QgY29kZSA9IHNvdXJjZS5jb2Rlc1toaXRdO1xuICAgIC8vIEEgY2VsbCB0aGUgYW5ub3RhdGlvbiBkb2VzIG5vdCBjb3ZlciBoYXMgbm8gY2xhc3MgdG8gc2VsZWN0LlxuICAgIGlmIChjb2RlID09PSB1bmRlZmluZWQgfHwgY29kZSA9PT0gTk9fQ0FURUdPUlkpIHJldHVybjtcblxuICAgIGNvbnN0IG5leHQgPSBzZWxlY3RCeUNhdGVnb3J5KHNvdXJjZS5jb2RlcywgY29kZSk7XG4gICAgY29uc3QgY3VycmVudCA9IHN0b3JlLmN1cnJlbnQoKTtcbiAgICBpZiAoc2FtZVNlbGVjdGlvbihjdXJyZW50LCBuZXh0KSkge1xuICAgICAgc3RvcmUuY2xlYXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3RvcmUuc2V0KG5leHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoaWNoIG9ic2VydmF0aW9uIGlzIHVuZGVyIHRoZSBjdXJzb3IuXG4gICAqXG4gICAqIEluIDNEIHRoaXMgZGVmZXJzIHRvIG5hcGFyaS1qcydzIHtAbGluayBuZWFyZXN0UHJvamVjdGVkSW5kZXh9IFdJVEggdGhlIGRlcHRocyB0aGVcbiAgICogcHJvamVjdGlvbiBwcm9kdWNlZCwgc28gdGhlIGZyb250LW1vc3QgY2FuZGlkYXRlIHdpbnMuIFRoYXQgbWF0dGVycyBtb3JlIHRoYW4gaXRcbiAgICogc291bmRzOiB0aGUgcmVuZGVyZXIgZGVwdGgtdGVzdHMgdGhlIGJpbGxib2FyZHMsIGFuZCBpbiBhIDMuN00tcG9pbnQgY2xvdWQgdGhlIGN1cnNvclxuICAgKiBjb3ZlcnMgbWFueSBvZiB0aGVtIOKAlCBwaWNraW5nIHRoZSBvbmUgbmVhcmVzdCB0aGUgY3Vyc29yJ3MgY2VudHJlIHJlZ3VsYXJseSBuYW1lcyBhXG4gICAqIGNlbGwgdGhhdCBzb21ldGhpbmcgZWxzZSBpcyBkcmF3biBvdmVyLCB3aGljaCByZWFkcyBhcyBhIHdyb25nIHRvb2x0aXAgcmF0aGVyIHRoYW4gYXNcbiAgICogYSBzdWJ0bGV0eSBvZiBwaWNraW5nLlxuICAgKlxuICAgKiBJbiAyRCB0aGUgcG9zaXRpb25zIGFyZSBXT1JMRCBjb29yZGluYXRlcyBvbiBvbmUgcGxhbmUsIHNvIHRoZXJlIGlzIG5vIGRlcHRoIHRvIGJyZWFrXG4gICAqIHRpZXMgd2l0aCBhbmQgdGhlIGV4aXN0aW5nIG5lYXJlc3QtbWFya2VyIHJ1bGUgaXMgdGhlIHJpZ2h0IG9uZS5cbiAgICovXG4gIHByaXZhdGUgcGlja09ic2VydmF0aW9uKFxuICAgIHBvc2l0aW9uczogRmxvYXQzMkFycmF5LFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICAgcmFkaXVzOiBudW1iZXIsXG4gICAgaXMzZDogYm9vbGVhbixcbiAgKTogbnVtYmVyIHtcbiAgICBpZiAoIWlzM2QpIHJldHVybiBuZWFyZXN0T2JzZXJ2YXRpb24ocG9zaXRpb25zLCB4LCB5LCByYWRpdXMpO1xuICAgIC8vIFRoZSBjbG91ZCBkcmF3cyBhIHNlbGVjdGVkIG1hcmtlciBMQVJHRVIsIHNvIHRoZSBwaWNrIGhhcyB0byB1c2UgdGhlIHNhbWUgcmFkaXVzIHRoZVxuICAgIC8vIHJlbmRlcmVyIHVzZWQg4oCUIG90aGVyd2lzZSB0aGUgaGlnaGxpZ2h0ZWQgY2VsbHMsIHRoZSBvbmVzIGEgcmVhZGVyIGlzIG1vc3QgbGlrZWx5IHRvXG4gICAgLy8gYmUgcG9pbnRpbmcgYXQsIGFyZSB0aGUgaGFyZGVzdCB0byBob3Zlci5cbiAgICBjb25zdCBzY2FsZSA9IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLlNQQVRJQUxfU0VMRUNURURfU0laRV9TQ0FMRTtcbiAgICBjb25zdCBtYXNrID0gdGhpcy5zZWxlY3Rpb25TdG9yZT8uY3VycmVudCgpPy5tYXNrO1xuICAgIGNvbnN0IG9wdHMgPSBtYXNrPy5sZW5ndGhcbiAgICAgID8geyByYWRpdXNBdDogKGk6IG51bWJlcikgPT4gKG1hc2tbaV0gPyByYWRpdXMgKiBzY2FsZSA6IHJhZGl1cykgfVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgLy8gYHJhZGl1c2Agc3RpbGwgYm91bmRzIHdoaWNoIGJ1Y2tldHMgYXJlIHZpc2l0ZWQsIHNvIGl0IGhhcyB0byBiZSB0aGUgTEFSR0VTVCBhbnlcbiAgICAvLyBwb2ludCBjYW4gY2xhaW0sIG5vdCB0aGUgYmFzZSBvbmUuXG4gICAgY29uc3QgcmVhY2ggPSBtYXNrPy5sZW5ndGggPyByYWRpdXMgKiBzY2FsZSA6IHJhZGl1cztcbiAgICBpZiAodGhpcy5ob3ZlckluZGV4KSByZXR1cm4gdGhpcy5ob3ZlckluZGV4LnBpY2soeCwgeSwgcmVhY2gsIG9wdHMpO1xuICAgIHJldHVybiBuZWFyZXN0UHJvamVjdGVkSW5kZXgocG9zaXRpb25zLCB4LCB5LCByZWFjaCwgdGhpcy5zcGF0aWFsRGVwdGhzM2QsIG9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvc2l0aW9ucyB0byBoaXQtdGVzdCBhZ2FpbnN0LCByZWJ1aWx0IG9ubHkgd2hlbiB0aGUgc2NlbmUgb3IgY2FtZXJhIG1vdmVkLlxuICAgKlxuICAgKiBBIHBhc3Mgb3ZlciAzLjdNIG9ic2VydmF0aW9ucyBpcyBub3Qgc29tZXRoaW5nIHRvIGRvIHBlciBwb2ludGVybW92ZSwgYW5kIHRoZVxuICAgKiBjbG91ZCBkb2VzIG5vdCBtb3ZlIGJldHdlZW4gZnJhbWVzIHVubGVzcyBzb21ldGhpbmcgc2F5cyBpdCBkaWQuXG4gICAqL1xuICBwcml2YXRlIGhvdmVyUG9zaXRpb25zRm9yKG9iczogU3BhdGlhbE9ic2VydmF0aW9ucyk6IEZsb2F0MzJBcnJheSB8IG51bGwge1xuICAgIGlmICh0aGlzLmhvdmVyUG9zaXRpb25zICYmIHRoaXMuaG92ZXJQb3NpdGlvbnNSZXYgPT09IHRoaXMuc3BhdGlhbFNjZW5lUmV2KSB7XG4gICAgICByZXR1cm4gdGhpcy5ob3ZlclBvc2l0aW9ucztcbiAgICB9XG4gICAgY29uc3QgaXMzZCA9IGlzU3BhdGlhbE9taWNzM2QodGhpcy5jdXJyZW50UGxvdFR5cGUpO1xuICAgIGNvbnN0IGJ1aWx0ID0gaXMzZFxuICAgICAgPyB0aGlzLmdldFNwYXRpYWxTY3JlZW5Qcm9qZWN0aW9uKG9icylcbiAgICAgIDogdGhpcy5ob3ZlcldvcmxkUG9zaXRpb25zKG9icyk7XG4gICAgdGhpcy5ob3ZlclBvc2l0aW9ucyA9IGJ1aWx0O1xuICAgIHRoaXMuaG92ZXJQb3NpdGlvbnNSZXYgPSB0aGlzLnNwYXRpYWxTY2VuZVJldjtcbiAgICAvLyBCdWlsdCBoZXJlLCBpbiB0aGUgc2FtZSBsYXp5IHNsb3QsIHNvIGl0IGlzIHBhaWQgZm9yIG9uIHRoZSBmaXJzdCBob3ZlciBhZnRlciB0aGVcbiAgICAvLyBzY2VuZSBtb3ZlZCBhbmQgbm90IG9uIGV2ZXJ5IGZyYW1lIG9mIGFuIG9yYml0LiBPbmx5IHdvcnRoIGl0IHBhc3QgdGhlIHBvaW50IHdoZXJlXG4gICAgLy8gdGhlIGxpbmVhciBzY2FuIHN0b3BzIGJlaW5nIGZyZWU7IGJlbG93IHRoYXQgdGhlIGJ1aWxkIGNvc3RzIG1vcmUgdGhhbiBpdCBzYXZlcy5cbiAgICB0aGlzLmhvdmVySW5kZXggPSBudWxsO1xuICAgIGlmIChpczNkICYmIGJ1aWx0ICYmIHRoaXMuY2FudmFzICYmIGJ1aWx0Lmxlbmd0aCAvIDIgPj0gU0NSRUVOX0lOREVYX01JTl9QT0lOVFMpIHtcbiAgICAgIGNvbnN0IHcgPSB0aGlzLmNhbnZhcy5jbGllbnRXaWR0aCB8fCB0aGlzLmNhbnZhcy53aWR0aDtcbiAgICAgIGNvbnN0IGggPSB0aGlzLmNhbnZhcy5jbGllbnRIZWlnaHQgfHwgdGhpcy5jYW52YXMuaGVpZ2h0O1xuICAgICAgaWYgKHcgJiYgaCkge1xuICAgICAgICB0aGlzLmhvdmVySW5kZXggPSBuZXcgU2NyZWVuSW5kZXgoXG4gICAgICAgICAgeyBzY3JlZW46IGJ1aWx0LCBkZXB0aDogdGhpcy5zcGF0aWFsRGVwdGhzM2QgPz8gbmV3IEZsb2F0MzJBcnJheShidWlsdC5sZW5ndGggLyAyKSB9LFxuICAgICAgICAgIHcsXG4gICAgICAgICAgaCxcbiAgICAgICAgICAvLyBUaGUgbGFyZ2VzdCByYWRpdXMgYW55IHBpY2sgaGVyZSBjYW4gY2xhaW06IHRoZSBiYXNlIGhvdmVyIHJhZGl1cywgdGltZXMgdGhlXG4gICAgICAgICAgLy8gc2NhbGUgYSBTRUxFQ1RFRCBtYXJrZXIgaXMgZHJhd24gYXQuIFN0YXRlZCByYXRoZXIgdGhhbiBsZWZ0IHRvIHRoZSBkZWZhdWx0LFxuICAgICAgICAgIC8vIGJlY2F1c2UgaXQgaXMgd2hhdCBkZWNpZGVzIHdoZXRoZXIgYSBtYXJrZXIgc3RyYWRkbGluZyB0aGUgY2FudmFzIGVkZ2UgaXNcbiAgICAgICAgICAvLyBmb3VuZCDigJQgaXRzIGNlbnRyZSBpcyBvZmYgc2NyZWVuIHdoaWxlIHBhcnQgb2YgaXQgaXMgbm90LlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1heFJlYWNoOiBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5IT1ZFUl9SQURJVVNfUFhcbiAgICAgICAgICAgICAgKiBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5TUEFUSUFMX1NFTEVDVEVEX1NJWkVfU0NBTEUsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJ1aWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSAyRCBtYXJrZXJzJyBXT1JMRCBwb3NpdGlvbnMsIGluZGV4ZWQgYnkgb2JzZXJ2YXRpb24sIE5hTiBmb3IgYW55IG5vdCBvblxuICAgKiB0aGUgZGlzcGxheWVkIHBsYW5lIOKAlCB0aGUgc2FtZSBhZmZpbmUgYW5kIHRoZSBzYW1lIHN1YnNldCB0aGUgbWFya2VyIGxheWVyIHdhc1xuICAgKiBidWlsdCBmcm9tLCBzbyB0aGUgdG9vbHRpcCBjYW5ub3QgcG9pbnQgYXQgYSBjZWxsIHRoYXQgaXMgbm90IGRyYXduLlxuICAgKi9cbiAgcHJpdmF0ZSBob3ZlcldvcmxkUG9zaXRpb25zKG9iczogU3BhdGlhbE9ic2VydmF0aW9ucyk6IEZsb2F0MzJBcnJheSB8IG51bGwge1xuICAgIGNvbnN0IGRhdGFzZXQgPSB0aGlzLnNwYXRpYWxMYXRlc3Q/LlswXTtcbiAgICBpZiAoIWRhdGFzZXQgfHwgb2JzLmNvdW50ID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBzbGFiID0gdGhpcy5zcGF0aWFsU2xhYihkYXRhc2V0KTtcbiAgICBjb25zdCByZWYgPSBzbGFiPy5yZWYgPz8gZGF0YXNldC5pbWFnZVJlZjtcbiAgICBjb25zdCBbc3gsIHN5XSA9IHJlZj8uc2NhbGUgPz8gWzEsIDFdO1xuICAgIGNvbnN0IFt0eCwgdHldID0gcmVmPy50cmFuc2xhdGUgPz8gWzAsIDBdO1xuICAgIGNvbnN0IGRyYXduID0gc2xhYj8uaW5kaWNlcyA/PyBudWxsO1xuICAgIGNvbnN0IG91dCA9IG5ldyBGbG9hdDMyQXJyYXkob2JzLmNvdW50ICogMikuZmlsbChOYU4pO1xuICAgIGNvbnN0IG4gPSBkcmF3biA/IGRyYXduLmxlbmd0aCA6IG9icy5jb3VudDtcbiAgICBmb3IgKGxldCBrID0gMDsgayA8IG47IGsrKykge1xuICAgICAgY29uc3QgaSA9IGRyYXduID8gZHJhd25ba10gOiBrO1xuICAgICAgb3V0W2kgKiAyXSA9IG9icy54W2ldICogc3ggKyB0eDtcbiAgICAgIG91dFtpICogMiArIDFdID0gb2JzLnlbaV0gKiBzeSArIHR5O1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoYXQgdGhlIHRvb2x0aXAgc2F5cywgcmVzb2x2ZWQgb25jZSBwZXIgY29sb3VyIHNvdXJjZSByYXRoZXIgdGhhbiBwZXIgaG92ZXIuXG4gICAqXG4gICAqIEZldGNoZWQgc2VwYXJhdGVseSBmcm9tIHRoZSBjb2xvdXJpbmcgb24gcHVycG9zZTogdGhlIHJlZmVyZW5jZSBwb3J0IGNhY2hlc1xuICAgKiBjb2x1bW5zLCBidXQgYSBob3N0J3MgbmVlZCBub3QsIGFuZCByZS1mZXRjaGluZyBhIDMuN00tZWxlbWVudCB2ZWN0b3IgYmVjYXVzZVxuICAgKiB0aGUgcG9pbnRlciBtb3ZlZCB3b3VsZCBiZSBpbmRlZmVuc2libGUgZWl0aGVyIHdheS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZUhvdmVyU291cmNlKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc3BhdGlhbERhdGE7XG4gICAgY29uc3QgY29sb3JCeSA9IHZpZXcuY29sb3JCeTtcbiAgICBjb25zdCBrZXkgPSBkYXRhc2V0ICYmIGNvbG9yQnlcbiAgICAgID8gYCR7ZGF0YXNldC5pZH18JHtjb2xvckJ5LmtpbmR9OiR7Y29sb3JCeS5uYW1lfWBcbiAgICAgIDogbnVsbDtcbiAgICBpZiAoa2V5ID09PSB0aGlzLmhvdmVyU291cmNlS2V5KSByZXR1cm47XG4gICAgLy8gVGhlIGtleSBpcyBjb21taXR0ZWQgb25seSB3aGVyZSBhIHZhbHVlIGlzIGFjdHVhbGx5IHN0b3JlZC4gU2V0dGluZyBpdCB1cFxuICAgIC8vIGZyb250IHdvdWxkIG1lYW4gYSByZXNvbHV0aW9uIHRoYXQgbG9zZXMgdGhlIHJhY2UgbGVhdmVzIHRoZSBrZXkgY2xhaW1pbmcgYVxuICAgIC8vIHNvdXJjZSB0aGF0IHdhcyBuZXZlciBzdG9yZWQg4oCUIGFuZCBzaW5jZSBldmVyeSBsYXRlciBlbWlzc2lvbiBjYXJyaWVzIHRoZVxuICAgIC8vIHNhbWUga2V5LCBpdCB3b3VsZCBzaG9ydC1jaXJjdWl0IGhlcmUgZm9yZXZlciBhbmQgdGhlIHRvb2x0aXAgd291bGQgc3RheVxuICAgIC8vIHNpbGVudCBmb3IgdGhlIHJlc3Qgb2YgdGhlIHNlc3Npb24uXG4gICAgY29uc3QgdG9rZW4gPSArK3RoaXMuaG92ZXJTb3VyY2VUb2tlbjtcbiAgICAvLyBObyBjb2xvdXIgc291cmNlIG1lYW5zIG5vdGhpbmcgaXMgYmVpbmcgc2FpZCBhYm91dCB0aGUgY2VsbHMsIHNvIHRoZXJlIGlzIG5vXG4gICAgLy8gY2x1c3RlciB0byBuYW1lIGFuZCB0aGUgdG9vbHRpcCBzdGF5cyBzaWxlbnQuXG4gICAgaWYgKCFrZXkgfHwgIWRhdGFzZXQgfHwgIWNvbG9yQnkgfHwgIXBvcnQpIHtcbiAgICAgIHRoaXMuaG92ZXJTb3VyY2UgPSBudWxsO1xuICAgICAgdGhpcy5ob3ZlclNvdXJjZUtleSA9IGtleTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGlmIChjb2xvckJ5LmtpbmQgPT09ICdjb2x1bW4nKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IGF3YWl0IHBvcnQuZ2V0Q29sdW1uKGNvbG9yQnkubmFtZSk7XG4gICAgICAgIGlmICh0b2tlbiAhPT0gdGhpcy5ob3ZlclNvdXJjZVRva2VuKSByZXR1cm47XG4gICAgICAgIHRoaXMuaG92ZXJTb3VyY2UgPSBpc0NhdGVnb3JpY2FsQ29sdW1uKGNvbHVtbilcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgIGtpbmQ6ICdjYXRlZ29yaWNhbCcsXG4gICAgICAgICAgICBuYW1lOiBjb2xvckJ5Lm5hbWUsXG4gICAgICAgICAgICBjYXRlZ29yaWVzOiBjb2x1bW4ubWV0YS5jYXRlZ29yaWVzLFxuICAgICAgICAgICAgY29kZXM6IGNvbHVtbi5jb2RlcyxcbiAgICAgICAgICB9XG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICBraW5kOiAnY29udGludW91cycsXG4gICAgICAgICAgICBuYW1lOiBjb2xvckJ5Lm5hbWUsXG4gICAgICAgICAgICB2YWx1ZXM6IGNvbHVtbi52YWx1ZXMsXG4gICAgICAgICAgICAuLi4oY29sdW1uLm1ldGEudW5pdCA/IHsgdW5pdDogY29sdW1uLm1ldGEudW5pdCB9IDoge30pLFxuICAgICAgICAgIH07XG4gICAgICAgIHRoaXMuaG92ZXJTb3VyY2VLZXkgPSBrZXk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbHVlcyA9IGF3YWl0IHBvcnQuZ2V0RmVhdHVyZVZlY3Rvcihjb2xvckJ5Lm5hbWUpO1xuICAgICAgaWYgKHRva2VuICE9PSB0aGlzLmhvdmVyU291cmNlVG9rZW4pIHJldHVybjtcbiAgICAgIHRoaXMuaG92ZXJTb3VyY2UgPSB7XG4gICAgICAgIGtpbmQ6ICdjb250aW51b3VzJyxcbiAgICAgICAgbmFtZTogY29sb3JCeS5uYW1lLFxuICAgICAgICB2YWx1ZXMsXG4gICAgICAgIC4uLihkYXRhc2V0LmZlYXR1cmVzPy51bml0ID8geyB1bml0OiBkYXRhc2V0LmZlYXR1cmVzLnVuaXQgfSA6IHt9KSxcbiAgICAgIH07XG4gICAgICB0aGlzLmhvdmVyU291cmNlS2V5ID0ga2V5O1xuICAgIH0gY2F0Y2gge1xuICAgICAgaWYgKHRva2VuICE9PSB0aGlzLmhvdmVyU291cmNlVG9rZW4pIHJldHVybjtcbiAgICAgIC8vIFRoZSB0b29sdGlwIGlzIGFuIGV4dHJhOyBhIGZhaWxlZCBmZXRjaCBtdXN0IG5vdCBkaXN0dXJiIHRoZSByZW5kZXIuIFRoZVxuICAgICAgLy8ga2V5IGlzIGxlZnQgdW5zZXQgc28gYSBsYXRlciBlbWlzc2lvbiByZXRyaWVzIHJhdGhlciB0aGFuIGluaGVyaXRpbmcgYVxuICAgICAgLy8gcGVybWFuZW50IHNpbGVuY2UuXG4gICAgICB0aGlzLmhvdmVyU291cmNlID0gbnVsbDtcbiAgICAgIHRoaXMuaG92ZXJTb3VyY2VLZXkgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9qZWN0IGV2ZXJ5IG9ic2VydmF0aW9uIHRvIGNhbnZhcyBwaXhlbHMgdW5kZXIgdGhlIGN1cnJlbnQgM0QgY2FtZXJhLlxuICAgKlxuICAgKiBUaGUgcHJvamVjdGlvbiBpdHNlbGYgaXMgdGhlIHJlbmRlcmVyJ3M6IGB2aWV3ZXIucHJvamVjdFBvaW50c2Agb3ducyB0aGUgY2FtZXJhLCB0aGVcbiAgICogdmlld3BvcnQgaW4gQ1NTIHBpeGVscywgdGhlIHBlcnNwZWN0aXZlIGRpdmlkZSBhbmQgdGhlIHktZmxpcC4gVGhpcyB1c2VkIHRvIGJlIGZpZnRlZW5cbiAgICogbGluZXMgb2YgY29sdW1uLW1ham9yIG1hdHJpeCBhcml0aG1ldGljIGhlcmUsIGR1cGxpY2F0aW5nIGEgc2Vjb25kIGNvcHkgaW5cbiAgICogYG5hcGFyaS1heGVzLWxhYmVsc2Ag4oCUIGFuZCB0aGUgdHdvIGhhZCBkcmlmdGVkIG9uIHdoYXQgdG8gZG8gd2l0aCBhIE5hTiB3LlxuICAgKlxuICAgKiBXaGF0IGlzIGxlZnQgaXMgdGhlIHBhcnQgdGhhdCBpcyBnZW51aW5lbHkgdGhpcyBhZGFwdGVyJ3M6IFNDQVRURVJJTkcgdGhlIGRyYXduIHN1YnNldFxuICAgKiBiYWNrIGludG8gb2JzZXJ2YXRpb24gb3JkZXIuIFRoZSBjbG91ZCBob2xkcyBvbmx5IHRoZSBwb2ludHMgb2YgdGhlIGRpc3BsYXllZCBzZWN0aW9uLFxuICAgKiBpbiBpdHMgb3duIHBhY2tpbmc7IGV2ZXJ5IGNvbnN1bWVyIGluZGV4ZXMgYnkgb2JzZXJ2YXRpb24uIE5hTiBzdGFuZHMgZm9yIFwibm90IG9uXG4gICAqIHNjcmVlblwiLCB3aGljaCBpcyBhbHNvIHRoZSByaWdodCBhbnN3ZXIgZm9yIGFuIG9ic2VydmF0aW9uIHdob3NlIHNlY3Rpb24gaXMgaGlkZGVuLlxuICAgKlxuICAgKiBOdWxsIHdoZW4gdGhlIDNEIGNsb3VkIGlzIG5vdCBtb3VudGVkLCBzbyB0aGUgY2FsbGVyIGZhbGxzIGJhY2sgdG8gdGhlIDJEIGFmZmluZSBwYXRoLlxuICAgKi9cbiAgZ2V0U3BhdGlhbFNjcmVlblByb2plY3Rpb24ob2JzOiBTcGF0aWFsT2JzZXJ2YXRpb25zKTogRmxvYXQzMkFycmF5IHwgbnVsbCB7XG4gICAgY29uc3Qgdmlld2VyID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2aWV3ZXIgfHwgIXRoaXMuc3BhdGlhbFBvc2l0aW9uczNkKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHByb2plY3RlZCA9IHZpZXdlci5wcm9qZWN0UG9pbnRzKHRoaXMuc3BhdGlhbFBvc2l0aW9uczNkLCB0aGlzLnNwYXRpYWxQcm9qZWN0aW9uM2QpO1xuICAgIGlmICghcHJvamVjdGVkKSByZXR1cm4gbnVsbDtcbiAgICAvLyBSZXVzZWQgYWNyb3NzIGNhbWVyYSBjaGFuZ2VzOiBhdCAzLjdNIG9ic2VydmF0aW9ucyB0aGlzIGlzIGEgMzAgTUIgYWxsb2NhdGlvbiB0aGF0XG4gICAgLy8gd291bGQgb3RoZXJ3aXNlIGhhcHBlbiBvbiBldmVyeSBvcmJpdC5cbiAgICB0aGlzLnNwYXRpYWxQcm9qZWN0aW9uM2QgPSBwcm9qZWN0ZWQ7XG5cbiAgICBjb25zdCBkcmF3biA9IHRoaXMuc3BhdGlhbERyYXduM2Q7XG4gICAgY29uc3QgeyBzY3JlZW4sIGRlcHRoIH0gPSBwcm9qZWN0ZWQ7XG4gICAgY29uc3QgY291bnQgPSBzY3JlZW4ubGVuZ3RoID4+IDE7XG4gICAgY29uc3Qgb3V0ID0gbmV3IEZsb2F0MzJBcnJheShvYnMuY291bnQgKiAyKS5maWxsKE5hTik7XG4gICAgY29uc3QgZGVwdGhzID0gbmV3IEZsb2F0MzJBcnJheShvYnMuY291bnQpLmZpbGwoTmFOKTtcbiAgICBmb3IgKGxldCBrID0gMDsgayA8IGNvdW50OyBrKyspIHtcbiAgICAgIGNvbnN0IGkgPSBkcmF3biA/IGRyYXduW2tdIDogaztcbiAgICAgIGlmIChpID49IG9icy5jb3VudCkgY29udGludWU7XG4gICAgICBvdXRbaSAqIDJdID0gc2NyZWVuW2sgKiAyXTtcbiAgICAgIG91dFtpICogMiArIDFdID0gc2NyZWVuW2sgKiAyICsgMV07XG4gICAgICBkZXB0aHNbaV0gPSBkZXB0aFtrXTtcbiAgICB9XG4gICAgLy8gS2VwdCBiZXNpZGUgdGhlIHNjcmVlbiBwb3NpdGlvbnMgc28gdGhlIGhvdmVyIHBpY2sgY2FuIHByZWZlciB0aGUgRlJPTlQtbW9zdCBwb2ludFxuICAgIC8vIHVuZGVyIHRoZSBjdXJzb3IgcmF0aGVyIHRoYW4gdGhlIG9uZSBuZWFyZXN0IGl0cyBjZW50cmUg4oCUIHdoaWNoIGluIGEgZGVuc2UgY2xvdWQgaXNcbiAgICAvLyByZWd1bGFybHkgc29tZXRoaW5nIHRoZSByZW5kZXJlciBkcmV3IGFub3RoZXIgcG9pbnQgb3Zlci5cbiAgICB0aGlzLnNwYXRpYWxEZXB0aHMzZCA9IGRlcHRocztcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqIFJlYnVpbGQgdGhlIG1hcmtlcnMgb24gYW55IGRhdGFzZXQgb3Igdmlldy1zdGF0ZSBjaGFuZ2UuICovXG4gIHByaXZhdGUgc3Vic2NyaWJlU3BhdGlhbCgpOiB2b2lkIHtcbiAgICB0aGlzLnNwYXRpYWxTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc3BhdGlhbERhdGE7XG4gICAgaWYgKCFwb3J0KSByZXR1cm47XG4gICAgY29uc3Qgc2VsZWN0aW9uJCA9IHRoaXMuc2VsZWN0aW9uU3RvcmU/LmdldFNlbGVjdGlvbiQoKSA/PyBvZihlbXB0eVNlbGVjdGlvbigpKTtcbiAgICAvLyBUaGUgZGlzcGxheSBjb2xvcm1hcCBpcyBhbiBpbnB1dCBoZXJlLCBub3QganVzdCBzb21ldGhpbmcgcmVhZCBhdCBidWlsZFxuICAgIC8vIHRpbWU6IGBjb250aW51b3VzQ29sb3JtYXA6IG51bGxgIG1lYW5zIFwiZm9sbG93IHRoZSBpbWFnZSdzIGNvbG9ybWFwXCIsIGFuZCBhXG4gICAgLy8gc2V0dGluZyB0aGF0IG9ubHkgdGFrZXMgZWZmZWN0IGF0IHRoZSBuZXh0IHVucmVsYXRlZCByZWJ1aWxkIGlzIG5vdCBvbmUuXG4gICAgdGhpcy5zcGF0aWFsU3ViID0gY29tYmluZUxhdGVzdChbXG4gICAgICBwb3J0LmdldERhdGFzZXQkKCksIHRoaXMuc3RvcmUuZ2V0U3BhdGlhbFZpZXckKCksIHNlbGVjdGlvbiQsXG4gICAgICB0aGlzLnN0b3JlLmdldENvbG9ybWFwKCksIHRoaXMuc3RvcmUuZ2V0UmV2ZXJzZVNjYWxlKCksXG4gICAgXSkuc3Vic2NyaWJlKChbZGF0YXNldCwgdmlldywgc2VsZWN0aW9uLCBjb2xvcm1hcCwgcmV2ZXJzZV0pID0+IHtcbiAgICAgIHRoaXMuY3VycmVudENvbG9ybWFwID0gKGNvbG9ybWFwIGFzIENvbG9ybWFwTm9kZSkgPz8gbnVsbDtcbiAgICAgIHRoaXMuY3VycmVudFJldmVyc2UgPSAhIXJldmVyc2U7XG4gICAgICAvLyBLZXB0IHNvIGEgc2xpY2UgY2hhbmdlIGNhbiByZWRyYXcgdGhlIG1hcmtlcnMgZm9yIHRoZSBuZXcgcGxhbmUsIHdoaWNoXG4gICAgICAvLyBhcnJpdmVzIHRocm91Z2ggc2V0WkluZGV4IHJhdGhlciB0aGFuIHRocm91Z2ggYW55IG9mIHRoZXNlIHN0cmVhbXMuXG4gICAgICB0aGlzLnNwYXRpYWxMYXRlc3QgPSBbZGF0YXNldCwgdmlldywgc2VsZWN0aW9uXTtcbiAgICAgIC8vIFRoZSBtYXJrZXJzIGFyZSBhYm91dCB0byBtb3ZlIG9yIGNoYW5nZSBtZWFuaW5nLCBzbyBib3RoIGhhbHZlcyBvZiB0aGVcbiAgICAgIC8vIHRvb2x0aXAg4oCUIHdoZXJlIHRoZSBwb2ludHMgYXJlLCBhbmQgd2hhdCB0aGV5IGFyZSDigJQgYXJlIHN0YWxlLlxuICAgICAgdGhpcy5zcGF0aWFsU2NlbmVSZXYrKztcbiAgICAgIHZvaWQgdGhpcy5yZXNvbHZlSG92ZXJTb3VyY2UoZGF0YXNldCwgdmlldyk7XG4gICAgICB2b2lkIChpc1NwYXRpYWxPbWljczNkKHRoaXMuY3VycmVudFBsb3RUeXBlKVxuICAgICAgICA/IHRoaXMucmVidWlsZFNwYXRpYWxQb2ludHMzZChkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24pXG4gICAgICAgIDogdGhpcy5yZWJ1aWxkU3BhdGlhbFBvaW50cyhkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24pKTtcbiAgICAgIGlmICghaXNTcGF0aWFsT21pY3MzZCh0aGlzLmN1cnJlbnRQbG90VHlwZSkpIHRoaXMuc3BhdGlhbFRpbGVzTWdyPy5yZWZyZXNoKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogKFJlKWJ1aWxkIHRoZSBvYnNlcnZhdGlvbiBtYXJrZXIgbGF5ZXIgZm9yIHRoZSBjdXJyZW50IGRhdGFzZXQgKyB2aWV3IHN0YXRlLiAqL1xuICBwcml2YXRlIGFzeW5jIHJlYnVpbGRTcGF0aWFsUG9pbnRzKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrID0gZW1wdHlTZWxlY3Rpb24oKSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgdmlld2VyID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2aWV3ZXIpIHJldHVybjtcbiAgICBjb25zdCB0b2tlbiA9ICsrdGhpcy5zcGF0aWFsUmVidWlsZFRva2VuO1xuXG4gICAgLy8gUmVzb2x2ZSBjb2xvdXJzIEJFRk9SRSB0b3VjaGluZyB0aGUgc2NlbmU6IGEgZ2VuZSBmZXRjaCBjYW4gZmFpbCBvciBiZVxuICAgIC8vIHN1cGVyc2VkZWQsIGFuZCBkcm9wcGluZyB0aGUgZXhpc3RpbmcgbGF5ZXIgZmlyc3Qgd291bGQgYmxhbmsgdGhlIHZpZXcuXG4gICAgbGV0IGZhY2VDb2xvcjogUmV0dXJuVHlwZTx0eXBlb2YgdG9SZ2JhVHVwbGVzPiB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICAgIHRyeSB7XG4gICAgICBmYWNlQ29sb3IgPSBkYXRhc2V0XG4gICAgICAgID8gYXdhaXQgdGhpcy5zcGF0aWFsRmFjZUNvbG9ycyhkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24pXG4gICAgICAgIDogTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuU1BBVElBTF9ORVVUUkFMX0NPTE9SO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSBzcGF0aWFsIGNvbG91cmluZyBmYWlsZWQg4oCUIGZhbGxpbmcgYmFjayB0byBhIGZsYXQgY29sb3VyJywgZXJyKTtcbiAgICAgIGZhY2VDb2xvciA9IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLlNQQVRJQUxfTkVVVFJBTF9DT0xPUjtcbiAgICB9XG4gICAgLy8gQSBuZXdlciByZWJ1aWxkIChvciBhIHRlYXJkb3duKSBzdGFydGVkIHdoaWxlIHRoZSB2ZWN0b3Igd2FzIGluIGZsaWdodC5cbiAgICBpZiAodG9rZW4gIT09IHRoaXMuc3BhdGlhbFJlYnVpbGRUb2tlbiB8fCB0aGlzLnZpZXdlciAhPT0gdmlld2VyKSByZXR1cm47XG5cbiAgICBpZiAoIWRhdGFzZXQgfHwgZGF0YXNldC5vYnNlcnZhdGlvbnMuY291bnQgPT09IDApIHtcbiAgICAgIGlmICh0aGlzLnNwYXRpYWxQb2ludHMpIHtcbiAgICAgICAgdmlld2VyLmxheWVycy5yZW1vdmUodGhpcy5zcGF0aWFsUG9pbnRzKTtcbiAgICAgICAgdGhpcy5zcGF0aWFsUG9pbnRzID0gbnVsbDtcbiAgICAgICAgdGhpcy5zcGF0aWFsTGF5ZXJLZXkgPSBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZ2VuZU1hcExheWVyKSB7XG4gICAgICAgIHZpZXdlci5sYXllcnMucmVtb3ZlKHRoaXMuZ2VuZU1hcExheWVyKTtcbiAgICAgICAgdGhpcy5nZW5lTWFwTGF5ZXIgPSBudWxsO1xuICAgICAgICB0aGlzLmdlbmVNYXBLZXkgPSBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9icyA9IGRhdGFzZXQub2JzZXJ2YXRpb25zO1xuICAgIC8vIEEgZGF0YXNldCB3aG9zZSBpbWFnZSBJUyBpdHMgdm9sdW1lIHNob3dzIE9ORSBQTEFORSBhdCBhIHRpbWUsIHNvIHRoZVxuICAgIC8vIG1hcmtlcnMgYXJlIHRoZSBvYnNlcnZhdGlvbnMgaW4gdGhlIGRpc3BsYXllZCBwbGFuZSwgZHJhd24gaW4gdGhhdCBwbGFuZSdzXG4gICAgLy8gcGl4ZWwgZ3JpZC4gV2l0aG91dCB0aGUgZmlsdGVyIHRoZSBzcGVjaW1lbidzIHdob2xlIGRlcHRoIHBpbGVzIG9udG8gb25lXG4gICAgLy8gc2VjdGlvbiBhbmQgcmVhZHMgYXMgYSBzbWVhcjsgd2l0aG91dCB0aGUgYWZmaW5lIHRoZSBjb29yZGluYXRlcyBhcmUgcmVhZFxuICAgIC8vIGFzIHBpeGVscyBhbmQgbGFuZCBvZmYgdGhlIHNsaWNlIGVudGlyZWx5LlxuICAgIGNvbnN0IHNsYWIgPSB0aGlzLnNwYXRpYWxTbGFiKGRhdGFzZXQpO1xuICAgIC8vIFRoZSBnZW5lIG1hcCBnb2VzIFVOREVSIHRoZSBjZWxscywgc28gaXQgaXMgc2V0dGxlZCBiZWZvcmUgdGhleSBhcmUgYWRkZWQuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVHZW5lTWFwKHZpZXdlciwgZGF0YXNldCwgdmlldywgc2VsZWN0aW9uLCBzbGFiKTtcbiAgICBpZiAodG9rZW4gIT09IHRoaXMuc3BhdGlhbFJlYnVpbGRUb2tlbiB8fCB0aGlzLnZpZXdlciAhPT0gdmlld2VyKSByZXR1cm47XG4gICAgY29uc3QgcmVmID0gc2xhYj8ucmVmID8/IGRhdGFzZXQuaW1hZ2VSZWY7XG4gICAgY29uc3QgYmFzZSA9IG1hcmtlckRpYW1ldGVycyhvYnMsIE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLlNQQVRJQUxfRkFMTEJBQ0tfUkFESVVTKTtcbiAgICBjb25zdCBzY2FsZSA9IHZpZXcucG9pbnRTY2FsZSA+IDAgPyB2aWV3LnBvaW50U2NhbGUgOiAxO1xuICAgIGNvbnN0IGZsb29yID0gc2xhYj8ubWluRGlhbWV0ZXIgPz8gMDtcbiAgICBjb25zdCBzaXplT2YgPSAoaTogbnVtYmVyKSA9PlxuICAgICAgTWF0aC5tYXgodHlwZW9mIGJhc2UgPT09ICdudW1iZXInID8gYmFzZSA6IGJhc2VbaV0sIGZsb29yKSAqIHNjYWxlO1xuICAgIGNvbnN0IHNpemU6IG51bWJlciB8IEZsb2F0MzJBcnJheSA9XG4gICAgICB0eXBlb2YgYmFzZSA9PT0gJ251bWJlcicgJiYgIXNsYWJcbiAgICAgICAgPyBNYXRoLm1heChiYXNlLCBmbG9vcikgKiBzY2FsZVxuICAgICAgICA6IEZsb2F0MzJBcnJheS5mcm9tKHNsYWI/LmluZGljZXMgPz8geyBsZW5ndGg6IG9icy5jb3VudCB9LCAoX3YsIGkpID0+XG4gICAgICAgICAgICBzaXplT2Yoc2xhYiA/IHNsYWIuaW5kaWNlc1tpXSA6IGkpKTtcblxuICAgIC8vIG5hcGFyaSdzIGltYWdlIHZpZXcgQ0xFQVJTIHRoZSB3aG9sZSBsYXllciBsaXN0IG9uIGV2ZXJ5IHJlbmRlciwgc28gdGhlXG4gICAgLy8gbWFya2VycyBnbyB3aXRoIGl0IHdoZW5ldmVyIHRoZSBpbWFnZSBpcyByZS1yZW5kZXJlZCDigJQgYSBzY3J1YiwgYSBjb250cmFzdFxuICAgIC8vIGNoYW5nZS4gVGhlIGNhY2hlZCBoYW5kbGUgaXMgdGhlbiBkZXRhY2hlZCwgYW5kIG11dGF0aW5nIGl0IGRyYXdzIG5vdGhpbmc6XG4gICAgLy8gdHJlYXQgYSBsYXllciB0aGF0IGlzIG5vIGxvbmdlciBpbiB0aGUgc2NlbmUgYXMgYWJzZW50IHNvIGl0IGdldHMgcmUtYWRkZWQuXG4gICAgaWYgKHRoaXMuc3BhdGlhbFBvaW50cyAmJiAhdmlld2VyLmxheWVycy5pdGVtcy5pbmNsdWRlcyh0aGlzLnNwYXRpYWxQb2ludHMpKSB7XG4gICAgICB0aGlzLnNwYXRpYWxQb2ludHMgPSBudWxsO1xuICAgICAgdGhpcy5zcGF0aWFsTGF5ZXJLZXkgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIEEgc2l6ZS9jb2xvdXIvb3BhY2l0eS9zZWxlY3Rpb24gY2hhbmdlIGlzIERJU1BMQVktb25seTogbXV0YXRlIHRoZSBsYXllclxuICAgIC8vIHJhdGhlciB0aGFuIGRyb3BwaW5nIGFuZCByZS1hZGRpbmcgaXQuIEJvdGggc2V0dGVycyBidW1wIHRoZSBsYXllcidzXG4gICAgLy8gZGF0YVZlcnNpb24sIHdoaWNoIGlzIHdoYXQgbWFrZXMgbmFwYXJpLWpzIHJlYnVpbGQgdGhlIGluc3RhbmNlIGJ1ZmZlciBhbmRcbiAgICAvLyByZWRyYXcg4oCUIGFuZCBpdCBhdm9pZHMgcmVidWlsZGluZyA4NGsgcG9zaXRpb25zIHRvIGNoYW5nZSBvbmUgbnVtYmVyLlxuICAgIC8vIFRoZSBzbGljZSBpcyBwYXJ0IG9mIHRoZSBrZXk6IGEgc2NydWIgY2hhbmdlcyBXSElDSCBvYnNlcnZhdGlvbnMgYXJlIGRyYXduLFxuICAgIC8vIHdoaWNoIGlzIGdlb21ldHJ5LCBub3QgZGlzcGxheS5cbiAgICBjb25zdCBrZXkgPSBgJHtkYXRhc2V0LmlkfToke29icy5jb3VudH06JHtzbGFiPy5zbGljZSA/PyAnJ31gO1xuICAgIGlmICh0aGlzLnNwYXRpYWxQb2ludHMgJiYga2V5ID09PSB0aGlzLnNwYXRpYWxMYXllcktleSkge1xuICAgICAgdGhpcy5zcGF0aWFsUG9pbnRzLnNpemUgPSBzaXplO1xuICAgICAgdGhpcy5zcGF0aWFsUG9pbnRzLnZpc2libGUgPSB0aGlzLnNwYXRpYWxQb2ludHNWaXNpYmxlKCk7XG4gICAgICB0aGlzLnNwYXRpYWxQb2ludHMuZmFjZUNvbG9yID0gdGhpcy5nYXRoZXJDb2xvcnMoZmFjZUNvbG9yLCBzbGFiPy5pbmRpY2VzKSBhcyBuZXZlcjtcbiAgICAgIHRoaXMuaGlkZUZvcmVpZ25JbWFnZSh2aWV3ZXIsICghIXJlZiB8fCAhIWRhdGFzZXQudm9sdW1lKSAmJiB2aWV3LnNob3dJbWFnZSAhPT0gZmFsc2UpO1xuICAgIHRoaXMucmVnaW9uT3ZlcmxheT8uc2V0UmVnaW9uc1Zpc2libGUodmlldy5zaG93QW5ub3RhdGlvbnMgIT09IGZhbHNlKTtcbiAgICAgIHZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3BhdGlhbFBvaW50cykge1xuICAgICAgdmlld2VyLmxheWVycy5yZW1vdmUodGhpcy5zcGF0aWFsUG9pbnRzKTtcbiAgICAgIHRoaXMuc3BhdGlhbFBvaW50cyA9IG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZHJhd24gPSBzbGFiPy5pbmRpY2VzO1xuICAgIGNvbnN0IGNvdW50ID0gZHJhd24gPyBkcmF3bi5sZW5ndGggOiBvYnMuY291bnQ7XG4gICAgY29uc3QgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJBcnJheShjb3VudCAqIDIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgY29uc3QgbyA9IGRyYXduID8gZHJhd25baV0gOiBpO1xuICAgICAgcG9zaXRpb25zW2kgKiAyXSA9IG9icy54W29dO1xuICAgICAgcG9zaXRpb25zW2kgKiAyICsgMV0gPSBvYnMueVtvXTtcbiAgICB9XG4gICAgdGhpcy5zcGF0aWFsTGF5ZXJLZXkgPSBrZXk7XG4gICAgdGhpcy5zcGF0aWFsUG9pbnRzID0gdmlld2VyLmFkZFBvaW50cyhwb3NpdGlvbnMsIHtcbiAgICAgIG5hbWU6ICdvYnNlcnZhdGlvbnMnLFxuICAgICAgc2l6ZSxcbiAgICAgIGZhY2VDb2xvcjogdGhpcy5nYXRoZXJDb2xvcnMoZmFjZUNvbG9yLCBkcmF3biksXG4gICAgICAvLyBObyBib3JkZXI6IGF0IFZpc2l1bSBzcG90IGRlbnNpdHkgYW4gb3V0bGluZSBwZXIgbWFya2VyIHJlYWRzIGFzIG5vaXNlLFxuICAgICAgLy8gYW5kIGl0IGNvc3RzIGEgc2Vjb25kIGNvbG91ciBhcnJheS5cbiAgICAgIGJvcmRlcldpZHRoOiAwLFxuICAgICAgLy8gVGhlIGRhdGFzZXQncyBkYXRhLT53b3JsZCBhZmZpbmUuIFNwYXRpYWxEYXRhIHJlY29yZHMgb25lIHBlciBjb29yZGluYXRlXG4gICAgICAvLyBzeXN0ZW0gKFZpc2l1bSBzcG90IGNvb3JkcyBhcmUgaW4gdGhlIEZVTEwtcmVzb2x1dGlvbiBmcmFtZSB3aGlsZSB0aGVcbiAgICAgIC8vIHNlcnZlZCBpbWFnZSBtYXkgYmUgdGhlIGhpcmVzIGRvd25zY2FsZSksIHNvIHdpdGhvdXQgdGhpcyB0aGUgbWFya2Vyc1xuICAgICAgLy8gbGFuZCBpbiB0aGUgcmlnaHQgc2hhcGUgYXQgdGhlIHdyb25nIHNjYWxlLiBEZWZhdWx0cyB0byBpZGVudGl0eSB3aGVuXG4gICAgICAvLyB0aGUgY29vcmRpbmF0ZXMgYXJlIGFscmVhZHkgaW4gdGhlIGltYWdlJ3MgcGl4ZWwgc3BhY2UuXG4gICAgICBzY2FsZTogcmVmPy5zY2FsZSA/PyBbMSwgMV0sXG4gICAgICB0cmFuc2xhdGU6IHJlZj8udHJhbnNsYXRlID8/IFswLCAwXSxcbiAgICAgIHZpc2libGU6IHRoaXMuc3BhdGlhbFBvaW50c1Zpc2libGUoKSxcbiAgICB9KTtcbiAgICAvLyBPdXRsaW5lcywgZGVuc2l0eSBhbmQgdHJhbnNjcmlwdHMgZ28gYmFjayBvdmVyIHRoZSBtYXJrZXJzIGp1c3QgYWRkZWQuXG4gICAgdGhpcy5zcGF0aWFsVGlsZXNNZ3I/LmFmdGVyT2JzZXJ2YXRpb25zKCk7XG4gICAgdGhpcy5mcmFtZVNwYXRpYWxQb2ludHNPbmNlKHZpZXdlciwgZGF0YXNldC5pZCwgcG9zaXRpb25zLCAhIXJlZik7XG4gICAgdGhpcy5oaWRlRm9yZWlnbkltYWdlKHZpZXdlciwgKCEhcmVmIHx8ICEhZGF0YXNldC52b2x1bWUpICYmIHZpZXcuc2hvd0ltYWdlICE9PSBmYWxzZSk7XG4gICAgdGhpcy5yZWdpb25PdmVybGF5Py5zZXRSZWdpb25zVmlzaWJsZSh2aWV3LnNob3dBbm5vdGF0aW9ucyAhPT0gZmFsc2UpO1xuICAgIHRoaXMuc2V0UmVnaW9uR3JpZEZvcihkYXRhc2V0LCBwb3NpdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRlbGwgdGhlIHJlZ2lvbiBvdmVybGF5IGhvdyBmaW5lbHkgYSBkcmF3biB2ZXJ0ZXggbWF5IGJlIHBsYWNlZC5cbiAgICpcbiAgICogUmVnaW9uIGdlb21ldHJ5IGlzIHN0b3JlZCBpbiB3aG9sZSB3b3JsZCB1bml0cywgd2hpY2ggaXMgcmlnaHQgd2hlbiB0aGUgd29ybGQgSVNcbiAgICogcGl4ZWxzIOKAlCBhIHJlZ2lvbiBzaG91bGQgYWxpZ24gdG8gdGhlbS4gSXQgaXMgd3JvbmcgZm9yIGEgZGF0YXNldCB0aGF0IHJlZ2lzdGVycyBvbnRvXG4gICAqIG5vIGltYWdlOiBzZXFGSVNIJ3Mgb2JzZXJ2YXRpb25zIHNwYW4gYWJvdXQgNSB4IDcgdW5pdHMgaW4gdG90YWwsIHNvIHdob2xlLXVuaXRcbiAgICogdmVydGljZXMgbGVhdmUgcm91Z2hseSBzaXggYnkgZWlnaHQgcGxhY2VhYmxlIHBvc2l0aW9ucyBhY3Jvc3MgdGhlIGVudGlyZSBzYW1wbGUgYW5kXG4gICAqIGFuIFJPSSBjYW5ub3QgYmUgZHJhd24gYXQgYW55IHpvb20uIE5vdGhpbmcgZXJyb3JzOyB0aGUgdG9vbCBqdXN0IGNhbm5vdCBleHByZXNzIHRoZVxuICAgKiBzaGFwZS5cbiAgICpcbiAgICogS2V5ZWQgb24gd2hldGhlciB0aGUgZGF0YXNldCBicmluZ3MgUElYRUxTIHJhdGhlciB0aGFuIG9uIHRoZSBleHRlbnQsIGJlY2F1c2UgdGhlXG4gICAqIGV4dGVudCBjYW5ub3QgdGVsbCB0aGUgdHdvIGFwYXJ0IOKAlCAyLDAwMCB1bml0cyBpcyBhIHNtYWxsIHNsaWRlIG9yIGEgbGFyZ2Ugc2VjdGlvblxuICAgKiBkZXBlbmRpbmcgb25seSBvbiB3aGF0IHRoZSB1bml0cyBhcmUsIGFuZCBvbmx5IHRoZSBkYXRhc2V0IGtub3dzLlxuICAgKi9cbiAgcHJpdmF0ZSBzZXRSZWdpb25HcmlkRm9yKGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCBwb3NpdGlvbnM6IEZsb2F0MzJBcnJheSk6IHZvaWQge1xuICAgIGNvbnN0IG92ZXJsYXkgPSB0aGlzLnJlZ2lvbk92ZXJsYXk7XG4gICAgaWYgKCFvdmVybGF5Py5zZXRXb3JsZFF1YW50dW0pIHJldHVybjtcbiAgICBpZiAoZGF0YXNldC5pbWFnZVJlZiB8fCBkYXRhc2V0LnZvbHVtZSkge1xuICAgICAgb3ZlcmxheS5zZXRXb3JsZFF1YW50dW0oUElYRUxfV09STERfUVVBTlRVTSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBtaW5YID0gSW5maW5pdHk7IGxldCBtYXhYID0gLUluZmluaXR5OyBsZXQgbWluWSA9IEluZmluaXR5OyBsZXQgbWF4WSA9IC1JbmZpbml0eTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgY29uc3QgeCA9IHBvc2l0aW9uc1tpXTtcbiAgICAgIGNvbnN0IHkgPSBwb3NpdGlvbnNbaSArIDFdO1xuICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoeCkgfHwgIU51bWJlci5pc0Zpbml0ZSh5KSkgY29udGludWU7XG4gICAgICBpZiAoeCA8IG1pblgpIG1pblggPSB4O1xuICAgICAgaWYgKHggPiBtYXhYKSBtYXhYID0geDtcbiAgICAgIGlmICh5IDwgbWluWSkgbWluWSA9IHk7XG4gICAgICBpZiAoeSA+IG1heFkpIG1heFkgPSB5O1xuICAgIH1cbiAgICBvdmVybGF5LnNldFdvcmxkUXVhbnR1bSh3b3JsZFF1YW50dW1Gb3JFeHRlbnQobWF4WCAtIG1pblgsIG1heFkgLSBtaW5ZKSk7XG4gIH1cblxuICAvKipcbiAgICogRnJhbWUgdGhlIDJEIGNhbWVyYSBvbiB0aGUgb2JzZXJ2YXRpb25zLCBmb3IgYSBkYXRhc2V0IHRoYXQgYnJpbmdzIG5vIGltYWdlLlxuICAgKlxuICAgKiBUaGUgMkQgY2FtZXJhIGlzIG5vcm1hbGx5IGZpdHRlZCB0byB0aGUgSU1BR0UsIGJlY2F1c2UgdGhlIG9ic2VydmF0aW9ucyBhcmUgaW4gdGhhdFxuICAgKiBpbWFnZSdzIHBpeGVsIHNwYWNlIGFuZCBmcmFtaW5nIHRoZSBpbWFnZSBmcmFtZXMgdGhlbSB0b28uIEEgZGF0YXNldCB3aXRoIG5vXG4gICAqIHJlZmVyZW5jZSBpbWFnZSBoYXMgY29vcmRpbmF0ZXMgaW4gaXRzIG93biB1bml0cyBpbnN0ZWFkIOKAlCBzZXFGSVNIJ3Mgc3BhbiBhYm91dFxuICAgKiA1eDcg4oCUIHNvIHRoZSBpbWFnZSBmcmFtaW5nIGxlZnQgb3ZlciBmcm9tIHdoYXRldmVyIHdhcyBvbiBzY3JlZW4gYmVmb3JlIHB1dHMgdGhlXG4gICAqIHdob2xlIGNsb3VkIG9mZnNjcmVlbjogbWVhc3VyZWQgYXQgOS43IHggMTMuNCBQSVhFTFMsIGNlbnRyZWQgMjU2cHggZnJvbSB3aGVyZSB0aGVcbiAgICogY2FtZXJhIHdhcyBsb29raW5nLiBUaGUgcG9pbnRzIGFyZSBhbGwgdGhlcmUgYW5kIGRyYXduOyB0aGV5IGFyZSBhIHNwZWNrLiBXaGljaFxuICAgKiBsb29rcyBleGFjdGx5IGxpa2UgdGhlIGRhdGFzZXQgaGF2aW5nIGZhaWxlZCB0byBsb2FkLlxuICAgKlxuICAgKiBPbmNlIHBlciBkYXRhc2V0LCBhcyBuYXBhcmktanMncyBgZml0M2Q6ICdvbmNlJ2AgZG9lcyBmb3IgdGhlIGNsb3VkOiByZS1jb2xvdXJpbmcsXG4gICAqIHNsaWNpbmcgb3IgcGlja2luZyBhIGdlbmUgcmUtYWRkcyB0aGlzIGxheWVyLCBhbmQgcmUtZnJhbWluZyBvbiB0aG9zZSB3b3VsZCBtb3ZlXG4gICAqIHRoZSBjYW1lcmEgdW5kZXIgdGhlIHVzZXIg4oCUIHRoZSBjYW1lcmEgdG9vbHMgYW5kIHRoZSBjYW52YXMgZHJhZyBhcmUgbWVhbnQgdG8gYmVcbiAgICogdGhlIG9ubHkgdGhpbmdzIHRoYXQgZG8uXG4gICAqL1xuICAvKipcbiAgICogSGlkZSB0aGUgaW1hZ2UgbGF5ZXIgZm9yIGEgZGF0YXNldCB0aGF0IGJyaW5ncyBubyBpbWFnZSBvZiBpdHMgb3duLlxuICAgKlxuICAgKiBUaGUgaG9zdCdzIHZpZXdlciBrZWVwcyB3aGF0ZXZlciBpbWFnZSB3YXMgbGFzdCBsb2FkZWQsIGFuZCBmb3IgYSBkYXRhc2V0IHRoYXRcbiAgICogcmVnaXN0ZXJzIG9udG8gbm9uZSB0aGF0IHBpY3R1cmUgYmVsb25ncyB0byBzb21ldGhpbmcgZWxzZSBlbnRpcmVseSDigJQgdGhlIGV4YW1wbGUnc1xuICAgKiBkZWZhdWx0IHNsaWRlLCBzYXkuIEl0IGlzIG5vdCBtZXJlbHkgaXJyZWxldmFudDogdGhlIHR3byBsaXZlIGluIGRpZmZlcmVudCBjb29yZGluYXRlXG4gICAqIHNwYWNlcyAoaW1hZ2UgcGl4ZWxzIGFnYWluc3QgdGhlIGVtYmVkZGluZydzIG93biB1bml0cyksIHNvIHRoZSBsZWZ0b3ZlciBpcyBtYWduaWZpZWRcbiAgICogcm91Z2hseSBhIGh1bmRyZWRmb2xkLiBBdCB0aGUgZml0dGVkIHpvb20gdGhlIGNhbWVyYSBzaXRzIGluc2lkZSBpdHMgY29ybmVyLCB3aGVyZSBpdFxuICAgKiByZWFkcyBhcyBibGFuayBiYWNrZ3JvdW5kLCBhbmQgaXQgYXBwZWFycyBvbmx5IG9uY2UgeW91IHpvb20gb3V0IGZhciBlbm91Z2ggdG8gZmluZFxuICAgKiBpdCDigJQgd2hpY2ggaXMgZXhhY3RseSBob3cgaXQgZ2V0cyBub3RpY2VkLlxuICAgKlxuICAgKiBIaWRkZW4gcmF0aGVyIHRoYW4gcmVtb3ZlZCwgYW5kIGhpZGRlbiBIRVJFIHJhdGhlciB0aGFuIGJ5IGNsZWFyaW5nIHRoZSBob3N0J3MgaW1hZ2VcbiAgICogc3RhdGU6IHRoYXQgc3RhdGUgZHJpdmVzIHRoZSB3aG9sZSByZW5kZXIgcGlwZWxpbmUsIGluY2x1ZGluZyBhIFBsb3RseSBiYWNrZW5kIHdob3NlXG4gICAqIGZpZWxkcyBhcmUgZGVjbGFyZWQgd2l0aCBkZWZpbml0ZS1hc3NpZ25tZW50IGFzc2VydGlvbnMsIHNvIGVtcHR5aW5nIGl0IHRocm93cyBmcm9tXG4gICAqIHdoaWNoZXZlciBmaWVsZCB0aGUgbmV4dCBwYXRoIGhhcHBlbnMgdG8gcmVhZC4gVGhpcyB0b3VjaGVzIG9uZSBsYXllcidzIHZpc2liaWxpdHlcbiAgICogYW5kIG5vdGhpbmcgZWxzZS5cbiAgICovXG4gIHByaXZhdGUgaGlkZUZvcmVpZ25JbWFnZSh2aWV3ZXI6IFZpZXdlciwgZGF0YXNldEhhc1BpeGVsczogYm9vbGVhbik6IHZvaWQge1xuICAgIC8vIE5vIGltYWdlIG9mIGl0cyBvd24g4oaSIG5vdGhpbmcgZm9yIGFuIG92ZXJ2aWV3IHRvIHNob3cgZWl0aGVyLlxuICAgIHRoaXMubmF2aWdhdG9yPy5zZXRWaXNpYmxlKGRhdGFzZXRIYXNQaXhlbHMgJiYgdGhpcy5uYXZpZ2F0b3JWaXNpYmxlKTtcbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHZpZXdlci5sYXllcnMuaXRlbXMpIHtcbiAgICAgIGlmIChsYXllci5raW5kICE9PSAnaW1hZ2UnKSBjb250aW51ZTtcbiAgICAgIC8vIFRoZSB0cmFuc2NyaXB0LWRlbnNpdHkgcmFzdGVyIGlzIGFuIGltYWdlIGxheWVyIHRvbywgYnV0IGl0IGlzIGRhdGEsIG5vdCB0aGVcbiAgICAgIC8vIHRpc3N1ZTogdGhlIEltYWdlcyB0b2dnbGUgbXVzdCBub3QgdGFrZSBpdCBkb3duIHdpdGggdGhlIHNsaWRlLlxuICAgICAgaWYgKHRoaXMuc3BhdGlhbFRpbGVzTWdyPy5vd25zKGxheWVyKSkgY29udGludWU7XG4gICAgICAvLyBSZS1zaG93biB3aGVuIGEgZGF0YXNldCB0aGF0IG93bnMgYW4gaW1hZ2UgY29tZXMgYmFjaywgc28gc3dpdGNoaW5nIGJldHdlZW5cbiAgICAgIC8vIGRhdGFzZXRzIGRvZXMgbm90IGxlYXZlIHRoZSB0aXNzdWUgcGVybWFuZW50bHkgaGlkZGVuLlxuICAgICAgbGF5ZXIudmlzaWJsZSA9IGRhdGFzZXRIYXNQaXhlbHM7XG4gICAgfVxuICAgIHZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICBwcml2YXRlIGZyYW1lU3BhdGlhbFBvaW50c09uY2UoXG4gICAgdmlld2VyOiBWaWV3ZXIsIGRhdGFzZXRJZDogc3RyaW5nLCBwb3NpdGlvbnM6IEZsb2F0MzJBcnJheSwgcmVnaXN0ZXJlZDogYm9vbGVhbixcbiAgKTogdm9pZCB7XG4gICAgLy8gR2F0ZWQgb24gd2hldGhlciBUSElTIGRhdGFzZXQgcmVnaXN0ZXJzIG9udG8gYW4gaW1hZ2UsIG5vdCBvbiBgaW1hZ2VXYC9gaW1hZ2VIYDpcbiAgICAvLyB0aG9zZSBrZWVwIHRoZSBsYXN0IHBsb3R0ZWQgaW1hZ2UncyBkaW1lbnNpb25zIGFmdGVyIHRoZSBob3N0IGNsZWFycyBpdCwgc28gYVxuICAgIC8vIHN0YWxlIDUxMngzODMgcmVhZCBhcyBcInRoZXJlIGlzIGFuIGltYWdlXCIgYW5kIHNraXBwZWQgdGhlIGZyYW1pbmcgZW50aXJlbHkuXG4gICAgaWYgKHJlZ2lzdGVyZWQpIHJldHVybjtcbiAgICAvLyBPbmNlIHBlciBkYXRhc2V0LCBhcyBuYXBhcmktanMncyBgZml0M2Q6ICdvbmNlJ2AgZG9lcyBmb3IgdGhlIGNsb3VkOiByZS1jb2xvdXJpbmcsIHNsaWNpbmdcbiAgICAvLyBvciBwaWNraW5nIGEgZ2VuZSByZS1hZGRzIHRoaXMgbGF5ZXIsIGFuZCByZS1mcmFtaW5nIG9uIHRob3NlIHdvdWxkIG1vdmUgdGhlXG4gICAgLy8gY2FtZXJhIHVuZGVyIHRoZSB1c2VyIOKAlCB0aGUgY2FtZXJhIHRvb2xzIGFuZCB0aGUgY2FudmFzIGRyYWcgYXJlIG1lYW50IHRvIGJlIHRoZVxuICAgIC8vIG9ubHkgdGhpbmdzIHRoYXQgZG8uXG4gICAgaWYgKHRoaXMuc3BhdGlhbDJkRnJhbWVkPy52aWV3ZXIgPT09IHZpZXdlclxuICAgICAgJiYgdGhpcy5zcGF0aWFsMmRGcmFtZWQuZGF0YXNldElkID09PSBkYXRhc2V0SWQpIHJldHVybjtcblxuICAgIGNvbnN0IGZpdCA9IGZyYW1lUG9zaXRpb25zKFxuICAgICAgcG9zaXRpb25zLCB0aGlzLmNhbnZhcz8uY2xpZW50V2lkdGggPz8gMCwgdGhpcy5jYW52YXM/LmNsaWVudEhlaWdodCA/PyAwLFxuICAgICk7XG4gICAgLy8gTnVsbCBtZWFucyB0aGVyZSBpcyBub3RoaW5nIHRvIGZyYW1lIG9uOyBsZWF2ZSB0aGUgY2FtZXJhIHdoZXJlIGl0IGlzIHJhdGhlclxuICAgIC8vIHRoYW4gbW92aW5nIHRoZSB2aWV3IGZvciBhIGRhdGFzZXQgd2UgY2Fubm90IGZpdC5cbiAgICBpZiAoIWZpdCkgcmV0dXJuO1xuICAgIHZpZXdlci5jYW1lcmEuc2V0KGZpdC5jZW50ZXIsIGZpdC56b29tID8/IHZpZXdlci5jYW1lcmEuem9vbSk7XG4gICAgdGhpcy5zcGF0aWFsMmRGcmFtZWQgPSB7IHZpZXdlciwgZGF0YXNldElkIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlICoqZ2VuZSBtYXAqKjogdGhlIGFjdGl2ZSBnZW5lJ3MgZXhwcmVzc2lvbiBhcyBhIGNvbnRpbnVvdXMgZmllbGQgZHJhd24gdW5kZXJcbiAgICogdGhlIGNlbGxzLlxuICAgKlxuICAgKiBBIHNjYXR0ZXIgY29sb3VyZWQgYnkgYSBnZW5lIHNheXMgd2hpY2ggY2VsbHMgZXhwcmVzcyBpdDsgaXQgY2Fubm90IHNheSB3aGVyZSxcbiAgICogYmVjYXVzZSB0aGUgZXllIHdpbGwgbm90IGludGVncmF0ZSB0aG91c2FuZHMgb2YgZG90cyBpbnRvIGEgdGVycml0b3J5LiBUaGUgZmllbGRcbiAgICogaXMgYSBrZXJuZWwtd2VpZ2h0ZWQgTUVBTiBwZXIgY2VsbCAoc2VlIGBzcGF0aWFsLWV4cHJlc3Npb24udHNgKSwgc28gYSBkZW5zZVxuICAgKiByZWdpb24gZG9lcyBub3QgZ2xvdyBtZXJlbHkgZm9yIGJlaW5nIGRlbnNlLCBhbmQgaXQgaXMgdHJhbnNwYXJlbnQgd2hlcmV2ZXIgbm9cbiAgICogY2VsbCB3YXMgbWVhc3VyZWQg4oCUIGFuIHVuc2FtcGxlZCBnYXAgbXVzdCBub3QgcmVhZCBhcyBcIm5vdCBleHByZXNzZWRcIi5cbiAgICpcbiAgICogSXQgc2hhcmVzIHRoZSBwb2ludHMnIExVVCwgcGVyY2VudGlsZSB3aW5kb3cgYW5kIGxvZyBmbGFnLCBzbyB0aGUgbGF5ZXIgdW5kZXJcbiAgICogdGhlIGNlbGxzIGFuZCB0aGUgY2VsbHMgdGhlbXNlbHZlcyBjYW5ub3QgZGlzYWdyZWUgYWJvdXQgd2hhdCBhIGNvbG91ciBtZWFucy5cbiAgICpcbiAgICogRXN0aW1hdGVkIG9uIHRoZSBESVNQTEFZRUQgaW1hZ2UncyBwaXhlbCBncmlkLCBjb2Fyc2VuZWQgc28gdGhlIGxvbmcgc2lkZSBpcyBhdFxuICAgKiBtb3N0IHtAbGluayBHRU5FX01BUF9NQVhfU0lERX06IGEgc21vb3RoIGZpZWxkIGdhaW5zIG5vdGhpbmcgZnJvbSBhIHNsaWRlJ3MgZnVsbFxuICAgKiByZXNvbHV0aW9uLiBGb3IgYSB2b2x1bWUtYmFja2VkIGRhdGFzZXQgdGhhdCBncmlkIGlzIHRoZSBjdXJyZW50IHNsaWNlLCBhbmQgb25seVxuICAgKiB0aGF0IHBsYW5lJ3Mgb2JzZXJ2YXRpb25zIGFyZSBpbmNsdWRlZCDigJQgdGhlIHNhbWUgcnVsZSB0aGUgbWFya2VycyBmb2xsb3cuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZUdlbmVNYXAoXG4gICAgdmlld2VyOiBWaWV3ZXIsIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gICAgc2xhYjogeyByZWY6IFNwYXRpYWxJbWFnZVJlZjsgaW5kaWNlczogVWludDMyQXJyYXk7IHNsaWNlOiBudW1iZXIgfSB8IG51bGwsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGdlbmUgPSB2aWV3LmdlbmVNYXAgJiYgdmlldy5jb2xvckJ5Py5raW5kID09PSAnZmVhdHVyZScgPyB2aWV3LmNvbG9yQnkubmFtZSA6IG51bGw7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc3BhdGlhbERhdGE7XG4gICAgY29uc3Qgc21vb3RoaW5nID0gdmlldy5nZW5lTWFwU21vb3RoaW5nID4gMCA/IHZpZXcuZ2VuZU1hcFNtb290aGluZyA6IDE7XG4gICAgY29uc3QgY2xpcCA9IHZpZXcucGVyY2VudGlsZUNsaXAgPz8gWzAuMDEsIDAuOTldO1xuXG4gICAgLy8gVHdvIGNsb2NrczogdGhlIEZJRUxEIGRlcGVuZHMgb24gdGhlIGdlbmUsIHRoZSBwbGFuZSBhbmQgdGhlIGJhbmR3aWR0aCwgd2hpbGVcbiAgICAvLyB0aGUgY29sb3VycyBkZXBlbmQgb24gdGhlIHdpbmRvdywgdGhlIGxvZyBmbGFnIGFuZCB0aGUgb3BhY2l0eS4gUmVjb2xvdXJpbmcgYVxuICAgIC8vIGNhY2hlZCBmaWVsZCBpcyBhIGZyYWN0aW9uIG9mIGVzdGltYXRpbmcgb25lLlxuICAgIGNvbnN0IGZpZWxkS2V5ID0gZ2VuZVxuICAgICAgPyBbZGF0YXNldC5pZCwgZ2VuZSwgc2xhYj8uc2xpY2UgPz8gJycsIHNtb290aGluZywgdGhpcy5zZWxlY3Rpb25SZXYoc2VsZWN0aW9uKV0uam9pbignfCcpXG4gICAgICA6IG51bGw7XG4gICAgY29uc3Qga2V5ID0gZmllbGRLZXlcbiAgICAgID8gW1xuICAgICAgICBmaWVsZEtleSwgY2xpcC5qb2luKCcsJyksIHZpZXcubG9nU2NhbGUgPyAnbG9nJyA6ICdsaW4nLCB2aWV3LmdlbmVNYXBPcGFjaXR5LFxuICAgICAgICB0aGlzLmNvbnRpbnVvdXNDb2xvcm1hcEtleSh2aWV3KSxcbiAgICAgIF0uam9pbignfCcpXG4gICAgICA6IG51bGw7XG4gICAgaWYgKGtleSA9PT0gdGhpcy5nZW5lTWFwS2V5KSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5nZW5lTWFwTGF5ZXIpIHtcbiAgICAgIHZpZXdlci5sYXllcnMucmVtb3ZlKHRoaXMuZ2VuZU1hcExheWVyKTtcbiAgICAgIHRoaXMuZ2VuZU1hcExheWVyID0gbnVsbDtcbiAgICB9XG4gICAgLy8gQU5ZIGNoYW5nZSBoZXJlIGNoYW5nZXMgdGhlIG9yZGVyIHRoZSBjZWxscyBoYXZlIHRvIHNpdCBhYm92ZSDigJQgaW5jbHVkaW5nIHRoZVxuICAgIC8vIGZpcnN0IG9uZSwgd2hlcmUgdGhlcmUgaXMgbm8gcHJldmlvdXMgbGF5ZXIgdG8gcmVtb3ZlIOKAlCBhbmQgdGhlIGxheWVyIGxpc3QgaXNcbiAgICAvLyBhcHBlbmQtb25seS4gU28gZHJvcCB0aGUgbWFya2VycyB1bmNvbmRpdGlvbmFsbHkgYW5kIGxldCB0aGUgcmVidWlsZCBiZWxvdyBwdXRcbiAgICAvLyB0aGVtIGJhY2sgb24gdG9wOyBvdGhlcndpc2UgdGhlIGZpZWxkIGlzIGFwcGVuZGVkIG92ZXIgdGhlIG1lYXN1cmVtZW50LlxuICAgIGlmICh0aGlzLnNwYXRpYWxQb2ludHMpIHtcbiAgICAgIHZpZXdlci5sYXllcnMucmVtb3ZlKHRoaXMuc3BhdGlhbFBvaW50cyk7XG4gICAgICB0aGlzLnNwYXRpYWxQb2ludHMgPSBudWxsO1xuICAgICAgdGhpcy5zcGF0aWFsTGF5ZXJLZXkgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmdlbmVNYXBLZXkgPSBrZXk7XG4gICAgaWYgKCFrZXkgfHwgIWdlbmUgfHwgIXBvcnQpIHtcbiAgICAgIHRoaXMuZ2VuZU1hcEZpZWxkID0gbnVsbDtcbiAgICAgIHRoaXMuZ2VuZU1hcEZpZWxkS2V5ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUaGUgcmFzdGVyIGNvdmVycyB0aGUgZGlzcGxheWVkIGltYWdlOyB3aXRob3V0IG9uZSB0aGVyZSBpcyBub3RoaW5nIHRvXG4gICAgLy8gb3ZlcmxheSBhbmQgdGhlIGNsb3VkIGlzIHRoZSAzRCBtb2RlJ3MgYnVzaW5lc3MsIG5vdCB0aGlzIG9uZSdzLlxuICAgIGNvbnN0IGltYWdlVyA9IHNsYWIgPyBkYXRhc2V0LnZvbHVtZSEud2lkdGggOiB0aGlzLmltYWdlVztcbiAgICBjb25zdCBpbWFnZUggPSBzbGFiID8gZGF0YXNldC52b2x1bWUhLmhlaWdodCA6IHRoaXMuaW1hZ2VIO1xuICAgIGlmICghaW1hZ2VXIHx8ICFpbWFnZUgpIHJldHVybjtcbiAgICBjb25zdCBzdGVwID0gTWF0aC5tYXgoXG4gICAgICAxLFxuICAgICAgTWF0aC5jZWlsKE1hdGgubWF4KGltYWdlVywgaW1hZ2VIKSAvIE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLkdFTkVfTUFQX01BWF9TSURFKSxcbiAgICApO1xuXG4gICAgaWYgKGZpZWxkS2V5ICE9PSB0aGlzLmdlbmVNYXBGaWVsZEtleSkge1xuICAgICAgbGV0IHZhbHVlczogRmxvYXQzMkFycmF5O1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFsdWVzID0gYXdhaXQgcG9ydC5nZXRGZWF0dXJlVmVjdG9yKGdlbmUpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgW25hcGFyaS1qc10gZ2VuZSBtYXA6IFwiJHtnZW5lfVwiIHVuYXZhaWxhYmxlYCwgZXJyKTtcbiAgICAgICAgdGhpcy5nZW5lTWFwS2V5ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMudmlld2VyICE9PSB2aWV3ZXIgfHwgdGhpcy5nZW5lTWFwS2V5ICE9PSBrZXkpIHJldHVybjtcbiAgICAgIGNvbnN0IGluU2VsZWN0aW9uID0gc2VsZWN0aW9uLmNvdW50ID4gMCA/IG1hc2tUb0luZGljZXMoc2VsZWN0aW9uLm1hc2spIDogdW5kZWZpbmVkO1xuICAgICAgdGhpcy5nZW5lTWFwRmllbGQgPSBleHByZXNzaW9uRmllbGQoZGF0YXNldC5vYnNlcnZhdGlvbnMsIHtcbiAgICAgICAgcmVmOiBzbGFiPy5yZWYgPz8gZGF0YXNldC5pbWFnZVJlZixcbiAgICAgICAgd2lkdGg6IE1hdGguY2VpbChpbWFnZVcgLyBzdGVwKSxcbiAgICAgICAgaGVpZ2h0OiBNYXRoLmNlaWwoaW1hZ2VIIC8gc3RlcCksXG4gICAgICAgIHN0ZXAsXG4gICAgICAgIHNpZ21hOiBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5HRU5FX01BUF9TSUdNQSAqIHNtb290aGluZyxcbiAgICAgICAgdmFsdWVzLFxuICAgICAgICAvLyBBIHBsYW5lIHdpbnMgb3ZlciBhIHNlbGVjdGlvbjogdGhlIDJEIHZpZXcgaXMgc2hvd2luZyBvbmUgc2VjdGlvbiwgc28gYVxuICAgICAgICAvLyBmaWVsZCBzcGFubmluZyB0aGUgc3BlY2ltZW4ncyBkZXB0aCB3b3VsZCBub3QgYmUgdGhlIHRoaW5nIG9uIHNjcmVlbi5cbiAgICAgICAgaW5kaWNlczogc2xhYj8uaW5kaWNlcyA/PyBpblNlbGVjdGlvbixcbiAgICAgIH0pO1xuICAgICAgdGhpcy5nZW5lTWFwRmllbGRLZXkgPSBmaWVsZEtleTtcbiAgICB9XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmdlbmVNYXBGaWVsZDtcbiAgICBpZiAoIWZpZWxkKSByZXR1cm47XG5cbiAgICBjb25zdCBub2RlID0gdGhpcy5jdXJyZW50Q29sb3JtYXAgYXMgeyBkYXRhPzogeyB2YWx1ZT86IHVua25vd24gfSB9IHwgbnVsbDtcbiAgICBjb25zdCBsdXQgPSBzcGF0aWFsQ29udGludW91c0x1dChcbiAgICAgIG5vZGU/LmRhdGE/LnZhbHVlLCB0aGlzLmN1cnJlbnRSZXZlcnNlLCB2aWV3LmNvbnRpbnVvdXNDb2xvcm1hcCxcbiAgICApO1xuICAgIGNvbnN0IFtsbywgaGldID0gY29udHJhc3RXaW5kb3coZmllbGQubWVhbiwgY2xpcFswXSwgY2xpcFsxXSk7XG4gICAgY29uc3QgcmdiYSA9IGNvbG9yRXhwcmVzc2lvbkZpZWxkKGZpZWxkLCBsdXQsIFtsbywgaGldLCB7XG4gICAgICBsb2c6IHZpZXcubG9nU2NhbGUsXG4gICAgICAvLyBUaGUgTUFQJ3Mgb3duIG9wYWNpdHk6IHJlYWRpbmcgYSBmaWVsZCB1bmRlciB0aGUgY2VsbHMgbWVhbnMgdHVybmluZyB0aGVcbiAgICAgIC8vIGNlbGxzIGRvd24sIHdoaWNoIG11c3Qgbm90IHRha2UgdGhlIGZpZWxkIHdpdGggdGhlbS5cbiAgICAgIG9wYWNpdHk6IHZpZXcuZ2VuZU1hcE9wYWNpdHksXG4gICAgfSk7XG4gICAgdGhpcy5nZW5lTWFwTGF5ZXIgPSB2aWV3ZXIuYWRkSW1hZ2UoXG4gICAgICB7IGtpbmQ6ICd0eXBlZCcsIHdpZHRoOiBmaWVsZC53aWR0aCwgaGVpZ2h0OiBmaWVsZC5oZWlnaHQsIGNoYW5uZWxzOiA0LCBkdHlwZTogJ3VpbnQ4JywgZGF0YTogcmdiYSB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiBgZ2VuZSBtYXAgwrcgJHtnZW5lfWAsXG4gICAgICAgIHNjYWxlOiBbc3RlcCwgc3RlcF0sXG4gICAgICAgIHRyYW5zbGF0ZTogWzAsIDBdLFxuICAgICAgICBibGVuZGluZzogJ3RyYW5zbHVjZW50JyxcbiAgICAgIH0sXG4gICAgKTtcbiAgICB2aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwbGFuZSBhIHZvbHVtZS1iYWNrZWQgZGF0YXNldCBpcyBjdXJyZW50bHkgc2hvd2luZzogaXRzIHBpeGVsIGFmZmluZSwgdGhlXG4gICAqIG9ic2VydmF0aW9ucyB0aGF0IGZhbGwgaW4gaXQsIGFuZCB0aGUgbWFya2VyIGZsb29yIHRoYXQgZ3JpZCBuZWVkcy5cbiAgICpcbiAgICogTnVsbCBmb3IgYSBkYXRhc2V0IHdpdGggYSByZWFsIGBpbWFnZVJlZmAgKGl0cyBjb29yZGluYXRlcyBhcmUgYWxyZWFkeSB0aGVcbiAgICogaW1hZ2UncyBwaXhlbHMgYW5kIGV2ZXJ5IG9ic2VydmF0aW9uIGJlbG9uZ3MgdG8gdGhlIG9uZSBzZWN0aW9uKSBhbmQgZm9yIG9uZVxuICAgKiB3aXRoIG5vIHZvbHVtZSBhdCBhbGwg4oCUIGJvdGggb2Ygd2hpY2ggZHJhdyBleGFjdGx5IGFzIGJlZm9yZS5cbiAgICovXG4gIHByaXZhdGUgc3BhdGlhbFNsYWIoZGF0YXNldDogU3BhdGlhbERhdGFzZXQpOiB7XG4gICAgcmVmOiBTcGF0aWFsSW1hZ2VSZWY7IGluZGljZXM6IFVpbnQzMkFycmF5OyBzbGljZTogbnVtYmVyOyBtaW5EaWFtZXRlcjogbnVtYmVyO1xuICB9IHwgbnVsbCB7XG4gICAgY29uc3Qgdm9sdW1lID0gZGF0YXNldC52b2x1bWU7XG4gICAgaWYgKGRhdGFzZXQuaW1hZ2VSZWYgfHwgIXZvbHVtZSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgc2xpY2UgPSB0aGlzLmxvYWRlZD8ueiA/PyAwO1xuICAgIHJldHVybiB7XG4gICAgICByZWY6IHZvbHVtZUltYWdlUmVmKHZvbHVtZSwgZGF0YXNldC5taWNyb25zUGVyVW5pdCksXG4gICAgICBpbmRpY2VzOiBvYnNlcnZhdGlvbnNJblNsaWNlKGRhdGFzZXQub2JzZXJ2YXRpb25zLCB2b2x1bWUsIHNsaWNlKSxcbiAgICAgIHNsaWNlLFxuICAgICAgbWluRGlhbWV0ZXI6IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLlNQQVRJQUxfU0xJQ0VfTUlOX0RJQU1FVEVSX1BYICogdm9sdW1lLnZveGVsU2l6ZVswXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFBlci1wb2ludCBjb2xvdXJzIGZvciB0aGUgZHJhd24gc3Vic2V0LiBBIGJyb2FkY2FzdCB0dXBsZSBzdGF5cyBicm9hZGNhc3Qg4oCUXG4gICAqICBpdCBpcyBvbmUgY29sb3VyIGZvciBldmVyeSBwb2ludCBlaXRoZXIgd2F5LiAqL1xuICBwcml2YXRlIGdhdGhlckNvbG9yczxUPihjb2xvcnM6IFRbXSB8IFQsIGluZGljZXM/OiBVaW50MzJBcnJheSk6IFRbXSB8IFQge1xuICAgIGlmICghaW5kaWNlcyB8fCAhQXJyYXkuaXNBcnJheShjb2xvcnMpKSByZXR1cm4gY29sb3JzO1xuICAgIGNvbnN0IG91dDogVFtdID0gbmV3IEFycmF5KGluZGljZXMubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpKyspIG91dFtpXSA9IGNvbG9yc1tpbmRpY2VzW2ldXTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZHJhdyB0aGUgb2JzZXJ2YXRpb24gbWFya2VycyBvdmVyIGEgZnJlc2hseSByZW5kZXJlZCBpbWFnZS5cbiAgICpcbiAgICogVHdvIHJlYXNvbnMsIGJvdGggaW52aXNpYmxlIGZyb20gdGhlIHNwYXRpYWwgc3RvcmUg4oCUIHdoaWNoIGlzIHdoeSBhIHNjcnViIG9yIGFcbiAgICogcmUtcmVuZGVyIG5ldmVyIHJlYWNoZWQgdGhlIG1hcmtlcnMgb24gaXRzIG93bjpcbiAgICogIC0gdGhlIGltYWdlIHJlbmRlciBDTEVBUlMgdGhlIGxheWVyIGxpc3QsIHRha2luZyB0aGUgbWFya2VycyB3aXRoIGl0O1xuICAgKiAgLSBvdmVyIGEgdm9sdW1lLWJhY2tlZCBkYXRhc2V0IHRoZSBkaXNwbGF5ZWQgcGxhbmUgZGVjaWRlcyB3aGljaFxuICAgKiAgICBvYnNlcnZhdGlvbnMgYmVsb25nIG9uIHNjcmVlbiBhdCBhbGwsIHNvIHRoZSBjZWxscyBoYXZlIHRvIG1vdmUgd2l0aCB0aGVcbiAgICogICAgc2VjdGlvbiByYXRoZXIgdGhhbiBoYW5nIG92ZXIgYSBkaWZmZXJlbnQgb25lLlxuICAgKlxuICAgKiBVc2VzIHRoZSBsYXRlc3QgdmFsdWVzIHRoZSBtYXJrZXIgc3Vic2NyaXB0aW9uIHNhdzsgYSBuby1vcCB1bnRpbCBpdCBoYXMgc2VlblxuICAgKiBhbnksIGluIHRoZSAzRCBjbG91ZCAobm8gaW1hZ2UsIG5vIHBsYW5lKSwgYW5kIHdpdGggbm8gZGF0YXNldCB0byBkcmF3LlxuICAgKi9cbiAgcHJpdmF0ZSByZWRyYXdTcGF0aWFsTWFya2VycygpOiB2b2lkIHtcbiAgICBjb25zdCBsYXRlc3QgPSB0aGlzLnNwYXRpYWxMYXRlc3Q7XG4gICAgaWYgKCFsYXRlc3Q/LlswXSB8fCBpc1NwYXRpYWxPbWljczNkKHRoaXMuY3VycmVudFBsb3RUeXBlKSkgcmV0dXJuO1xuICAgIHZvaWQgdGhpcy5yZWJ1aWxkU3BhdGlhbFBvaW50cyguLi5sYXRlc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdW50IHRoZSBTUEFUSUFMX09NSUNTXzNEIHZpZXc6IG9ic2VydmF0aW9ucyBhcyBhIDNEIHBvaW50IGNsb3VkIHVuZGVyIHRoZSBvcmJpdCBjYW1lcmEuXG4gICAqXG4gICAqIERlbGliZXJhdGVseSBtdWNoIHRoaW5uZXIgdGhhbiB0aGUgMkQgbW91bnQuIFRoZXJlIGlzIG5vIHRpc3N1ZSBpbWFnZSB0byByZW5kZXIgKGEgcmVnaXN0ZXJlZFxuICAgKiB2b2x1bWUgbGlrZSB0aGUgQWxsZW4gQ0NGIGhhcyBubyBzaW5nbGUgcmVmZXJlbmNlIHBsYW5lKSwgc28gbm8gc2NhbGUgYmFyLCBubyByZWFkYmFjaywgYW5kIG5vXG4gICAqIDJEIGludGVyYWN0aW9uIHN0YWNrIOKAlCB0aGUgcmVnaW9uIHRvb2xzIGRyYXcgaW4gc2NyZWVuIHNwYWNlIGFuZCBoYXZlIG5vIG1lYW5pbmcgYWdhaW5zdCBhblxuICAgKiBvcmJpdGluZyBjYW1lcmEsIHdoaWNoIGlzIHdoeSBgU2VsZWN0IGZyb20gUk9Jc2AgaXMgaGlkZGVuIGluIHRoaXMgbW9kZS4gYGFkZFBvaW50czNEYCBwdXRzXG4gICAqIHRoZSB2aWV3ZXIgaW4gM0QgYW5kIGZyYW1lcyB0aGUgY2FtZXJhIG9uIHRoZSBjbG91ZCBpdHNlbGYuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG1vdW50U3BhdGlhbE9taWNzM2Qodmlld2VyOiBWaWV3ZXIsIGhvc3Q6IEhUTUxFbGVtZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5pbnN0YWxsM2RJbnRlcmFjdGlvbih2aWV3ZXIsIGhvc3QpO1xuICAgIHRoaXMuaW5zdGFsbFNwYXRpYWxIb3Zlcihob3N0KTtcbiAgICB0aGlzLnN1YnNjcmliZVNwYXRpYWwoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTY2FsZSBiYXIgZm9yIHRoZSAzRCBjbG91ZCwgbWVhc3VyZWQgYXQgdGhlIE9SQklUIFBJVk9ULlxuICAgKlxuICAgKiBBIHBlcnNwZWN0aXZlIGNhbWVyYSBoYXMgbm8gc2luZ2xlIHNjYWxlIOKAlCB0aGluZ3MgZmFydGhlciBhd2F5IGFyZSBzbWFsbGVyIOKAlCBzbyBhIGJhciBjYW5cbiAgICogb25seSBiZSB0cnVlIGF0IG9uZSBkZXB0aC4gVGhlIHBpdm90IGlzIHRoZSBob25lc3QgY2hvaWNlOiBpdCBpcyB3aGF0IHRoZSBjYW1lcmEgaXMgZnJhbWluZyxcbiAgICogd2hhdCBhIHpvb20gbW92ZXMgdG93YXJkcywgYW5kIHdoZXJlIHRoZSBleWUgaXMgYW55d2F5LiBuYXBhcmkncyBvd24gM0Qgc2NhbGUgYmFyIHdvcmtzIHRoZVxuICAgKiBzYW1lIHdheS5cbiAgICpcbiAgICogYE5hcGFyaVNjYWxlQmFyYCBuZWVkcyBDU1MgcHggcGVyIHdvcmxkIHVuaXQsIHdoaWNoIGFuIG9yYml0IGNhbWVyYSBkb2VzIG5vdCBleHBvc2UsIGJ1dCBhdFxuICAgKiB0aGUgcGl2b3QgaXQgaXMgZXhhY3RseSBgdmlld3BvcnRIZWlnaHQgLyAoMiAqIGRpc3RhbmNlICogdGFuKGZvdiAvIDIpKWAg4oCUIHRoZSBzYW1lXG4gICAqIHJlbGF0aW9uc2hpcCBgQ2FtZXJhM0QucGFuYCB1c2VzIHRvIHRyYWNrIHRoZSBjdXJzb3IuIFRoZSBiYXIgdGhlbiBjb252ZXJ0cyB0aHJvdWdoXG4gICAqIGBtaWNyb25zUGVyVW5pdGAsIGFuZCBkcmF3cyBub3RoaW5nIGF0IGFsbCB3aGVuIHRoZSBkYXRhc2V0IGRvZXMgbm90IGRlY2xhcmUgb25lLCBiZWNhdXNlIGFcbiAgICogYmFyIGxhYmVsbGVkIGluIG1pY3JvbnMgb3ZlciB1bmtub3duIHVuaXRzIHdvdWxkIHJlYWQgYXMgYSBtZWFzdXJlbWVudC5cbiAgICovXG4gIHByaXZhdGUgaW5zdGFsbFNwYXRpYWwzZFNjYWxlQmFyKHZpZXdlcjogVmlld2VyLCBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnNjYWxlQmFyPy5kZXN0cm95KCk7XG4gICAgdGhpcy5zY2FsZUJhciA9IG51bGw7XG4gICAgdGhpcy5uYXZpZ2F0b3I/LmRlc3Ryb3koKTtcbiAgICB0aGlzLm5hdmlnYXRvciA9IG51bGw7XG4gICAgY29uc3QgbWljcm9uc1BlclVuaXQgPSBkYXRhc2V0Py5taWNyb25zUGVyVW5pdDtcbiAgICBpZiAoIXRoaXMuaG9zdCB8fCAhbWljcm9uc1BlclVuaXQgfHwgbWljcm9uc1BlclVuaXQgPD0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY2FudmFzID0gdGhpcy5jYW52YXM7XG4gICAgY29uc3QgY2FtID0gdmlld2VyLmNhbWVyYTNkO1xuICAgIGNvbnN0IHNoaW06IFNjYWxlQmFyQ2FtZXJhID0ge1xuICAgICAgZ2V0IHpvb20oKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgaCA9IGNhbnZhcz8uY2xpZW50SGVpZ2h0IHx8IGNhbnZhcz8uaGVpZ2h0IHx8IDA7XG4gICAgICAgIGNvbnN0IHdvcmxkUGVyUHggPSAoMiAqIGNhbS5kaXN0YW5jZSAqIE1hdGgudGFuKGNhbS5mb3YgLyAyKSkgLyAoaCB8fCAxKTtcbiAgICAgICAgcmV0dXJuIHdvcmxkUGVyUHggPiAwID8gMSAvIHdvcmxkUGVyUHggOiAwO1xuICAgICAgfSxcbiAgICAgIGNoYW5nZWQ6IGNhbS5jaGFuZ2VkLFxuICAgIH07XG4gICAgdGhpcy5zY2FsZUJhciA9IG5ldyBOYXBhcmlTY2FsZUJhcih0aGlzLmhvc3QsIHNoaW0sIG1pY3JvbnNQZXJVbml0KTtcbiAgfVxuXG4gIC8qKiBCYXNlIG1hcmtlciBkaWFtZXRlciBmb3IgdGhlIDNEIGNsb3VkLCBpbiBTQ1JFRU4gcGl4ZWxzICh0aGUgbGF5ZXIncyB1bml0KS4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU1BBVElBTF8zRF9CQVNFX1NJWkUgPSAzO1xuXG4gIC8qKiAoUmUpYnVpbGQgdGhlIDNEIHBvaW50IGNsb3VkIGZvciB0aGUgY3VycmVudCBkYXRhc2V0ICsgdmlldyBzdGF0ZS4gKi9cbiAgcHJpdmF0ZSBhc3luYyByZWJ1aWxkU3BhdGlhbFBvaW50czNkKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrID0gZW1wdHlTZWxlY3Rpb24oKSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgdmlld2VyID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2aWV3ZXIpIHJldHVybjtcbiAgICBjb25zdCB0b2tlbiA9ICsrdGhpcy5zcGF0aWFsUmVidWlsZFRva2VuO1xuXG4gICAgLy8gUmVzb2x2ZSB0aGUgc2NhbGFyIGVuY29kaW5nIEJFRk9SRSB0b3VjaGluZyB0aGUgc2NlbmUsIGZvciB0aGUgc2FtZSByZWFzb25cbiAgICAvLyB0aGUgMkQgcGF0aCBkb2VzOiBhIGdlbmUgZmV0Y2ggY2FuIGZhaWwgb3IgYmUgc3VwZXJzZWRlZCwgYW5kIGRyb3BwaW5nIHRoZVxuICAgIC8vIGxheWVyIGZpcnN0IHdvdWxkIGJsYW5rIHRoZSB2aWV3LlxuICAgIGxldCBlbmM6IFNwYXRpYWwzZEVuY29kaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKGRhdGFzZXQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGVuYyA9IGF3YWl0IHRoaXMuc3BhdGlhbFNjYWxhcjNkKGRhdGFzZXQsIHZpZXcpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gc3BhdGlhbCAzRCBjb2xvdXJpbmcgZmFpbGVkIOKAlCBmYWxsaW5nIGJhY2sgdG8gYSBmbGF0IGNvbG91cicsIGVycik7XG4gICAgICAgIGVuYyA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0b2tlbiAhPT0gdGhpcy5zcGF0aWFsUmVidWlsZFRva2VuIHx8IHRoaXMudmlld2VyICE9PSB2aWV3ZXIpIHJldHVybjtcblxuICAgIGNvbnN0IG9icyA9IGRhdGFzZXQ/Lm9ic2VydmF0aW9ucztcbiAgICAvLyBObyB6IG1lYW5zIG5vdGhpbmcgdG8gZHJhdyBpbiAzRC4gVGhlIHBsb3QgdHlwZSBpcyBnYXRlZCBvbiBgcmVxdWlyZXNTcGF0aWFsM2RgXG4gICAgLy8gc28gdGhpcyBzaG91bGQgYmUgdW5yZWFjaGFibGUgZnJvbSB0aGUgVUksIGJ1dCBhIGhvc3QgY2FuIHNldCB0aGUgdHlwZSBkaXJlY3RseS5cbiAgICBpZiAoIWRhdGFzZXQgfHwgIW9icyB8fCBvYnMuY291bnQgPT09IDAgfHwgIW9icy56KSB7XG4gICAgICB0aGlzLnJlbW92ZVNwYXRpYWwzZExheWVycyh2aWV3ZXIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFuYXRvbXkgZmlyc3Q6IG9uIGEgc2NlbmUncyBGSVJTVCBsYXllciBuYXBhcmkgZnJhbWVzIHRoZSBvcmJpdCBjYW1lcmEsIGFuZFxuICAgIC8vIHRoZSByZWZlcmVuY2Ugdm9sdW1lIGlzIHRoZSBmcmFtaW5nIHdlIHdhbnQg4oCUIHRoZSBicmFpbiwgbm90IHRoZSBvdXRlcm1vc3RcbiAgICAvLyBzdHJheSBzZWdtZW50YXRpb24uIEV2ZXJ5IGxhdGVyIGFkZCBrZWVwcyB0aGUgcG9zZSBpbnN0ZWFkIChuYXBhcmktanMgYGZpdDNkOiAnb25jZSdgKS5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZVNwYXRpYWxWb2x1bWUodmlld2VyLCBkYXRhc2V0LCB2aWV3KTtcbiAgICBpZiAodG9rZW4gIT09IHRoaXMuc3BhdGlhbFJlYnVpbGRUb2tlbiB8fCB0aGlzLnZpZXdlciAhPT0gdmlld2VyKSByZXR1cm47XG4gICAgLy8gVGhlbiB0aGUgY2x1c3RlciBkZW5zaXR5IHZvbHVtZXMsIHdoaWNoIGNhbiBzZXQgdGhlIGNlbnRyaW5nIG9mZnNldCB3aGVuXG4gICAgLy8gdGhlcmUgaXMgbm8gcmVmZXJlbmNlIHZvbHVtZSDigJQgc28gYmVmb3JlIGFueSBwb3NpdGlvbiBpcyBjb21wdXRlZCBmcm9tIGl0LlxuICAgIGF3YWl0IHRoaXMuZW5zdXJlRGVuc2l0eVZvbHVtZXModmlld2VyLCBkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24pO1xuICAgIGlmICh0b2tlbiAhPT0gdGhpcy5zcGF0aWFsUmVidWlsZFRva2VuIHx8IHRoaXMudmlld2VyICE9PSB2aWV3ZXIpIHJldHVybjtcbiAgICAvLyBUaGVuIHRoZSBnZW5lIG1hcCwgd2hpY2ggc2hhcmVzIHRoZSByZWZlcmVuY2Ugdm9sdW1lJ3MgbGF0dGljZSDigJQgc28gaXQgZ29lc1xuICAgIC8vIGFmdGVyIGFueXRoaW5nIHRoYXQgY2FuIHN0aWxsIG1vdmUgdGhlIGNlbnRyaW5nIG9mZnNldC5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZUdlbmVNYXBWb2x1bWUodmlld2VyLCBkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24pO1xuICAgIGlmICh0b2tlbiAhPT0gdGhpcy5zcGF0aWFsUmVidWlsZFRva2VuIHx8IHRoaXMudmlld2VyICE9PSB2aWV3ZXIpIHJldHVybjtcbiAgICAvLyBTY2FsZSBkZXBlbmRzIG9uIHRoZSBkYXRhc2V0J3MgZGVjbGFyZWQgdW5pdCwgc28gaXQgd2FpdHMgZm9yIHRoZSBkYXRhc2V0XG4gICAgLy8gcmF0aGVyIHRoYW4gYmVpbmcgc2V0IHVwIGF0IG1vdW50IHRpbWUuXG4gICAgaWYgKGRhdGFzZXQuaWQgIT09IHRoaXMuc3BhdGlhbFNjYWxlQmFyS2V5KSB7XG4gICAgICB0aGlzLnNwYXRpYWxTY2FsZUJhcktleSA9IGRhdGFzZXQuaWQ7XG4gICAgICB0aGlzLmluc3RhbGxTcGF0aWFsM2RTY2FsZUJhcih2aWV3ZXIsIGRhdGFzZXQpO1xuICAgIH1cblxuICAgIC8vIFRoZSByZWZlcmVuY2Ugdm9sdW1lIGlzIGhpZGRlbiwgbm90IHJlbW92ZWQ6IGl0IGFsc28gZml4ZXMgdGhlIGNlbnRyaW5nXG4gICAgLy8gb2Zmc2V0IGV2ZXJ5IHBvc2l0aW9uIGlzIGNvbXB1dGVkIGZyb20sIGFuZCByZS1mZXRjaGluZyBhIDEwMCBNQiB0ZW1wbGF0ZVxuICAgIC8vIHRvIHVuLWhpZGUgaXQgd291bGQgbWFrZSBhIGNoZWNrYm94IGZlZWwgbGlrZSBhIGxvYWQuXG4gICAgaWYgKHRoaXMuc3BhdGlhbFZvbHVtZSkge1xuICAgICAgdGhpcy5zcGF0aWFsVm9sdW1lLnZpc2libGUgPSB2aWV3LnNob3dWb2x1bWU7XG4gICAgICB0aGlzLnNwYXRpYWxWb2x1bWUub3BhY2l0eSA9IHZpZXcudm9sdW1lT3BhY2l0eTtcbiAgICB9XG5cbiAgICBjb25zdCBzY2FsZSA9IHZpZXcucG9pbnRTY2FsZSA+IDAgPyB2aWV3LnBvaW50U2NhbGUgOiAxO1xuICAgIGNvbnN0IHNpemUgPSBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5TUEFUSUFMXzNEX0JBU0VfU0laRSAqIHNjYWxlO1xuICAgIGNvbnN0IHNjYWxhcnMgPSBlbmM/LnZhbHVlcyA/PyBuZXcgRmxvYXQzMkFycmF5KG9icy5jb3VudCk7XG4gICAgY29uc3QgY29sb3JtYXAgPSBlbmM/LmNvbG9ybWFwID8/IHRoaXMuc3BhdGlhbEZsYXRDb2xvcm1hcCgpO1xuICAgIGNvbnN0IGNvbnRyYXN0TGltaXRzOiBbbnVtYmVyLCBudW1iZXJdID0gZW5jPy5jb250cmFzdExpbWl0cyA/PyBbMCwgMV07XG5cbiAgICAvLyBPbmUgaW1hZ2VkIHNlY3Rpb24sIG9yIHRoZSB3aG9sZSBzdGFjay4gVGhlIHN1YnNldCBJUyB0aGUgZ2VvbWV0cnksIHNvIGl0XG4gICAgLy8gYmVsb25ncyBpbiB0aGUgZ2VvbWV0cnkga2V5IHJhdGhlciB0aGFuIGJlaW5nIHJlLWRlcml2ZWQgcGVyIGZyYW1lIOKAlCBhbmQgYW5cbiAgICAvLyBvdXQtb2YtcmFuZ2UgaW5kZXggaXMgY2xhbXBlZCByYXRoZXIgdGhhbiBkcm9wcGluZyB0aGUgY2xvdWQsIGJlY2F1c2UgdGhlXG4gICAgLy8gc2VjdGlvbiBjb3VudCBjaGFuZ2VzIHdpdGggdGhlIGRhdGFzZXQgd2hpbGUgdGhlIHZpZXcgc3RhdGUgcGVyc2lzdHMuXG4gICAgY29uc3Qgc2VjdGlvbnMgPSBzZWN0aW9uc09mKG9icyk7XG4gICAgY29uc3Qgc2VjdGlvbiA9XG4gICAgICB2aWV3LnBvaW50U2VjdGlvbiAhPSBudWxsICYmIHNlY3Rpb25zICYmIHNlY3Rpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgPyBzZWN0aW9uc1tNYXRoLm1heCgwLCBNYXRoLm1pbihzZWN0aW9ucy5sZW5ndGggLSAxLCB2aWV3LnBvaW50U2VjdGlvbikpXVxuICAgICAgICA6IG51bGw7XG4gICAgY29uc3Qgc2hvd24gPSBzZWN0aW9uICE9IG51bGwgPyBvYnNlcnZhdGlvbnNJblNlY3Rpb24ob2JzLCBzZWN0aW9uKSA6IG51bGw7XG4gICAgY29uc3Qgc2hvd25Db3VudCA9IHNob3duID8gc2hvd24ubGVuZ3RoIDogb2JzLmNvdW50O1xuXG4gICAgY29uc3Qga2V5ID0gYCR7ZGF0YXNldC5pZH06JHtvYnMuY291bnR9OiR7c2VjdGlvbiA/PyAnYWxsJ31gO1xuICAgIC8vIGBQb2ludHMzRExheWVyLnZhbHVlc2AgaXMgcmVhZG9ubHkgYW5kIHRoZSBsYXllciBleHBvc2VzIG5vIGRhdGFWZXJzaW9uIHRvXG4gICAgLy8gYnVtcCwgc28gdW5saWtlIHRoZSAyRCBwYXRoIGEgY2hhbmdlIG9mIGNvbG91ciBTT1VSQ0UgY2Fubm90IGJlIG11dGF0ZWQgaW5cbiAgICAvLyDigJQgdGhlIGxheWVyIGhhcyB0byBiZSByZWJ1aWx0LiBPbmx5IHRoZSBzaXplL29wYWNpdHkvY29sb3JtYXAga25vYnMgYXJlXG4gICAgLy8gZ2VudWluZWx5IGRpc3BsYXktb25seS4gU28gdHJhY2sgdGhlIHNjYWxhcnMnIGlkZW50aXR5IHNlcGFyYXRlbHkgZnJvbSB0aGVcbiAgICAvLyBnZW9tZXRyeSdzOiBgY29sb3JCeWAgcGx1cyB0aGUgdHJhbnNmb3JtcyBmZWVkaW5nIHRoZSBlbmNvZGluZy5cbiAgICBjb25zdCBjbGlwID0gdmlldy5wZXJjZW50aWxlQ2xpcCA/PyBbMC4wMSwgMC45OV07XG4gICAgY29uc3Qgc2NhbGFyS2V5ID0gW1xuICAgICAga2V5LFxuICAgICAgdmlldy5jb2xvckJ5ID8gYCR7dmlldy5jb2xvckJ5LmtpbmR9OiR7dmlldy5jb2xvckJ5Lm5hbWV9YCA6ICdmbGF0JyxcbiAgICAgIHZpZXcubG9nU2NhbGUgPyAnbG9nJyA6ICdsaW4nLFxuICAgICAgY2xpcC5qb2luKCcsJyksXG4gICAgXS5qb2luKCd8Jyk7XG5cbiAgICBpZiAoa2V5ICE9PSB0aGlzLnNwYXRpYWxMYXllcktleTNkKSB7XG4gICAgICAvLyBOZXcgZ2VvbWV0cnk6IGludGVybGVhdmUgeCx5LHogKHRoZSBsYXllcidzIGRvY3VtZW50ZWQgbGF5b3V0LCB4LWZhc3Rlc3QpXG4gICAgICAvLyBhbmQgY2FjaGUgaXQsIHNvIGxhdGVyIGNvbG91ciBjaGFuZ2VzIHJlYnVpbGQgdGhlIGxheWVyIHdpdGhvdXQgd2Fsa2luZ1xuICAgICAgLy8gdGhlIG9ic2VydmF0aW9ucyBhZ2Fpbi5cbiAgICAgIGNvbnN0IFtveCwgb3ksIG96XSA9IHRoaXMuc3BhdGlhbE9yaWdpbjNkO1xuICAgICAgY29uc3QgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJBcnJheShzaG93bkNvdW50ICogMyk7XG4gICAgICBmb3IgKGxldCBrID0gMDsgayA8IHNob3duQ291bnQ7IGsrKykge1xuICAgICAgICBjb25zdCBpID0gc2hvd24gPyBzaG93bltrXSA6IGs7XG4gICAgICAgIHBvc2l0aW9uc1trICogM10gPSBvYnMueFtpXSArIG94O1xuICAgICAgICBwb3NpdGlvbnNbayAqIDMgKyAxXSA9IG9icy55W2ldICsgb3k7XG4gICAgICAgIHBvc2l0aW9uc1trICogMyArIDJdID0gb2JzLnpbaV0gKyBvejtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3BhdGlhbFBvc2l0aW9uczNkID0gcG9zaXRpb25zO1xuICAgICAgdGhpcy5zcGF0aWFsRHJhd24zZCA9IHNob3duO1xuICAgIH1cblxuICAgIC8vIFRoZSBzY2FsYXJzIGhhdmUgdG8gZm9sbG93IHRoZSBnZW9tZXRyeTogYSBwZXItb2JzZXJ2YXRpb24gdmVjdG9yIGFnYWluc3Qgb25lXG4gICAgLy8gc2VjdGlvbidzIHBvc2l0aW9ucyB3b3VsZCBjb2xvdXIgZWFjaCBjZWxsIGJ5IGEgc3RyYW5nZXIncyB2YWx1ZS5cbiAgICBjb25zdCB2YWx1ZXNGb3IgPSAoKSA9PiAoc2hvd24gPyBGbG9hdDMyQXJyYXkuZnJvbShzaG93biwgKGkpID0+IHNjYWxhcnNbaV0pIDogc2NhbGFycyk7XG5cbiAgICBpZiAoIXRoaXMuc3BhdGlhbFBvaW50czNkIHx8IGtleSAhPT0gdGhpcy5zcGF0aWFsTGF5ZXJLZXkzZCkge1xuICAgICAgLy8gTmV3IEdFT01FVFJZIOKAlCBhIGRpZmZlcmVudCBkYXRhc2V0LCBvciBhIGRpZmZlcmVudCBzZWN0aW9uIOKAlCBzbyBhIG5ldyBsYXllci5cbiAgICAgIGlmICh0aGlzLnNwYXRpYWxQb2ludHMzZCkgdmlld2VyLmxheWVycy5yZW1vdmUodGhpcy5zcGF0aWFsUG9pbnRzM2QpO1xuICAgICAgdGhpcy5zcGF0aWFsTGF5ZXJLZXkzZCA9IGtleTtcbiAgICAgIHRoaXMuc3BhdGlhbFNjYWxhcktleTNkID0gc2NhbGFyS2V5O1xuICAgICAgdGhpcy5zcGF0aWFsUG9pbnRzM2QgPSB2aWV3ZXIuYWRkUG9pbnRzM0QodGhpcy5zcGF0aWFsUG9zaXRpb25zM2QhLCB2YWx1ZXNGb3IoKSwge1xuICAgICAgICBuYW1lOiAnb2JzZXJ2YXRpb25zJyxcbiAgICAgICAgY29sb3JtYXAsXG4gICAgICAgIGNvbnRyYXN0TGltaXRzLFxuICAgICAgICBzaXplLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzY2FsYXJLZXkgIT09IHRoaXMuc3BhdGlhbFNjYWxhcktleTNkKSB7XG4gICAgICAgIC8vIEEgY2hhbmdlIG9mIGNvbG91ciBTT1VSQ0UsIHdoaWNoIHVzZWQgdG8gbWVhbiBkaXNjYXJkaW5nIHRoZSBsYXllciBhbmQgYnVpbGRpbmdcbiAgICAgICAgLy8gYW5vdGhlciDigJQgYW5kLCBiZWNhdXNlIGFkZGluZyBhIDNEIGxheWVyIHJlZnJhbWVzLCBhIGNhbWVyYSBqdW1wIHRvIHVuZG8gYXMgd2VsbC5cbiAgICAgICAgLy8gbmFwYXJpLWpzIOKJpSAwLjE0IGxldHMgdGhlIHNjYWxhcnMgYmUgcmVwbGFjZWQgaW4gcGxhY2Ug4oCUIHRoZSBzZXR0ZXIgYnVtcHMgdGhlXG4gICAgICAgIC8vIGxheWVyJ3MgZGF0YVZlcnNpb24gc28gdGhlIHZpc3VhbCByZS11cGxvYWRzIOKAlCBhbmQgdGhlIHBvc2l0aW9ucyBoYXZlIG5vdCBtb3ZlZCxcbiAgICAgICAgLy8gc28gdGhlcmUgaXMgbm90aGluZyBmb3IgdGhlIGNhbWVyYSB0byByZWZyYW1lLlxuICAgICAgICB0aGlzLnNwYXRpYWxTY2FsYXJLZXkzZCA9IHNjYWxhcktleTtcbiAgICAgICAgdGhpcy5zcGF0aWFsUG9pbnRzM2QudmFsdWVzID0gdmFsdWVzRm9yKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNwYXRpYWxQb2ludHMzZC5jb2xvcm1hcCA9IGNvbG9ybWFwO1xuICAgICAgdGhpcy5zcGF0aWFsUG9pbnRzM2QuY29udHJhc3RMaW1pdHMgPSBjb250cmFzdExpbWl0cztcbiAgICAgIHRoaXMuc3BhdGlhbFBvaW50czNkLnNpemUgPSBzaXplO1xuICAgIH1cblxuICAgIC8vIFNlbGVjdGlvbiBpcyBhIFBFUi1QT0lOVCBhbHBoYSwgaW4gdGhlIG9uZSBsYXllci5cbiAgICAvL1xuICAgIC8vIEl0IHVzZWQgdG8gYmUgYSBzZWNvbmQgbGF5ZXI6IHdpdGggYSBzaW5nbGUgb3BhY2l0eSBmb3IgdGhlIHdob2xlIGNsb3VkLCB0aGUgb25seSB3YXlcbiAgICAvLyB0byBoaWdobGlnaHQgYSBzdWJzZXQgd2FzIHRvIGRyYXcgaXQgYWdhaW4gb24gdG9wIGF0IGZ1bGwgb3BhY2l0eSB3aGlsZSB0aGUgcGFyZW50XG4gICAgLy8gZHJvcHBlZCB0byB0aGUgbXV0ZWQgbGV2ZWwuIFRoYXQgc2Vjb25kIGxheWVyIGhhZCB0byBiZSBrZXB0IGluIHN0ZXAgdGhyb3VnaCBldmVyeVxuICAgIC8vIGNvbG9ybWFwLCB3aW5kb3cgYW5kIHNpemUgY2hhbmdlLCBhbmQgdGhlIHR3byB0aGVuIGRlcHRoLXNvcnRlZCBhZ2FpbnN0IGVhY2ggb3RoZXIgYXNcbiAgICAvLyBzZXBhcmF0ZSBkcmF3cy4gUGVyLXBvaW50IGFscGhhcyBhbmQgc2l6ZXMgZ2l2ZSB0aGUgc2FtZSByZWFkaW5nIOKAlCBtdXRlZCBjbG91ZCwgYnJpZ2h0XG4gICAgLy8gc2VsZWN0aW9uLCBzbGlnaHRseSBsYXJnZXIgc28gYSBzbWFsbCBvbmUgaXMgZmluZGFibGUgaW5zaWRlIDMuN00gcG9pbnRzIOKAlCBpbiBvbmUuXG4gICAgY29uc3QgaGFzU2VsZWN0aW9uID0gc2VsZWN0aW9uLmNvdW50ID4gMCAmJiBzZWxlY3Rpb24ubWFzay5sZW5ndGggPT09IG9icy5jb3VudDtcbiAgICBjb25zdCBjbG91ZCA9IHRoaXMuc3BhdGlhbFBvaW50czNkO1xuICAgIGlmIChjbG91ZCkge1xuICAgICAgY2xvdWQub3BhY2l0eSA9IHZpZXcub3BhY2l0eTtcbiAgICAgIGlmICghaGFzU2VsZWN0aW9uKSB7XG4gICAgICAgIGNsb3VkLmFscGhhcyA9IG51bGw7XG4gICAgICAgIGNsb3VkLnNpemVzID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGFscGhhcyA9IG5ldyBGbG9hdDMyQXJyYXkoc2hvd25Db3VudCk7XG4gICAgICAgIGNvbnN0IHNpemVzID0gbmV3IEZsb2F0MzJBcnJheShzaG93bkNvdW50KTtcbiAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBzaG93bkNvdW50OyBrKyspIHtcbiAgICAgICAgICBjb25zdCBpID0gc2hvd24gPyBzaG93bltrXSA6IGs7XG4gICAgICAgICAgY29uc3QgcGlja2VkID0gISFzZWxlY3Rpb24ubWFza1tpXTtcbiAgICAgICAgICBhbHBoYXNba10gPSBwaWNrZWQgPyAxIDogREVGQVVMVF9NVVRFRF9PUEFDSVRZO1xuICAgICAgICAgIHNpemVzW2tdID0gcGlja2VkID8gTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuU1BBVElBTF9TRUxFQ1RFRF9TSVpFX1NDQUxFIDogMTtcbiAgICAgICAgfVxuICAgICAgICBjbG91ZC5hbHBoYXMgPSBhbHBoYXM7XG4gICAgICAgIGNsb3VkLnNpemVzID0gc2l6ZXM7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIExhc3QsIHNvIGl0IGFsc28gY292ZXJzIGEgbGF5ZXIgdGhpcyBwYXNzIGp1c3QgY3JlYXRlZC5cbiAgICBpZiAodGhpcy5zcGF0aWFsUG9pbnRzM2QpIHRoaXMuc3BhdGlhbFBvaW50czNkLnZpc2libGUgPSB2aWV3LnNob3dQb2ludHM7XG4gICAgdmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgKiozRCBnZW5lIG1hcCoqOiB0aGUgYWN0aXZlIGdlbmUncyBleHByZXNzaW9uIG92ZXIgdGhlIHdob2xlIHNlY3Rpb25lZFxuICAgKiBzcGVjaW1lbiwgYXMgb25lIHJheW1hcmNoZWQgdm9sdW1lLlxuICAgKlxuICAgKiBUd28gdGhpbmdzIGl0IGNhbiBiZSwgYW5kIHRoZSBwYW5lbCdzIGBWb2x1bWUgcmVuZGVyaW5nYCB0b2dnbGUgcGlja3Mgd2hpY2g6XG4gICAqXG4gICAqICAtICoqc2hlZXRzKiog4oCUIGV4YWN0bHkgdGhlIHBsYW5lcyB0aGF0IHdlcmUgaW1hZ2VkLCBlYWNoIGNhcnJ5aW5nIHRoYXRcbiAgICogICAgc2xpZGUncyBvd24gMkQgZ2VuZSBtYXAsIHdpdGggdGhlIGdhcHMgYmV0d2VlbiBzZWN0aW9ucyBlbXB0eS4gQSBzdGFjayBvZlxuICAgKiAgICBtZWFzdXJlZCBmaWVsZHMsIGF0IHRoZWlyIHRydWUgei5cbiAgICogIC0gKip2b2x1bWUqKiDigJQgdGhlIHNhbWUgZmllbGRzIHNtb290aGVkIGFsb25nIHosIHNvIHRoZSBwbGFuZXMgYmV0d2VlbiB0aGVcbiAgICogICAgc2VjdGlvbnMgY2FycnkgYW4gaW50ZXJwb2xhdGVkIHZhbHVlLiBBbiBlc3RpbWF0ZSwgYW5kIGRyYXduIGFzIGFcbiAgICogICAgdHJhbnNsdWNlbnQgY2xvdWQgZm9yIHRoZSBzYW1lIHJlYXNvbiB0aGUgZGVuc2l0eSB2b2x1bWVzIGFyZS5cbiAgICpcbiAgICogT25lIGBWb2x1bWVMYXllcmAgcmF0aGVyIHRoYW4gYSB0ZXh0dXJlZCBxdWFkIHBlciBzZWN0aW9uOiBhbiBgSW1hZ2VMYXllcmBcbiAgICogcmVuZGVycyBvbmx5IGF0IGBuZGlzcGxheSA9PT0gMmAsIHNvIDUzIHNoZWV0cyBpbiB0aGUgb3JiaXQgdmlldyB3b3VsZCBuZWVkIGFcbiAgICogbmV3IGxheWVyIHR5cGUgdXBzdHJlYW0g4oCUIHdoaWxlIGEgc2NhbGFyIHZvbHVtZSB3aG9zZSB6IHNhbXBsaW5nIGFscmVhZHkgSVNcbiAgICogdGhlIHNlY3Rpb24gc3BhY2luZyBleHByZXNzZXMgdGhlIHNoZWV0cyBleGFjdGx5LCBhbmQgdGhlIHNhbWUgbGF0dGljZSB0aGVuXG4gICAqIGdpdmVzIHRoZSBpbnRlcnBvbGF0ZWQgdmVyc2lvbiBmb3IgZnJlZS5cbiAgICpcbiAgICogRXN0aW1hdGVkIG9uIHRoZSByZWZlcmVuY2Ugdm9sdW1lJ3Mgb3duIGxhdHRpY2UgKGBkZW5zaXR5R3JpZGAgYXQgc3RyaWRlIDEpLFxuICAgKiBzbyB0aGUgZmllbGQgbGFuZHMgdm94ZWwtZm9yLXZveGVsIG9uIHRoZSBhbmF0b215IGFuZCBuZWVkcyBubyBvZmZzZXQg4oCUIGFcbiAgICogYFZvbHVtZUxheWVyYCBoYXMgbm8gdHJhbnNsYXRlLCBhbmQgbmFwYXJpIGNlbnRyZXMgYm90aCBib3hlcyBvbiB0aGUgd29ybGRcbiAgICogb3JpZ2luLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVHZW5lTWFwVm9sdW1lKFxuICAgIHZpZXdlcjogVmlld2VyLCBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBnZW5lID0gdmlldy5nZW5lTWFwICYmIHZpZXcuY29sb3JCeT8ua2luZCA9PT0gJ2ZlYXR1cmUnID8gdmlldy5jb2xvckJ5Lm5hbWUgOiBudWxsO1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnNwYXRpYWxEYXRhO1xuICAgIGNvbnN0IHNtb290aGluZyA9IHZpZXcuZ2VuZU1hcFNtb290aGluZyA+IDAgPyB2aWV3LmdlbmVNYXBTbW9vdGhpbmcgOiAxO1xuICAgIGNvbnN0IGNsaXAgPSB2aWV3LnBlcmNlbnRpbGVDbGlwID8/IFswLjAxLCAwLjk5XTtcbiAgICBjb25zdCBvYnMgPSBkYXRhc2V0Lm9ic2VydmF0aW9ucztcbiAgICAvLyBBIHZvbHVtZSBidWlsdCBmcm9tIE9ORSBzZWN0aW9uIHdvdWxkIHNtZWFyIHRoYXQgc2xpZGUgdGhyb3VnaCB0aGUgd2hvbGVcbiAgICAvLyBkZXB0aCwgc28gdGhlIHNlY3Rpb24gcmVzdHJpY3Rpb24gb25seSBhcHBsaWVzIHRvIHRoZSBzaGVldHMuXG4gICAgY29uc3QgaW50ZXJwb2xhdGUgPSAhIXZpZXcuZ2VuZU1hcFZvbHVtZTtcbiAgICBjb25zdCBzZWN0aW9ucyA9IHNlY3Rpb25zT2Yob2JzKTtcbiAgICBjb25zdCBzZWN0aW9uID1cbiAgICAgICFpbnRlcnBvbGF0ZSAmJiB2aWV3LmdlbmVNYXBTZWN0aW9uICE9IG51bGwgJiYgc2VjdGlvbnMgJiYgc2VjdGlvbnMubGVuZ3RoID4gMFxuICAgICAgICA/IHNlY3Rpb25zW01hdGgubWF4KDAsIE1hdGgubWluKHNlY3Rpb25zLmxlbmd0aCAtIDEsIHZpZXcuZ2VuZU1hcFNlY3Rpb24pKV1cbiAgICAgICAgOiBudWxsO1xuXG4gICAgY29uc3QgZmllbGRLZXkgPSBnZW5lXG4gICAgICA/IFtcbiAgICAgICAgZGF0YXNldC5pZCwgZ2VuZSwgc21vb3RoaW5nLCBzZWN0aW9uID8/ICdhbGwnLCBpbnRlcnBvbGF0ZSA/ICd2b2wnIDogJ3NoZWV0cycsXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uUmV2KHNlbGVjdGlvbiksXG4gICAgICBdLmpvaW4oJ3wnKVxuICAgICAgOiBudWxsO1xuICAgIGNvbnN0IGtleSA9IGZpZWxkS2V5XG4gICAgICA/IFtcbiAgICAgICAgZmllbGRLZXksIGNsaXAuam9pbignLCcpLCB2aWV3LmxvZ1NjYWxlID8gJ2xvZycgOiAnbGluJywgdmlldy5nZW5lTWFwT3BhY2l0eSxcbiAgICAgICAgdGhpcy5jb250aW51b3VzQ29sb3JtYXBLZXkodmlldyksXG4gICAgICBdLmpvaW4oJ3wnKVxuICAgICAgOiBudWxsO1xuICAgIGlmIChrZXkgPT09IHRoaXMuZ2VuZU1hcFZvbHVtZUtleSkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuZ2VuZU1hcFZvbHVtZUxheWVyKSB7XG4gICAgICB2aWV3ZXIubGF5ZXJzLnJlbW92ZSh0aGlzLmdlbmVNYXBWb2x1bWVMYXllcik7XG4gICAgICB0aGlzLmdlbmVNYXBWb2x1bWVMYXllciA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuZ2VuZU1hcFZvbHVtZUtleSA9IGtleTtcbiAgICBpZiAoIWtleSB8fCAhZ2VuZSB8fCAhcG9ydCkge1xuICAgICAgdGhpcy5nZW5lTWFwVm9sdW1lRmllbGQgPSBudWxsO1xuICAgICAgdGhpcy5nZW5lTWFwVm9sdW1lRmllbGRLZXkgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENvYXJzZW5lZCBpbi1wbGFuZSBidXQgTk9UIGFsb25nIHo6IHRoZSBzaGVldHMgbmVlZCBvbmUgcGxhbmUgcGVyIGltYWdlZFxuICAgIC8vIHNlY3Rpb24sIHdoaWxlIHRoZSBmaWVsZCB0aGV5IGNhcnJ5IGlzIHNtb290aCBieSBjb25zdHJ1Y3Rpb24gYW5kIGdhaW5zXG4gICAgLy8gbm90aGluZyBmcm9tIHRoZSB0ZW1wbGF0ZSdzIDQwIMK1bSBkZXRhaWwuIEF0IGZ1bGwgcmVzb2x1dGlvbiB0aGUgZXN0aW1hdGUgaXNcbiAgICAvLyBhIDUuN00tdm94ZWwgcGFpciBvZiBibHVycyBvbiB0aGUgbWFpbiB0aHJlYWQg4oCUIHNlY29uZHMgb2YgZnJvemVuIFVJIGZvciBhXG4gICAgLy8gY2hlY2tib3g7IGFuIGVpZ2h0aCBvZiB0aGUgdm94ZWxzIGlzIGFuIGVpZ2h0aCBvZiB0aGUgd29yay5cbiAgICBjb25zdCBncmlkID0gZGVuc2l0eUdyaWQoZGF0YXNldCwgR0VORV9NQVBfVk9MVU1FX1NUUklERSwgMTI4LCAxKTtcbiAgICBpZiAoIWdyaWQpIHJldHVybjtcblxuICAgIGlmIChmaWVsZEtleSAhPT0gdGhpcy5nZW5lTWFwVm9sdW1lRmllbGRLZXkpIHtcbiAgICAgIGxldCB2YWx1ZXM6IEZsb2F0MzJBcnJheTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbHVlcyA9IGF3YWl0IHBvcnQuZ2V0RmVhdHVyZVZlY3RvcihnZW5lKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLndhcm4oYFtuYXBhcmktanNdIDNEIGdlbmUgbWFwOiBcIiR7Z2VuZX1cIiB1bmF2YWlsYWJsZWAsIGVycik7XG4gICAgICAgIHRoaXMuZ2VuZU1hcFZvbHVtZUtleSA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnZpZXdlciAhPT0gdmlld2VyIHx8IHRoaXMuZ2VuZU1hcFZvbHVtZUtleSAhPT0ga2V5KSByZXR1cm47XG4gICAgICBjb25zdCBpblNlbGVjdGlvbiA9IHNlbGVjdGlvbi5jb3VudCA+IDAgPyBtYXNrVG9JbmRpY2VzKHNlbGVjdGlvbi5tYXNrKSA6IHVuZGVmaW5lZDtcbiAgICAgIC8vIEluLXBsYW5lIGJhbmR3aWR0aCBpcyB0aGUgMkQgbWFwJ3MsIGluIHRoaXMgbGF0dGljZSdzIHVuaXRzLCBzbyBhIHNoZWV0XG4gICAgICAvLyBhbmQgdGhlIDJEIHZpZXcgb2YgdGhlIHNhbWUgc2VjdGlvbiBhcmUgdGhlIHNhbWUgZmllbGQuIEFsb25nIHogaXQgaXMgdGhlXG4gICAgICAvLyBkZW5zaXR5IHBhdGgncyAxLjUgdm94ZWxzIOKAlCB0aGUgc21hbGxlc3Qgz4MgdGhhdCBicmlkZ2VzIG9uZSBzZWN0aW9uIGdhcC5cbiAgICAgIC8vIEluLXBsYW5lIM+DIGlzIGEgUEhZU0lDQUwgYmFuZHdpZHRoLCBhbmNob3JlZCB0byB0aGUgcmVmZXJlbmNlIHZvbHVtZSdzIG93blxuICAgICAgLy8gdm94ZWwg4oCUIHRoZSByZXNvbHV0aW9uIHRoZSAyRCBtYXAgZXN0aW1hdGVzIGF0IOKAlCBzbyBhIHNoZWV0IGFuZCB0aGUgMkRcbiAgICAgIC8vIHZpZXcgb2YgdGhlIHNhbWUgc2VjdGlvbiBhcmUgdGhlIHNhbWUgZmllbGQgd2hhdGV2ZXIgbGF0dGljZSB0aGlzIGlzXG4gICAgICAvLyByYXN0ZXJpc2VkIG9uLiBBbG9uZyB6IGl0IGlzIHRoZSBkZW5zaXR5IHBhdGgncyAxLjUgdm94ZWxzOiB0aGUgc21hbGxlc3Qgz4NcbiAgICAgIC8vIHRoYXQgYnJpZGdlcyBvbmUgc2VjdGlvbiBnYXAuXG4gICAgICBjb25zdCBpblBsYW5lID0gZGF0YXNldC52b2x1bWU/LnZveGVsU2l6ZSA/PyBncmlkLnZveGVsU2l6ZTtcbiAgICAgIHRoaXMuZ2VuZU1hcFZvbHVtZUZpZWxkID0gZXhwcmVzc2lvblZvbHVtZShvYnMsIGdyaWQsIHtcbiAgICAgICAgc2lnbWE6IFtcbiAgICAgICAgICBpblBsYW5lWzBdICogTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuR0VORV9NQVBfU0lHTUEgKiBzbW9vdGhpbmcsXG4gICAgICAgICAgaW5QbGFuZVsxXSAqIE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLkdFTkVfTUFQX1NJR01BICogc21vb3RoaW5nLFxuICAgICAgICAgIGdyaWQudm94ZWxTaXplWzJdICogMS41ICogc21vb3RoaW5nLFxuICAgICAgICBdLFxuICAgICAgICB2YWx1ZXMsXG4gICAgICAgIGluZGljZXM6IHNlY3Rpb24gIT0gbnVsbCA/IG9ic2VydmF0aW9uc0luU2VjdGlvbihvYnMsIHNlY3Rpb24pIDogaW5TZWxlY3Rpb24sXG4gICAgICAgIGludGVycG9sYXRlLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmdlbmVNYXBWb2x1bWVGaWVsZEtleSA9IGZpZWxkS2V5O1xuICAgIH1cbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuZ2VuZU1hcFZvbHVtZUZpZWxkO1xuICAgIGlmICghZmllbGQpIHJldHVybjtcblxuICAgIGNvbnN0IFtsbywgaGldID0gY29udHJhc3RXaW5kb3coZmllbGQubWVhbiwgY2xpcFswXSwgY2xpcFsxXSk7XG4gICAgY29uc3QgZGF0YSA9IGVuY29kZUV4cHJlc3Npb25Wb2x1bWUoZmllbGQsIFtsbywgaGldLCB7IGxvZzogdmlldy5sb2dTY2FsZSB9KTtcbiAgICBjb25zdCBub2RlID0gdGhpcy5jdXJyZW50Q29sb3JtYXAgYXMgeyBkYXRhPzogeyB2YWx1ZT86IHVua25vd24gfSB9IHwgbnVsbDtcbiAgICBjb25zdCBsdXQgPSBzcGF0aWFsQ29udGludW91c0x1dChcbiAgICAgIG5vZGU/LmRhdGE/LnZhbHVlLCB0aGlzLmN1cnJlbnRSZXZlcnNlLCB2aWV3LmNvbnRpbnVvdXNDb2xvcm1hcCxcbiAgICApO1xuICAgIHRoaXMuZ2VuZU1hcFZvbHVtZUxheWVyID0gdmlld2VyLmFkZFZvbHVtZShcbiAgICAgIGRhdGEsIGZpZWxkLndpZHRoLCBmaWVsZC5oZWlnaHQsIGZpZWxkLmRlcHRoLFxuICAgICAge1xuICAgICAgICBuYW1lOiBgZ2VuZSBtYXAgwrcgJHtnZW5lfSR7aW50ZXJwb2xhdGUgPyAnIMK3IHZvbHVtZScgOiAnJ31gLFxuICAgICAgICBjb2xvcm1hcDogY29sb3JtYXBGcm9tTHV0KGBnZW5lLW1hcC0ke2dlbmV9YCwgbHV0KSxcbiAgICAgICAgLy8gVGhlIGVuY29kaW5nIGFscmVhZHkgYXBwbGllZCB0aGUgd2luZG93LCBzbyB0aGUgbGF5ZXIgbXVzdCBub3QgYXBwbHkgYVxuICAgICAgICAvLyBzZWNvbmQgb25lOiAwLi4yNTUgaXMgdGhlIHdob2xlIG9mIHdoYXQgaXQgd2FzIGdpdmVuLlxuICAgICAgICBjb250cmFzdExpbWl0czogWzAsIDI1NV0sXG4gICAgICAgIHJlbmRlcmluZzogJ3RyYW5zbHVjZW50JyxcbiAgICAgICAgLy8gQWRkaXRpdmUgbGlrZSB0aGUgZGVuc2l0eSB2b2x1bWVzLCBhbmQgZm9yIHRoZSBzYW1lIHJlYXNvbjogdGhlIHNoZWV0c1xuICAgICAgICAvLyBoYXZlIHRvIHJlYWQgVEhST1VHSCBlYWNoIG90aGVyIGFuZCB0aHJvdWdoIHRoZSBhbmF0b215LCB3aGljaCBhXG4gICAgICAgIC8vIHRyYW5zbHVjZW50IGJsZW5kIHdvdWxkIG9jY2x1ZGUgb25lIHNoZWV0IGF0IGEgdGltZS5cbiAgICAgICAgYmxlbmRpbmc6ICdhZGRpdGl2ZScsXG4gICAgICAgIG9wYWNpdHk6IHZpZXcuZ2VuZU1hcE9wYWNpdHksXG4gICAgICAgIHZveGVsU2l6ZTogZ3JpZC52b3hlbFNpemUsXG4gICAgICB9LFxuICAgICk7XG4gICAgdmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbHVzdGVyIGRlbnNpdHkgdm9sdW1lczogZWFjaCBjbHVzdGVyIHJhc3RlcmlzZWQgaW50byBhIHNtb290aCBzY2FsYXIgZmllbGQgYW5kXG4gICAqIHJheW1hcmNoZWQgYWxvbmdzaWRlIHRoZSBjbG91ZCwgdGludGVkIHdpdGggdGhlIGNsdXN0ZXIncyBvd24gbGVnZW5kIGNvbG91ci5cbiAgICpcbiAgICogVGhpcyBpcyB3aGF0IG1ha2VzIGEgc2VyaWFsbHkgc2VjdGlvbmVkIGRhdGFzZXQgcmVhZGFibGUgYXMgYW4gYW5hdG9taWNhbFxuICAgKiBkaXN0cmlidXRpb24uIFRoZSBjbG91ZCBzaG93cyBtZWFzdXJlZCBjZWxscyBhbmQgbm90aGluZyBlbHNlIOKAlCBidXQgYXQgMjAwIMK1bVxuICAgKiBzZWN0aW9uIHNwYWNpbmcgdGhlIGV5ZSBjYW5ub3QgaW50ZWdyYXRlIGEgc3RhY2sgb2YgZGlzY3MgaW50byBhIHNoYXBlLCBhbmRcbiAgICogZXZlcnkgZ2FwIHJlYWRzIGFzIGFic2VuY2UuIEEgZGVuc2l0eSBmaWVsZCBpcyBhIGRpZmZlcmVudCBvYmplY3QgZnJvbSBhIGNlbGw6XG4gICAqIGFuIGVzdGltYXRlLCBkZWZpbmVkIGJldHdlZW4gdGhlIGltYWdlZCBwbGFuZXMsIGRyYXduIGFzIGEgdHJhbnNsdWNlbnQgY2xvdWQgc29cbiAgICogaXQgY2Fubm90IGJlIG1pc3Rha2VuIGZvciBtZWFzdXJlbWVudC4gSW5kaXZpZHVhbCBjZWxscyBhcmUgbmV2ZXIgaW50ZXJwb2xhdGVkIOKAlFxuICAgKiBjb25zZWN1dGl2ZSBzZWN0aW9ucyBzYW1wbGUgZGlmZmVyZW50IGNlbGxzLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGludGVycG9sYXRlXG4gICAqIGFsb25nLlxuICAgKlxuICAgKiBPbmUgdm9sdW1lIHBlciBjbHVzdGVyIHJhdGhlciB0aGFuIG9uZSBmb3IgZXZlcnl0aGluZzogYWRkaXRpdmUgYmxlbmRpbmcgaXMgd2hhdFxuICAgKiBtYWtlcyB0d28gY2x1c3RlcnMnIHRlcnJpdG9yaWVzIGNvbXBhcmFibGUsIGFuZCBhIHNpbmdsZSBibGVuZGVkIGZpZWxkIHdvdWxkXG4gICAqIGFuc3dlciBubyBxdWVzdGlvbiBhbnlvbmUgYXNrcyBvZiBhIHRheG9ub215LiBDYXBwZWQgYXRcbiAgICoge0BsaW5rIERFTlNJVFlfTUFYX0NMVVNURVJTfSBieSBjZWxsIGNvdW50LlxuICAgKlxuICAgKiBLZXllZCBzbyBpdCByZWJ1aWxkcyBvbmx5IHdoZW4gdGhlIGZpZWxkIHdvdWxkIGFjdHVhbGx5IGRpZmZlciDigJQgdGhlIGRhdGFzZXQsXG4gICAqIHRoZSBjb2xvdXIgY29sdW1uLCB0aGUgYmFuZHdpZHRoLCBvciB0aGUgc2VsZWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVEZW5zaXR5Vm9sdW1lcyhcbiAgICB2aWV3ZXI6IFZpZXdlciwgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgb24gPSAhIXZpZXcuZGVuc2l0eVZvbHVtZSAmJiAhIWRhdGFzZXQub2JzZXJ2YXRpb25zLno7XG4gICAgY29uc3Qgc21vb3RoaW5nID0gdmlldy5kZW5zaXR5U21vb3RoaW5nID4gMCA/IHZpZXcuZGVuc2l0eVNtb290aGluZyA6IDE7XG4gICAgY29uc3QgY29sdW1uID0gdmlldy5jb2xvckJ5Py5raW5kID09PSAnY29sdW1uJyA/IHZpZXcuY29sb3JCeS5uYW1lIDogbnVsbDtcbiAgICAvLyBUaGUgc2VsZWN0aW9uIGVudGVycyB0aGUga2V5IGJ5IElERU5USVRZLCBub3QgYnkgY291bnQ6IHR3byBkaWZmZXJlbnQgUk9Jc1xuICAgIC8vIGhvbGRpbmcgdGhlIHNhbWUgbnVtYmVyIG9mIGNlbGxzIHdvdWxkIG90aGVyd2lzZSBsb29rIGxpa2UgdGhlIHNhbWUga2V5IGFuZFxuICAgIC8vIGxlYXZlIHRoZSBwcmV2aW91cyBST0kncyBmaWVsZHMgb24gc2NyZWVuLlxuICAgIGNvbnN0IGtleSA9IG9uXG4gICAgICA/IFtkYXRhc2V0LmlkLCBjb2x1bW4gPz8gJ2FsbCcsIHNtb290aGluZywgdGhpcy5zZWxlY3Rpb25SZXYoc2VsZWN0aW9uKV0uam9pbignfCcpXG4gICAgICA6IG51bGw7XG4gICAgaWYgKGtleSA9PT0gdGhpcy5kZW5zaXR5S2V5KSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMuZGVuc2l0eUxheWVycykgdmlld2VyLmxheWVycy5yZW1vdmUobGF5ZXIpO1xuICAgIHRoaXMuZGVuc2l0eUxheWVycyA9IFtdO1xuICAgIHRoaXMuZGVuc2l0eUtleSA9IGtleTtcbiAgICBpZiAoIWtleSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZ3JpZCA9IGRlbnNpdHlHcmlkKGRhdGFzZXQpO1xuICAgIGlmICghZ3JpZCkgcmV0dXJuO1xuICAgIC8vIFdpdGggbm8gcmVmZXJlbmNlIHZvbHVtZSB0aGVyZSBpcyBubyBvZmZzZXQgeWV0LCBhbmQgYSBWb2x1bWVMYXllciBoYXMgbm9cbiAgICAvLyB0cmFuc2xhdGUg4oCUIG5hcGFyaSBjZW50cmVzIGl0cyBib3ggb24gdGhlIHdvcmxkIG9yaWdpbi4gU28gdGhlIFBPSU5UUyBtb3ZlIGJ5XG4gICAgLy8gaGFsZiB0aGUgZGVuc2l0eSBib3gsIGV4YWN0bHkgYXMgdGhleSBkbyBmb3IgYSByZWZlcmVuY2Ugdm9sdW1lLCBhbmQgdGhlXG4gICAgLy8gY2FjaGVkIGdlb21ldHJ5IGlzIGludmFsaWRhdGVkIGJlY2F1c2UgdGhhdCBvZmZzZXQganVzdCBjaGFuZ2VkLlxuICAgIGlmICghdGhpcy5zcGF0aWFsVm9sdW1lKSB7XG4gICAgICB0aGlzLnNwYXRpYWxPcmlnaW4zZCA9IFtcbiAgICAgICAgLShncmlkLndpZHRoICogZ3JpZC52b3hlbFNpemVbMF0pIC8gMixcbiAgICAgICAgLShncmlkLmhlaWdodCAqIGdyaWQudm94ZWxTaXplWzFdKSAvIDIsXG4gICAgICAgIC0oZ3JpZC5kZXB0aCAqIGdyaWQudm94ZWxTaXplWzJdKSAvIDIsXG4gICAgICBdO1xuICAgICAgdGhpcy5zcGF0aWFsTGF5ZXJLZXkzZCA9IG51bGw7XG4gICAgfVxuXG4gICAgbGV0IGdyb3VwczogeyBuYW1lOiBzdHJpbmc7IGNvbG9yOiBzdHJpbmc7IGluZGljZXM/OiBVaW50MzJBcnJheSB9W107XG4gICAgdHJ5IHtcbiAgICAgIGdyb3VwcyA9IGF3YWl0IHRoaXMuZGVuc2l0eUdyb3VwcyhkYXRhc2V0LCBjb2x1bW4sIHNlbGVjdGlvbik7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIGRlbnNpdHkgdm9sdW1lczogY29sdW1uIHVuYXZhaWxhYmxlJywgZXJyKTtcbiAgICAgIHRoaXMuZGVuc2l0eUtleSA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnZpZXdlciAhPT0gdmlld2VyIHx8IHRoaXMuZGVuc2l0eUtleSAhPT0ga2V5KSByZXR1cm47XG5cbiAgICBjb25zdCBzaWdtYSA9IGRlZmF1bHRTaWdtYShncmlkLCBzbW9vdGhpbmcpO1xuICAgIC8vIEFkZGl0aXZlIGJsZW5kaW5nIFNVTVMsIHNvIGEgZml4ZWQgcGVyLWxheWVyIG9wYWNpdHkgYmxvd3Mgb3V0IHRvIHdoaXRlIGFzXG4gICAgLy8gc29vbiBhcyBzZXZlcmFsIGJyb2FkIGNsdXN0ZXJzIG92ZXJsYXAg4oCUIHNpeCBzdWJjbGFzc2VzIGF0IDAuNTUgZWFjaCB0dXJuZWRcbiAgICAvLyB0aGUgYnJhaW4gaW50byBvbmUgY3lhbiBtYXNzLiBTcGxpdHRpbmcgdGhlIGJ1ZGdldCBrZWVwcyBuIGZ1bGx5IG92ZXJsYXBwaW5nXG4gICAgLy8gcGVha3MgaW5zaWRlIHRoZSBkaXNwbGF5J3MgcmFuZ2UsIHNvIG92ZXJsYXAgcmVhZHMgYXMgb3ZlcmxhcDsgYSBzaW5nbGVcbiAgICAvLyBjbHVzdGVyIHN0aWxsIGdldHMgdGhlIGZ1bGwgMC41NS4gSXQgb25seSBtaXRpZ2F0ZXM6IGEgdHJhbnNsdWNlbnQgcmF5bWFyY2hcbiAgICAvLyBpbnRlZ3JhdGVzIGFsb25nIHRoZSByYXksIHNvIGNsdXN0ZXJzIHRoYXQgYXJlIHViaXF1aXRvdXMgcmF0aGVyIHRoYW5cbiAgICAvLyByZWdpb25hbCAodGhlIGxhcmdlc3Qgc3ViY2xhc3NlcyBhcmUgZ2xpYSwgd2hpY2ggYXJlIGV2ZXJ5d2hlcmUpIHN0aWxsIHBpbGVcbiAgICAvLyB1cCwgYW5kIG9uZSBjbHVzdGVyIGF0IGEgdGltZSBpcyB0aGUgcmVhZGFibGUgd2F5IHRvIGxvb2sgYXQgdGhvc2UuXG4gICAgY29uc3Qgb3BhY2l0eSA9IE1hdGgubWluKDAuNTUsIDAuOSAvIE1hdGgubWF4KDEsIGdyb3Vwcy5sZW5ndGgpKTtcbiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIGdyb3Vwcykge1xuICAgICAgY29uc3QgZGF0YSA9IHJhc3Rlcml6ZURlbnNpdHkoZGF0YXNldC5vYnNlcnZhdGlvbnMsIGdyaWQsIHsgc2lnbWEsIGluZGljZXM6IGdyb3VwLmluZGljZXMgfSk7XG4gICAgICAvLyBBIGNsdXN0ZXIgd2l0aCBub3RoaW5nIG9uIHRoZSBncmlkIGRyYXdzIG5vIGxheWVyLCByYXRoZXIgdGhhbiBhbiBlbXB0eSBib3guXG4gICAgICBpZiAoIWRhdGEpIGNvbnRpbnVlO1xuICAgICAgaWYgKHRoaXMudmlld2VyICE9PSB2aWV3ZXIgfHwgdGhpcy5kZW5zaXR5S2V5ICE9PSBrZXkpIHJldHVybjtcbiAgICAgIHRoaXMuZGVuc2l0eUxheWVycy5wdXNoKFxuICAgICAgICAoXG4gICAgICAgICAgdmlld2VyLmFkZFZvbHVtZShkYXRhLCBncmlkLndpZHRoLCBncmlkLmhlaWdodCwgZ3JpZC5kZXB0aCwge1xuICAgICAgICAgICAgbmFtZTogYGRlbnNpdHkgwrcgJHtncm91cC5uYW1lfWAsXG4gICAgICAgICAgICBjb2xvcm1hcDogdGhpcy5jaGFubmVsVGludENvbG9ybWFwKGdyb3VwLmNvbG9yKSxcbiAgICAgICAgICAgIC8vIFRyYW5zbHVjZW50LCBub3QgTUlQOiBhIGNsdXN0ZXIncyBpbnRlcmlvciBpcyB0aGUgcmVhZGFibGUgcGFydCwgYW5kIE1JUFxuICAgICAgICAgICAgLy8gd291bGQgZmxhdHRlbiBldmVyeSBjbG91ZCB0byBpdHMgYnJpZ2h0ZXN0IHNoZWxsLlxuICAgICAgICAgICAgcmVuZGVyaW5nOiAndHJhbnNsdWNlbnQnLFxuICAgICAgICAgICAgb3BhY2l0eSxcbiAgICAgICAgICAgIC8vIEFkZGl0aXZlLCBzbyB0d28gY2x1c3RlcnMgb3ZlcmxhcHBpbmcgcmVhZCBhcyBib3RoIGJlaW5nIHRoZXJlIGluc3RlYWRcbiAgICAgICAgICAgIC8vIG9mIHRoZSBuZWFyZXIgb25lIGhpZGluZyB0aGUgb3RoZXIuXG4gICAgICAgICAgICBibGVuZGluZzogJ2FkZGl0aXZlJyxcbiAgICAgICAgICAgIHZveGVsU2l6ZTogZ3JpZC52b3hlbFNpemUsXG4gICAgICAgICAgfSkpLFxuICAgICAgKTtcbiAgICB9XG4gICAgdmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZGVudGl0eSBvZiB0aGUgY29sb3VyIHNjYWxlIGEgY29udGludW91cyBzcGF0aWFsIGxheWVyIHdpbGwgZHJhdyB3aXRoLCBmb3IgYVxuICAgKiBjYWNoZSBrZXk6IHRoZSBleHBsaWNpdCBjaG9pY2UsIG9yIGVsc2UgdGhlIGRpc3BsYXkgY29sb3JtYXAgYW5kIGl0cyByZXZlcnNlXG4gICAqIGZsYWcsIHNpbmNlIHRoYXQgaXMgd2hhdCB7QGxpbmsgc3BhdGlhbENvbnRpbnVvdXNMdXR9IGZhbGxzIGJhY2sgdG8uXG4gICAqXG4gICAqIFRoZSBnZW5lIG1hcHMgY2FjaGUgdGhlaXIgY29sb3VyZWQgb3V0cHV0LCBzbyB3aXRob3V0IHRoaXMgaW4gdGhlIGtleSBhIGNoYW5nZVxuICAgKiBvZiBjb2xvdXIgc2NhbGUgbGVmdCB0aGUgZmllbGQgb24gc2NyZWVuIGluIHRoZSBwcmV2aW91cyBjb2xvdXJzIOKAlCB0aGUgbWFya2Vyc1xuICAgKiByZWNvbG91cmVkIGFuZCB0aGUgbWFwIHVuZGVyIHRoZW0gZGlkIG5vdC5cbiAgICovXG4gIHByaXZhdGUgY29udGludW91c0NvbG9ybWFwS2V5KHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmN1cnJlbnRDb2xvcm1hcCBhcyB7IGRhdGE/OiB7IHZhbHVlPzogdW5rbm93biB9IH0gfCBudWxsO1xuICAgIHJldHVybiBbXG4gICAgICBjb2xvcm1hcElkKHZpZXcuY29udGludW91c0NvbG9ybWFwKSxcbiAgICAgIGNvbG9ybWFwSWQobm9kZT8uZGF0YT8udmFsdWUpLFxuICAgICAgdGhpcy5jdXJyZW50UmV2ZXJzZSA/ICdyZXYnIDogJycsXG4gICAgXS5qb2luKCc6Jyk7XG4gIH1cblxuICAvKipcbiAgICogQSByZXZpc2lvbiBudW1iZXIgZm9yIGEgc2VsZWN0aW9uIG9iamVjdC5cbiAgICpcbiAgICogVGhlIHN0b3JlIGhhbmRzIG91dCBhIE5FVyBtYXNrIG9iamVjdCBwZXIgY2hhbmdlLCBzbyBvYmplY3QgaWRlbnRpdHkgaXMgdGhlXG4gICAqIGNoZWFwIGFuZCBleGFjdCB3YXkgdG8gdGVsbCB0d28gc2VsZWN0aW9ucyBhcGFydCDigJQgYSBmaW5nZXJwcmludCBvdmVyIDMuN01cbiAgICogbWFzayBieXRlcyB3b3VsZCBiZSBuZWl0aGVyLiBDb3VudGluZyByZXZpc2lvbnMga2VlcHMgdGhlIGNhY2hlIGtleSBhIHNob3J0XG4gICAqIHN0cmluZy5cbiAgICovXG4gIHByaXZhdGUgc2VsZWN0aW9uUmV2KHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2spOiBudW1iZXIge1xuICAgIGlmIChzZWxlY3Rpb24gIT09IHRoaXMubGFzdFNlbGVjdGlvblNlZW4pIHtcbiAgICAgIHRoaXMubGFzdFNlbGVjdGlvblNlZW4gPSBzZWxlY3Rpb247XG4gICAgICB0aGlzLnNlbGVjdGlvblJldmlzaW9uKys7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvblJldmlzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjbHVzdGVycyB0byByYXN0ZXJpc2U6IHRoZSBjYXRlZ29yaWVzIG9mIHRoZSBhY3RpdmUgY2F0ZWdvcmljYWwgY29sb3VyaW5nLFxuICAgKiBiaWdnZXN0IGZpcnN0IGFuZCBjYXBwZWQsIGVhY2ggd2l0aCBpdHMgbGVnZW5kIGNvbG91ci5cbiAgICpcbiAgICogUmVzdHJpY3RlZCB0byB0aGUgY3VycmVudCBzZWxlY3Rpb24gd2hlbiB0aGVyZSBpcyBvbmUsIHNvIFwic2VsZWN0IGEgcmVnaW9uLFxuICAgKiBjaGVjayB0aGUgYm94XCIgYW5zd2VycyB3aGljaCBjbHVzdGVycyBsaXZlIHRoZXJlLiBXaXRoIG5vIGNhdGVnb3JpY2FsIGNvbG91cmluZ1xuICAgKiB0aGVyZSBpcyBvbmUgZ3JvdXAg4oCUIHRvdGFsIGNlbGwgZGVuc2l0eSwgd2hpY2ggaXMgYSByZWFsIHF1ZXN0aW9uIG9uIGl0cyBvd25cbiAgICogKFwid2hlcmUgaXMgdGhlIHRpc3N1ZSBkZW5zZT9cIikgYW5kIHRoZSBob25lc3QgdGhpbmcgdG8gc2hvdyB3aGVuIHRoZSB2aWV3IGlzXG4gICAqIG5vdCBlbmNvZGluZyBhIHRheG9ub215LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkZW5zaXR5R3JvdXBzKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCBjb2x1bW46IHN0cmluZyB8IG51bGwsIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gICk6IFByb21pc2U8eyBuYW1lOiBzdHJpbmc7IGNvbG9yOiBzdHJpbmc7IGluZGljZXM/OiBVaW50MzJBcnJheSB9W10+IHtcbiAgICBjb25zdCBuID0gZGF0YXNldC5vYnNlcnZhdGlvbnMuY291bnQ7XG4gICAgY29uc3QgaW5TZWxlY3Rpb24gPSBzZWxlY3Rpb24uY291bnQgPiAwID8gc2VsZWN0aW9uLm1hc2sgOiBudWxsO1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnNwYXRpYWxEYXRhO1xuICAgIGNvbnN0IG1ldGEgPSBjb2x1bW4gPyBmaW5kQ29sdW1uTWV0YShkYXRhc2V0LCBjb2x1bW4pIDogdW5kZWZpbmVkO1xuICAgIGlmICghcG9ydCB8fCAhY29sdW1uIHx8ICFtZXRhIHx8IG1ldGEua2luZCAhPT0gJ2NhdGVnb3JpY2FsJykge1xuICAgICAgY29uc3QgaW5kaWNlcyA9IGluU2VsZWN0aW9uID8gbWFza1RvSW5kaWNlcyhpblNlbGVjdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBbciwgZywgYl0gPSBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5TUEFUSUFMX05FVVRSQUxfQ09MT1I7XG4gICAgICBjb25zdCBoZXggPSBgIyR7W3IsIGcsIGJdLm1hcCgoYykgPT4gTWF0aC5yb3VuZChjICogMjU1KS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyl9YDtcbiAgICAgIHJldHVybiBbeyBuYW1lOiBpblNlbGVjdGlvbiA/ICdzZWxlY3RlZCBjZWxscycgOiAnYWxsIGNlbGxzJywgY29sb3I6IGhleCwgaW5kaWNlcyB9XTtcbiAgICB9XG5cbiAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBwb3J0LmdldENvbHVtbihjb2x1bW4pO1xuICAgIGlmICghaXNDYXRlZ29yaWNhbENvbHVtbihsb2FkZWQpKSByZXR1cm4gW107XG4gICAgY29uc3QgY29sb3JzID0gcmVzb2x2ZUNhdGVnb3J5Q29sb3JzKGxvYWRlZC5tZXRhKTtcbiAgICBjb25zdCBjb3VudHMgPSBuZXcgVWludDMyQXJyYXkobG9hZGVkLm1ldGEuY2F0ZWdvcmllcy5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICBpZiAoaW5TZWxlY3Rpb24gJiYgIWluU2VsZWN0aW9uW2ldKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGNvZGUgPSBsb2FkZWQuY29kZXNbaV07XG4gICAgICBpZiAoY29kZSAhPT0gTk9fQ0FURUdPUlkgJiYgY29kZSA8IGNvdW50cy5sZW5ndGgpIGNvdW50c1tjb2RlXSsrO1xuICAgIH1cbiAgICBjb25zdCByYW5rZWQgPSBBcnJheS5mcm9tKGNvdW50cywgKGNvdW50LCBjb2RlKSA9PiAoeyBjb2RlLCBjb3VudCB9KSlcbiAgICAgIC5maWx0ZXIoKGMpID0+IGMuY291bnQgPiAwKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGIuY291bnQgLSBhLmNvdW50KVxuICAgICAgLnNsaWNlKDAsIE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLkRFTlNJVFlfTUFYX0NMVVNURVJTKTtcbiAgICBpZiAoY291bnRzLmZpbHRlcigoYykgPT4gYyA+IDApLmxlbmd0aCA+IHJhbmtlZC5sZW5ndGgpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgYFtuYXBhcmktanNdICR7Y29sdW1ufTogZHJhd2luZyB0aGUgJHtyYW5rZWQubGVuZ3RofSBsYXJnZXN0IGNsdXN0ZXJzIGFzIGRlbnNpdHkgYCArXG4gICAgICAgICAgJ3ZvbHVtZXM7IG1vcmUgdGhhbiB0aGF0IHN0b3AgYmVpbmcgc2VwYXJhYmxlIGJ5IGV5ZScsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmFua2VkLm1hcCgoeyBjb2RlIH0pID0+IHtcbiAgICAgIGNvbnN0IGluZGljZXMgPSBuZXcgVWludDMyQXJyYXkoY291bnRzW2NvZGVdKTtcbiAgICAgIGxldCBrID0gMDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIGlmIChpblNlbGVjdGlvbiAmJiAhaW5TZWxlY3Rpb25baV0pIGNvbnRpbnVlO1xuICAgICAgICBpZiAobG9hZGVkLmNvZGVzW2ldID09PSBjb2RlKSBpbmRpY2VzW2srK10gPSBpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogbG9hZGVkLm1ldGEuY2F0ZWdvcmllc1tjb2RlXSxcbiAgICAgICAgY29sb3I6IGNvbG9yc1tjb2RlXSA/PyAnIzg4ODg4OCcsXG4gICAgICAgIGluZGljZXM6IGluZGljZXMuc3ViYXJyYXkoMCwgayksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCAob3Iga2VlcCkgdGhlIGRhdGFzZXQncyByZWZlcmVuY2Ugdm9sdW1lLCBhbmQgZGVyaXZlIHRoZSBvZmZzZXQgdGhhdCBzaXRzIHRoZVxuICAgKiBvYnNlcnZhdGlvbnMgaW5zaWRlIGl0LlxuICAgKlxuICAgKiBgVm9sdW1lTGF5ZXJgIGhhcyBubyB0cmFuc2xhdGU6IG5hcGFyaS1qcyBtYXBzIHRoZSB2b2x1bWUncyB1bml0IGN1YmUgdG8gYSB3b3JsZCBib3hcbiAgICogKipjZW50cmVkIG9uIHRoZSBvcmlnaW4qKiwgc2l6ZWQgYGRpbXMgeCB2b3hlbFNpemVgLiBUaGUgb2JzZXJ2YXRpb25zLCBieSBjb250cmFjdCwgYXJlIGluXG4gICAqIHRoZSB2b2x1bWUncyBvd24gZnJhbWUgd2l0aCBpdHMgbmVhciBjb3JuZXIgYXQgdGhlIGNvb3JkaW5hdGUgb3JpZ2luLiBTbyB0aGUgdHdvIG9ubHkgbGluZVxuICAgKiB1cCBpZiB0aGUgUE9JTlRTIG1vdmUg4oCUIGJ5IGhhbGYgdGhlIGJveCDigJQgd2hpY2ggaXMgd2hhdCB7QGxpbmsgc3BhdGlhbE9yaWdpbjNkfSBpcy5cbiAgICpcbiAgICogQSBmYWlsZWQgb3IgYWJzZW50IHZvbHVtZSBpcyBub3QgZmF0YWw6IHRoZSBjbG91ZCByZW5kZXJzIG9uIGl0cyBvd24sIGF0IGl0cyBvd25cbiAgICogY29vcmRpbmF0ZXMsIGFuZCB0aGUgY2FtZXJhIGZyYW1lcyB0aGUgcG9pbnRzIGluc3RlYWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZVNwYXRpYWxWb2x1bWUoXG4gICAgdmlld2VyOiBWaWV3ZXIsIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtZXRhID0gZGF0YXNldC52b2x1bWU7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc3BhdGlhbERhdGE7XG4gICAgY29uc3Qga2V5ID0gbWV0YSA/IGAke2RhdGFzZXQuaWR9OiR7bWV0YS53aWR0aH14JHttZXRhLmhlaWdodH14JHttZXRhLmRlcHRofWAgOiBudWxsO1xuICAgIGlmIChrZXkgJiYga2V5ID09PSB0aGlzLnNwYXRpYWxWb2x1bWVLZXkpIHJldHVybjtcblxuICAgIGlmICh0aGlzLnNwYXRpYWxWb2x1bWUpIHtcbiAgICAgIHZpZXdlci5sYXllcnMucmVtb3ZlKHRoaXMuc3BhdGlhbFZvbHVtZSk7XG4gICAgICB0aGlzLnNwYXRpYWxWb2x1bWUgPSBudWxsO1xuICAgICAgdGhpcy5zcGF0aWFsVm9sdW1lS2V5ID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5zcGF0aWFsT3JpZ2luM2QgPSBbMCwgMCwgMF07XG4gICAgaWYgKCFtZXRhIHx8ICFwb3J0Py5nZXRWb2x1bWUpIHJldHVybjtcblxuICAgIGxldCB2b3hlbHM6IFVpbnQ4QXJyYXk7XG4gICAgdHJ5IHtcbiAgICAgIHZveGVscyA9IGF3YWl0IHBvcnQuZ2V0Vm9sdW1lKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIHJlZmVyZW5jZSB2b2x1bWUgdW5hdmFpbGFibGUg4oCUIGRyYXdpbmcgdGhlIGNsb3VkIGFsb25lJywgZXJyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMudmlld2VyICE9PSB2aWV3ZXIpIHJldHVybjtcblxuICAgIGNvbnN0IFt2eCwgdnksIHZ6XSA9IG1ldGEudm94ZWxTaXplO1xuICAgIHRoaXMuc3BhdGlhbFZvbHVtZUtleSA9IGtleTtcbiAgICB0aGlzLnNwYXRpYWxWb2x1bWUgPSAoXG4gICAgICB2aWV3ZXIuYWRkVm9sdW1lKHZveGVscywgbWV0YS53aWR0aCwgbWV0YS5oZWlnaHQsIG1ldGEuZGVwdGgsIHtcbiAgICAgIG5hbWU6ICdyZWZlcmVuY2Ugdm9sdW1lJyxcbiAgICAgIGNvbG9ybWFwOiAnZ3JheScsXG4gICAgICAvLyBNSVAgd291bGQgZHJhdyB0aGUgYnJpZ2h0ZXN0IHZveGVsIGFsb25nIGVhY2ggcmF5LCB3aGljaCBmb3IgYW4gYXZlcmFnZWRcbiAgICAgIC8vIHRlbXBsYXRlIG1lYW5zIGEgZmxhdCB3aGl0ZSBzaGVsbCB0aGF0IGhpZGVzIHRoZSBjbG91ZC4gVHJhbnNsdWNlbnQgbGV0c1xuICAgICAgLy8gdGhlIHBvaW50cyByZWFkIHRocm91Z2ggdGhlIHRpc3N1ZSwgd2hpY2ggaXMgdGhlIGVudGlyZSBwb2ludCBvZiBkcmF3aW5nXG4gICAgICAvLyB0aGVtIHRvZ2V0aGVyLlxuICAgICAgcmVuZGVyaW5nOiAndHJhbnNsdWNlbnQnLFxuICAgICAgb3BhY2l0eTogdmlldy52b2x1bWVPcGFjaXR5LFxuICAgICAgICB2b3hlbFNpemU6IFt2eCwgdnksIHZ6XSxcbiAgICAgIH0pKTtcbiAgICAvLyBIYWxmIHRoZSBib3gsIG5lZ2F0ZWQ6IHRoZSBvYnNlcnZhdGlvbnMnIG9yaWdpbiBpcyB0aGUgYm94J3MgbmVhciBjb3JuZXIsXG4gICAgLy8gYW5kIHRoZSBib3ggaXMgY2VudHJlZCBvbiB0aGUgd29ybGQgb3JpZ2luLlxuICAgIHRoaXMuc3BhdGlhbE9yaWdpbjNkID0gW1xuICAgICAgLShtZXRhLndpZHRoICogdngpIC8gMixcbiAgICAgIC0obWV0YS5oZWlnaHQgKiB2eSkgLyAyLFxuICAgICAgLShtZXRhLmRlcHRoICogdnopIC8gMixcbiAgICBdO1xuICAgIC8vIEZvcmNlIGEgZ2VvbWV0cnkgcmVidWlsZDogdGhlIG9mZnNldCBjaGFuZ2VkLCBzbyBjYWNoZWQgcG9zaXRpb25zIGFyZSBzdGFsZS5cbiAgICB0aGlzLnNwYXRpYWxMYXllcktleTNkID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlU3BhdGlhbDNkTGF5ZXJzKHZpZXdlcjogVmlld2VyKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBsYXllciBvZiBbXG4gICAgICB0aGlzLnNwYXRpYWxQb2ludHMzZCwgdGhpcy5zcGF0aWFsVm9sdW1lLFxuICAgICAgdGhpcy5nZW5lTWFwVm9sdW1lTGF5ZXIsIC4uLnRoaXMuZGVuc2l0eUxheWVycyxcbiAgICBdKSB7XG4gICAgICBpZiAobGF5ZXIpIHZpZXdlci5sYXllcnMucmVtb3ZlKGxheWVyKTtcbiAgICB9XG4gICAgdGhpcy5nZW5lTWFwVm9sdW1lTGF5ZXIgPSBudWxsO1xuICAgIHRoaXMuZ2VuZU1hcFZvbHVtZUtleSA9IG51bGw7XG4gICAgdGhpcy5nZW5lTWFwVm9sdW1lRmllbGQgPSBudWxsO1xuICAgIHRoaXMuZ2VuZU1hcFZvbHVtZUZpZWxkS2V5ID0gbnVsbDtcbiAgICB0aGlzLmRlbnNpdHlMYXllcnMgPSBbXTtcbiAgICB0aGlzLmRlbnNpdHlLZXkgPSBudWxsO1xuICAgIC8vIFRoZSBzY2VuZSBpcyBnb25lLCBzbyB0aGUgbmV4dCAzRCBsYXllciBzaG91bGQgZnJhbWUgaXRzZWxmIGFnYWluLiBUaGF0IHVzZWQgdG8gYmVcbiAgICAvLyBgc3BhdGlhbEZyYW1lZCA9IG51bGxgIG5leHQgdG8gYSBoYW5kLXJvbGxlZCBzYXZlL3Jlc3RvcmU7IHRoZSByZW5kZXJlciBvd25zIHRoZVxuICAgIC8vIHBvbGljeSBub3csIGFuZCB0aGlzIGlzIHRoZSBzYW1lIHN0YXRlbWVudCBhZGRyZXNzZWQgdG8gaXQuXG4gICAgdmlld2VyLnJlc2V0Rml0M0QoKTtcbiAgICB0aGlzLnNwYXRpYWwyZEZyYW1lZCA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsVm9sdW1lID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxWb2x1bWVLZXkgPSBudWxsO1xuICAgIHRoaXMuc3BhdGlhbE9yaWdpbjNkID0gWzAsIDAsIDBdO1xuICAgIHRoaXMuc3BhdGlhbFBvaW50czNkID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxMYXllcktleTNkID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxTY2FsYXJLZXkzZCA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsUG9zaXRpb25zM2QgPSBudWxsO1xuICAgIHRoaXMuc3BhdGlhbERyYXduM2QgPSBudWxsO1xuICB9XG5cbiAgLyoqIEEgb25lLWNvbG91ciBjb2xvcm1hcCwgZm9yIHRoZSBcIm5vdGhpbmcgdG8gY29sb3VyIGJ5XCIgc3RhdGUuICovXG4gIHByaXZhdGUgc3BhdGlhbEZsYXRDb2xvcm1hcCgpOiBDb2xvcm1hcCB7XG4gICAgY29uc3QgW3IsIGcsIGJdID0gTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuU1BBVElBTF9ORVVUUkFMX0NPTE9SO1xuICAgIGNvbnN0IHJnYjogUmdiID0gW01hdGgucm91bmQociAqIDI1NSksIE1hdGgucm91bmQoZyAqIDI1NSksIE1hdGgucm91bmQoYiAqIDI1NSldO1xuICAgIC8vIFR3byBpZGVudGljYWwgc3RvcHM6IGNvbG9ybWFwRnJvbUx1dCBuZWVkcyBhdCBsZWFzdCB0d28sIGFuZCBlcXVhbCBlbmRzXG4gICAgLy8gbWFrZSBldmVyeSB2YWx1ZSByZXNvbHZlIHRvIHRoZSBzYW1lIGNvbG91ci5cbiAgICByZXR1cm4gY29sb3JtYXBGcm9tTHV0KCdzcGF0aWFsLWZsYXQnLCBbcmdiLCByZ2JdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcGVyLXBvaW50IHNjYWxhciArIGNvbG9ybWFwICsgd2luZG93IHRoYXQgY29sb3VyIHRoZSAzRCBjbG91ZC5cbiAgICpcbiAgICogQ29udGludW91cyBkYXRhIGlzIHRoZSBuYXR1cmFsIGZpdDogdmFsdWVzIGdvIHN0cmFpZ2h0IHRocm91Z2ggdGhlIGFjdGl2ZSBjb2xvcm1hcCB3aXRoIHRoZVxuICAgKiBzYW1lIHBlcmNlbnRpbGUgd2luZG93IHRoZSAyRCBwYXRoIHVzZXMuIENhdGVnb3JpY2FsIGRhdGEgaGFzIHRvIGJlIHNtdWdnbGVkIHRocm91Z2ggdGhlIHNhbWVcbiAgICogc2NhbGFyIGNoYW5uZWwg4oCUIHNlZSB7QGxpbmsgU1BBVElBTF8zRF9NQVhfQ0FURUdPUklFU30uIENvZGVzIG1hcCB0byBMVVQgYmxvY2tzLCBhbmRcbiAgICogYGNvbnRyYXN0TGltaXRzYCBvZiBgWy0wLjUsIEsgLSAwLjVdYCBwdXRzIGNvZGUgYGlgIGF0IHRoZSBjZW50cmUgb2YgYmxvY2sgYGlgLCB3aGljaCBpcyB3aGF0XG4gICAqIG1ha2VzIHRoZSByb3VuZC10cmlwIGV4YWN0IGluc3RlYWQgb2YgYXBwcm94aW1hdGVseSByaWdodC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc3BhdGlhbFNjYWxhcjNkKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICApOiBQcm9taXNlPFNwYXRpYWwzZEVuY29kaW5nIHwgbnVsbD4ge1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnNwYXRpYWxEYXRhO1xuICAgIGNvbnN0IGNvbG9yQnkgPSB2aWV3LmNvbG9yQnk7XG4gICAgaWYgKCFwb3J0IHx8ICFjb2xvckJ5KSByZXR1cm4gbnVsbDtcblxuICAgIGlmIChjb2xvckJ5LmtpbmQgPT09ICdjb2x1bW4nKSB7XG4gICAgICBjb25zdCBjb2x1bW46IFNwYXRpYWxDb2x1bW4gPSBhd2FpdCBwb3J0LmdldENvbHVtbihjb2xvckJ5Lm5hbWUpO1xuICAgICAgaWYgKGlzQ2F0ZWdvcmljYWxDb2x1bW4oY29sdW1uKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbmNvZGVTcGF0aWFsM2RDYXRlZ29yaWNhbChjb2x1bW4uY29kZXMsIHJlc29sdmVDYXRlZ29yeUNvbG9ycyhjb2x1bW4ubWV0YSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlU3BhdGlhbDNkQ29udGludW91cyhcbiAgICAgICAgY29sdW1uLnZhbHVlcywgdmlldywgdmlldy5sb2dTY2FsZSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlcyA9IGF3YWl0IHBvcnQuZ2V0RmVhdHVyZVZlY3Rvcihjb2xvckJ5Lm5hbWUpO1xuICAgIHJldHVybiB0aGlzLmVuY29kZVNwYXRpYWwzZENvbnRpbnVvdXMoXG4gICAgICB2YWx1ZXMsIHZpZXcsIHZpZXcubG9nU2NhbGUsXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBDYXRlZ29yeSBjb2RlcyDihpIgYSBzdGVwcGVkIExVVCwgZXhhY3QgZm9yIHVwIHRvIHtAbGluayBTUEFUSUFMXzNEX01BWF9DQVRFR09SSUVTfS4gKi9cbiAgcHJpdmF0ZSBlbmNvZGVTcGF0aWFsM2RDYXRlZ29yaWNhbChjb2RlczogVWludDE2QXJyYXksIGNvbG9yczogc3RyaW5nW10pOiBTcGF0aWFsM2RFbmNvZGluZyB8IG51bGwge1xuICAgIC8vIFNsb3QgMCBpcyByZXNlcnZlZCBmb3IgXCJubyBjYXRlZ29yeVwiLCBzbyB0aGUgcGFsZXR0ZSBvY2N1cGllcyAxLi5LIGFuZCB0aGVcbiAgICAvLyBibG9jayBjb3VudCBpcyBvbmUgbW9yZSB0aGFuIHRoZSBjYXRlZ29yeSBjb3VudCDigJQgd2hpY2ggaXMgd2h5IHRoZSBwdWJsaXNoZWRcbiAgICAvLyBjZWlsaW5nIGlzIDk1IGNhdGVnb3JpZXMgcmF0aGVyIHRoYW4gdGhlIExVVCdzIDk2IGRpc3Rpbmd1aXNoYWJsZSBibG9ja3MuXG4gICAgaWYgKGNvbG9ycy5sZW5ndGggPiBTUEFUSUFMXzNEX01BWF9DQVRFR09SSUVTKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbbmFwYXJpLWpzXSAke2NvbG9ycy5sZW5ndGh9IGNhdGVnb3JpZXMgZXhjZWVkcyB0aGUgJHtTUEFUSUFMXzNEX01BWF9DQVRFR09SSUVTfSB0aGUgM0QgYFxuICAgICAgICArIFwibGF5ZXIncyAyNTYtZW50cnkgTFVUIGNhbiBob2xkIGRpc3RpbmN0bHk7IGRyYXdpbmcgZmxhdCBpbnN0ZWFkIG9mIHdpdGggd3JvbmcgY29sb3Vyc1wiLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBrID0gY29sb3JzLmxlbmd0aCArIDE7XG4gICAgY29uc3QgcGFsZXR0ZTogUmdiW10gPSBbXG4gICAgICBNSVNTSU5HX0NPTE9SLFxuICAgICAgLi4uY29sb3JzLm1hcChwYXJzZUhleCksXG4gICAgXTtcbiAgICBjb25zdCBsdXQ6IFJnYltdID0gbmV3IEFycmF5KExVVF9TSVpFKTtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IExVVF9TSVpFOyBqKyspIHtcbiAgICAgIGx1dFtqXSA9IHBhbGV0dGVbTWF0aC5taW4oayAtIDEsIE1hdGguZmxvb3IoKGogKiBrKSAvIExVVF9TSVpFKSldO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZXMgPSBuZXcgRmxvYXQzMkFycmF5KGNvZGVzLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsdWVzW2ldID0gY29kZXNbaV0gPT09IE5PX0NBVEVHT1JZID8gMCA6IGNvZGVzW2ldICsgMTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlcyxcbiAgICAgIGNvbG9ybWFwOiBjb2xvcm1hcEZyb21MdXQoJ3NwYXRpYWwtY2F0ZWdvcmllcycsIGx1dCksXG4gICAgICBjb250cmFzdExpbWl0czogWy0wLjUsIGsgLSAwLjVdLFxuICAgIH07XG4gIH1cblxuICAvKiogQ29udGludW91cyB2YWx1ZXMg4oaSIHRoZSBhY3RpdmUgY29sb3JtYXAgb3ZlciBhIHBlcmNlbnRpbGUtY2xpcHBlZCB3aW5kb3cuICovXG4gIHByaXZhdGUgZW5jb2RlU3BhdGlhbDNkQ29udGludW91cyhcbiAgICBzb3VyY2U6IEZsb2F0MzJBcnJheSwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSwgbG9nOiBib29sZWFuLFxuICApOiBTcGF0aWFsM2RFbmNvZGluZyB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuY3VycmVudENvbG9ybWFwIGFzIHsgZGF0YT86IHsgdmFsdWU/OiB1bmtub3duIH0gfSB8IG51bGw7XG4gICAgY29uc3QgbHV0ID0gc3BhdGlhbENvbnRpbnVvdXNMdXQoXG4gICAgICBub2RlPy5kYXRhPy52YWx1ZSwgdGhpcy5jdXJyZW50UmV2ZXJzZSwgdmlldy5jb250aW51b3VzQ29sb3JtYXAsXG4gICAgKTtcbiAgICBjb25zdCBbbG8sIGhpXSA9IHZpZXcucGVyY2VudGlsZUNsaXAgPz8gWzAuMDEsIDAuOTldO1xuICAgIGxldCB2YWx1ZXMgPSBzb3VyY2U7XG4gICAgaWYgKGxvZykge1xuICAgICAgdmFsdWVzID0gbmV3IEZsb2F0MzJBcnJheShzb3VyY2UubGVuZ3RoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aDsgaSsrKSB2YWx1ZXNbaV0gPSBNYXRoLmxvZzFwKE1hdGgubWF4KDAsIHNvdXJjZVtpXSkpO1xuICAgIH1cbiAgICBjb25zdCBbbWluLCBtYXhdID0gY29udHJhc3RXaW5kb3codmFsdWVzLCBsbywgaGkpO1xuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZXMsXG4gICAgICBjb2xvcm1hcDogY29sb3JtYXBGcm9tTHV0KCdzcGF0aWFsLWNvbnRpbnVvdXMnLCBsdXQpLFxuICAgICAgLy8gQSBkZWdlbmVyYXRlIHdpbmRvdyB3b3VsZCBkaXZpZGUgYnkgemVybyBpbiB0aGUgc2hhZGVyJ3Mgbm9ybWFsaXNhdGlvbi5cbiAgICAgIGNvbnRyYXN0TGltaXRzOiBtYXggPiBtaW4gPyBbbWluLCBtYXhdIDogW21pbiwgbWluICsgMV0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXItb2JzZXJ2YXRpb24gY29sb3VycyBmb3IgdGhlIGN1cnJlbnQgdmlldyBzdGF0ZSwgb3IgYSBzaW5nbGUgZmxhdCBjb2xvdXIgd2hlbiBub3RoaW5nIGlzXG4gICAqIHNlbGVjdGVkIHRvIGNvbG91ciBieS4gQ2F0ZWdvcmljYWwgY29sdW1ucyB1c2UgdGhlIGNvbHVtbidzIG93biBwYWxldHRlOyBjb250aW51b3VzIGNvbHVtbnNcbiAgICogYW5kIGdlbmUgdmVjdG9ycyBnbyB0aHJvdWdoIHRoZSBhY3RpdmUgY29sb3JtYXAgd2l0aCBhIHBlcmNlbnRpbGUtY2xpcHBlZCB3aW5kb3cuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNwYXRpYWxGYWNlQ29sb3JzKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLCBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrLFxuICApOiBQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIHRvUmdiYVR1cGxlcz4gfCBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXT4ge1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnNwYXRpYWxEYXRhO1xuICAgIGNvbnN0IGNvbG9yQnkgPSB2aWV3LmNvbG9yQnk7XG4gICAgLy8gRXZlcnl0aGluZyBOT1Qgc2VsZWN0ZWQgaXMgbXV0ZWQ7IHdpdGggbm90aGluZyBzZWxlY3RlZCwgbm90aGluZyBpcyBtdXRlZFxuICAgIC8vIGFuZCB0aGUgd2hvbGUgdGlzc3VlIHJlYWRzIG5vcm1hbGx5ICh0aGUgQ29zTXggaGlnaGxpZ2h0LXZzLW11dGUgcnVsZSkuXG4gICAgY29uc3QgbXV0ZWQgPSBtdXRlZEZyb21TZWxlY3Rpb24oc2VsZWN0aW9uKTtcblxuICAgIGlmICghcG9ydCB8fCAhY29sb3JCeSkge1xuICAgICAgY29uc3QgW3IsIGcsIGJdID0gTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuU1BBVElBTF9ORVVUUkFMX0NPTE9SO1xuICAgICAgLy8gR2VudWluZWx5IHVuaWZvcm06IG9uZSBicm9hZGNhc3QgdHVwbGUsIHNvIGEgZmxhdCA4NGstb2JzZXJ2YXRpb24gdmlld1xuICAgICAgLy8gZG9lcyBub3QgYWxsb2NhdGUgODRrIG9mIHRoZW0uXG4gICAgICBpZiAoIW11dGVkICYmIHZpZXcub3BhY2l0eSA+PSAxKSByZXR1cm4gTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuU1BBVElBTF9ORVVUUkFMX0NPTE9SO1xuICAgICAgLy8gTm90IHVuaWZvcm0g4oCUIHRoZSBvcGFjaXR5IGNvbnRyb2wgb3IgYSBzZWxlY3Rpb24gdmFyaWVzIHRoZSBhbHBoYSwgc28gaXRcbiAgICAgIC8vIGhhcyB0byBiZSBwZXItcG9pbnQuIFJldHVybmluZyB0aGUgY29uc3RhbnQgdHVwbGUgaGVyZSBpcyB3aGF0IG1hZGUgdGhlXG4gICAgICAvLyBPcGFjaXR5IHNsaWRlciBkbyBub3RoaW5nIGluIHRoZSBkZWZhdWx0IHN0YXRlLCB3aGljaCBpcyB0aGUgc3RhdGUgYW55b25lXG4gICAgICAvLyBsYW5kcyBpbiBiZWZvcmUgcGlja2luZyBhIGNvbG91ciBzb3VyY2UuXG4gICAgICBjb25zdCBoZXggPSBgIyR7W3IsIGcsIGJdLm1hcCgoYykgPT4gTWF0aC5yb3VuZChjICogMjU1KS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyl9YDtcbiAgICAgIHJldHVybiB0b1JnYmFUdXBsZXMoZW5jb2RlQ2F0ZWdvcmljYWwobmV3IFVpbnQxNkFycmF5KGRhdGFzZXQub2JzZXJ2YXRpb25zLmNvdW50KSwge1xuICAgICAgICBjb2xvcnM6IFtoZXhdLFxuICAgICAgICBvcGFjaXR5OiB2aWV3Lm9wYWNpdHksXG4gICAgICAgIG11dGVkLFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIGlmIChjb2xvckJ5LmtpbmQgPT09ICdjb2x1bW4nKSB7XG4gICAgICBjb25zdCBjb2x1bW46IFNwYXRpYWxDb2x1bW4gPSBhd2FpdCBwb3J0LmdldENvbHVtbihjb2xvckJ5Lm5hbWUpO1xuICAgICAgaWYgKGlzQ2F0ZWdvcmljYWxDb2x1bW4oY29sdW1uKSkge1xuICAgICAgICBjb25zdCByZ2JhID0gZW5jb2RlQ2F0ZWdvcmljYWwoY29sdW1uLmNvZGVzLCB7XG4gICAgICAgICAgY29sb3JzOiByZXNvbHZlQ2F0ZWdvcnlDb2xvcnMoY29sdW1uLm1ldGEpLFxuICAgICAgICAgIG9wYWNpdHk6IHZpZXcub3BhY2l0eSxcbiAgICAgICAgICBtdXRlZCxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEdyb3VwcyBzd2l0Y2hlZCBvZmYgaW4gdGhlIENlbGxzIHBhbmVsIGhpZGUgdGhlaXIgZG90cyB0b28sIHdoZW4gdGhlIGRvdHMgYXJlXG4gICAgICAgIC8vIGNvbG91cmVkIGJ5IHRoYXQgc2FtZSBncm91cGluZy5cbiAgICAgICAgY29uc3QgZ3JvdXBDb2x1bW4gPSBjZWxsVHlwZUNvbHVtbkZvcihkYXRhc2V0LCB2aWV3KTtcbiAgICAgICAgaWYgKHZpZXcuaGlkZGVuR3JvdXBzPy5sZW5ndGggJiYgZ3JvdXBDb2x1bW4gPT09IGNvbG9yQnkubmFtZSkge1xuICAgICAgICAgIGNvbnN0IG9mZiA9IG5ldyBTZXQodmlldy5oaWRkZW5Hcm91cHMpO1xuICAgICAgICAgIGNvbnN0IGhpZGUgPSBjb2x1bW4ubWV0YS5jYXRlZ29yaWVzLm1hcCgoYykgPT4gb2ZmLmhhcyhjKSk7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2x1bW4uY29kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGMgPSBjb2x1bW4uY29kZXNbaV07XG4gICAgICAgICAgICBpZiAoYyAhPT0gTk9fQ0FURUdPUlkgJiYgaGlkZVtjXSkgcmdiYVs0ICogaSArIDNdID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRvUmdiYVR1cGxlcyhyZ2JhKTtcbiAgICAgIH1cbiAgICAgIC8vIEEgY29udGludW91cyBjb2x1bW4gbWF5IGNhcnJ5IGl0cyBvd24gbG9nIGhpbnQgKGNvdW50cyk7IHRoZSB2aWV3J3NcbiAgICAgIC8vIHRvZ2dsZSB3aW5zIG9uY2UgdGhlIHVzZXIgaGFzIHNldCBpdC5cbiAgICAgIHJldHVybiB0b1JnYmFUdXBsZXModGhpcy5lbmNvZGVTcGF0aWFsQ29udGludW91cyhcbiAgICAgICAgY29sdW1uLnZhbHVlcywgdmlldywgdmlldy5sb2dTY2FsZSwgbXV0ZWQsXG4gICAgICApKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZXMgPSBhd2FpdCBwb3J0LmdldEZlYXR1cmVWZWN0b3IoY29sb3JCeS5uYW1lKTtcbiAgICByZXR1cm4gdG9SZ2JhVHVwbGVzKHRoaXMuZW5jb2RlU3BhdGlhbENvbnRpbnVvdXMoXG4gICAgICB2YWx1ZXMsIHZpZXcsIHZpZXcubG9nU2NhbGUsIG11dGVkLFxuICAgICkpO1xuICB9XG5cbiAgLyoqIENvbnRpbnVvdXMgdmFsdWVzIOKGkiBSR0JBIHRocm91Z2ggdGhlIGFjdGl2ZSBjb2xvcm1hcCBhbmQgYSBjbGlwcGVkIHdpbmRvdy4gKi9cbiAgcHJpdmF0ZSBlbmNvZGVTcGF0aWFsQ29udGludW91cyhcbiAgICB2YWx1ZXM6IEZsb2F0MzJBcnJheSwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSwgbG9nOiBib29sZWFuLFxuICAgIG11dGVkOiBVaW50OEFycmF5IHwgbnVsbCA9IG51bGwsXG4gICk6IEZsb2F0MzJBcnJheSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuY3VycmVudENvbG9ybWFwIGFzIHsgZGF0YT86IHsgdmFsdWU/OiB1bmtub3duIH0gfSB8IG51bGw7XG4gICAgY29uc3QgbHV0ID0gc3BhdGlhbENvbnRpbnVvdXNMdXQoXG4gICAgICBub2RlPy5kYXRhPy52YWx1ZSwgdGhpcy5jdXJyZW50UmV2ZXJzZSwgdmlldy5jb250aW51b3VzQ29sb3JtYXAsXG4gICAgKTtcbiAgICBjb25zdCBbbG8sIGhpXSA9IHZpZXcucGVyY2VudGlsZUNsaXAgPz8gWzAuMDEsIDAuOTldO1xuICAgIGNvbnN0IFttaW4sIG1heF0gPSBjb250cmFzdFdpbmRvdyh2YWx1ZXMsIGxvLCBoaSk7XG4gICAgcmV0dXJuIGVuY29kZUNvbnRpbnVvdXModmFsdWVzLCB7IGx1dCwgbWluLCBtYXgsIGxvZywgb3BhY2l0eTogdmlldy5vcGFjaXR5LCBtdXRlZCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3VudCB0aGUgTkFQQVJJX1NDQVRURVIzRCAzRCBzY2F0dGVyOiB0aGUgZG93bnNhbXBsZWQgdm94ZWwgZ3JpZCBhcyBhIDNEIHBvaW50IGNsb3VkIGNvbG9yZWRcbiAgICogYnkgaW50ZW5zaXR5IChuYXBhcmktanMgYW5hbG9nIG9mIFBsb3RseSdzIHZveGVsIHNjYXR0ZXIzZCkuIEFzc2VtYmxlcyBhIGNvYXJzZSB2b2x1bWUsIHRoZW5cbiAgICogZW1pdHMgYSBmbGF0LXN0cmlkZWQgc2FtcGxlIG9mIHZveGVscyAoY2FwcGVkIGF0IHtAbGluayBTQ0FUVEVSM0RfTUFYX1BPSU5UU30pIHZpYSBgYWRkUG9pbnRzM0RgLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBtb3VudFNjYXR0ZXIzZCh2aWV3ZXI6IFZpZXdlciwgaW5mbzogSUltYWdlSW5mbyB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuaW1hZ2VNb2RlID0gJ2dyYXlzY2FsZSc7XG4gICAgdGhpcy52b2x1bWVNdWx0aWNoYW5uZWwgPSBmYWxzZTtcbiAgICBjb25zdCByZXMgPSB2b2x1bWVSZXNvbHV0aW9uRm9yKHRoaXMucmVzb2x1dGlvblNjYWxlKTtcbiAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dCh0cnVlKTtcbiAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICAgIGxldCB2b2w6IHsgZGF0YTogVWludDhBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXI7IGRlcHRoOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICB2b2wgPSBhd2FpdCB0aGlzLmFzc2VtYmxlVm9sdW1lKGluZm8sIHtcbiAgICAgICAgbWF4U2xpY2U6IE1hdGgubWluKHJlcy5tYXhTbGljZSwgU0NBVFRFUjNEX01BWF9YWSksXG4gICAgICAgIHNsaWNlU3RlcDogcmVzLnNsaWNlU3RlcCxcbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICAgIH1cbiAgICBpZiAoIXZvbCB8fCB0aGlzLnZpZXdlciAhPT0gdmlld2VyKSByZXR1cm47XG5cbiAgICBjb25zdCB7IGRhdGEsIHdpZHRoLCBoZWlnaHQsIGRlcHRoIH0gPSB2b2w7XG4gICAgY29uc3QgelNjYWxlID0gTWF0aC5tYXgod2lkdGgsIGhlaWdodCkgLyBNYXRoLm1heCgxLCBkZXB0aCk7IC8vIOKJiCBjdWJpYyBhc3BlY3RcbiAgICBjb25zdCB0b3RhbCA9IHdpZHRoICogaGVpZ2h0ICogZGVwdGg7XG4gICAgY29uc3Qgc3RyaWRlID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHRvdGFsIC8gU0NBVFRFUjNEX01BWF9QT0lOVFMpKTtcbiAgICBjb25zdCBwb3M6IG51bWJlcltdID0gW107XG4gICAgY29uc3QgdmFsOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG90YWw7IGkgKz0gc3RyaWRlKSB7XG4gICAgICBjb25zdCB4ID0gaSAlIHdpZHRoO1xuICAgICAgY29uc3QgeSA9IE1hdGguZmxvb3IoaSAvIHdpZHRoKSAlIGhlaWdodDtcbiAgICAgIGNvbnN0IHppID0gTWF0aC5mbG9vcihpIC8gKHdpZHRoICogaGVpZ2h0KSk7XG4gICAgICBwb3MucHVzaCh4LCB5LCB6aSAqIHpTY2FsZSk7XG4gICAgICB2YWwucHVzaChkYXRhW2ldKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdCA9IHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKVswXTtcbiAgICB0aGlzLnNjYXR0ZXIzZExheWVyID0gdmlld2VyLmFkZFBvaW50czNEKG5ldyBGbG9hdDMyQXJyYXkocG9zKSwgbmV3IEZsb2F0MzJBcnJheSh2YWwpLCB7XG4gICAgICBjb2xvcm1hcDogdGhpcy52b2x1bWVDb2xvcm1hcChzdCksXG4gICAgICBjb250cmFzdExpbWl0czogW3N0Py5taW4gPz8gMCwgc3Q/Lm1heCA/PyAyNTVdLFxuICAgICAgc2l6ZTogMyxcbiAgICB9KTtcbiAgICB0aGlzLmltYWdlVyA9IHdpZHRoO1xuICAgIHRoaXMuaW1hZ2VIID0gaGVpZ2h0O1xuICAgIHRoaXMudm9sdW1lRGltcyA9IHsgd2lkdGgsIGhlaWdodCwgZGVwdGggfTtcbiAgICAvLyBGZWVkIHRoZSBpbnRlbnNpdHkgaGlzdG9ncmFtIGZyb20gdGhlIGFzc2VtYmxlZCB2b2x1bWUgKGtleSAwKS5cbiAgICB0aGlzLnZvbHVtZUNoYW5uZWxEYXRhLmNsZWFyKCk7XG4gICAgdGhpcy52b2x1bWVDaGFubmVsRGF0YS5zZXQoMCwgZGF0YSk7XG4gICAgdGhpcy5zdWJzY3JpYmVTY2F0dGVyM2REaXNwbGF5U3RhdGUoKTtcbiAgICB0aGlzLnNjaGVkdWxlUmVhZGJhY2soKTtcbiAgfVxuXG4gIC8qKiBTdG9yZSBjb2xvcm1hcCAvIHJldmVyc2UgLyBpbnZlcnQgLyBjaGFubmVsIHdpbmRvdyDihpIgdGhlIDNEIHNjYXR0ZXIncyBjb2xvcm1hcCArIGNvbnRyYXN0LiAqL1xuICBwcml2YXRlIHN1YnNjcmliZVNjYXR0ZXIzZERpc3BsYXlTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BsYXlTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5kaXNwbGF5U3ViID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnN0b3JlLmdldENvbG9ybWFwKCksXG4gICAgICB0aGlzLnN0b3JlLmdldFJldmVyc2VTY2FsZSgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRJbnZlcnQoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q2hhbm5lbFN0YXRlcygpLFxuICAgIF0pLnN1YnNjcmliZSgoW2NvbG9ybWFwLCByZXZlcnNlLCBpbnZlcnQsIGNoYW5uZWxzXSkgPT4ge1xuICAgICAgdGhpcy5jdXJyZW50Q29sb3JtYXAgPSAoY29sb3JtYXAgYXMgQ29sb3JtYXBOb2RlKSA/PyBudWxsO1xuICAgICAgdGhpcy5jdXJyZW50UmV2ZXJzZSA9IHJldmVyc2U7XG4gICAgICB0aGlzLmludmVydEVuYWJsZWQgPSBpbnZlcnQ7XG4gICAgICBjb25zdCBsYXllciA9IHRoaXMuc2NhdHRlcjNkTGF5ZXI7XG4gICAgICBpZiAoIWxheWVyKSByZXR1cm47XG4gICAgICBjb25zdCBzdCA9IGNoYW5uZWxzWzBdO1xuICAgICAgbGF5ZXIuY29sb3JtYXAgPSB0aGlzLnZvbHVtZUNvbG9ybWFwKHN0KTtcbiAgICAgIGlmIChzdCkgbGF5ZXIuY29udHJhc3RMaW1pdHMgPSBbc3QubWluLCBzdC5tYXhdO1xuICAgICAgdGhpcy52aWV3ZXI/LnJlcXVlc3RSZW5kZXIoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3VudCB0aGUgTkFQQVJJX1NVUkZBQ0UgaGVpZ2h0LWZpZWxkIHN1cmZhY2UuIEEgaGVpZ2h0IGZpZWxkIGlzIHNpbmdsZS1zY2FsYXIsIHNvIGZvciBhXG4gICAqIG11bHRpY2hhbm5lbCBpbWFnZSB0aGUgc3VyZmFjZSBmb2xsb3dzIE9ORSBiYW5kIOKAlCB0aGUgZmlyc3QgdmlzaWJsZSBjaGFubmVsIChmYWxsYmFjayAwKSDigJRcbiAgICogY29sb3VyZWQgYnkgdGhhdCBjaGFubmVsJ3Mgd2luZG93L2NvbG9ybWFwIChsaWtlIHRoZSBQbG90bHkgU1VSRkFDRSwgd2hpY2ggaXMgZ3JheXNjYWxlLW9ubHkpLlxuICAgKiBQcmUtbG9hZHMgZXZlcnkgc2xpY2UncyBoZWlnaHQgZGF0YSB3aXRoIGEgcHJvZ3Jlc3MgYmFyIChhcyB0aGUgdm9sdW1lIGRvZXMpIHNvIHRoZSBzdGFja1xuICAgKiBzbGlkZXIgcmUtc2xpY2VzIGluc3RhbnRseSwgdGhlbiBidWlsZHMgdGhlIG1lc2ggZm9yIHRoZSBjdXJyZW50IHNsaWNlLiBBbGwgbWVzaCArIEdQVSB3b3JrXG4gICAqIGxpdmVzIGluIG5hcGFyaS1qcyAoYGhlaWdodEZpZWxkYCArIGBWaWV3ZXIuYWRkU3VyZmFjZWApOyB0aGlzIGJhY2tlbmQgc3VwcGxpZXMgc2NhbGFyIHNsaWNlcy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbW91bnRTdXJmYWNlKHZpZXdlcjogVmlld2VyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZGVzYyA9IGF3YWl0IHRoaXMuZW5zdXJlRGVzY3JpcHRvcigpO1xuICAgIGNvbnN0IGluZm8gPSB0aGlzLmxvYWRlZD8uaW1hZ2VJbmZvO1xuICAgIC8vIFNlcnZlcmxlc3MgbXVsdGljaGFubmVsICh0aWxlZDpmYWxzZSArIGNoYW5uZWxVcmxzKSBoYXMgbm8gZGVzY3JpcHRvciDigJQgZGV0ZWN0XG4gICAgLy8gaXQgZnJvbSBpbWFnZU1ldGEgc28gdGhlIFN1cmZhY2Ugc3RpbGwgZm9sbG93cyBvbmUgYmFuZC5cbiAgICBjb25zdCBzaW1wbGVNYyA9IHRoaXMuc2ltcGxlU3RhY2suaXNTaW1wbGUoaW5mbykgJiYgISFpbmZvPy5jaGFubmVsVXJscz8ubGVuZ3RoXG4gICAgICAmJiAoaW5mbz8uaW1hZ2VNZXRhPy5bMF0/LmNoYW5uZWxDb3VudCA/PyAxKSA+IDE7XG4gICAgY29uc3QgbXVsdGljaGFubmVsID0gc2ltcGxlTWMgfHwgKCEhZGVzYz8ubXVsdGljaGFubmVsICYmIChkZXNjPy5jaGFubmVscyA/PyAxKSA+IDEpO1xuICAgIHRoaXMuc3VyZmFjZU11bHRpY2hhbm5lbCA9IG11bHRpY2hhbm5lbDtcbiAgICAvLyBBIGhlaWdodCBmaWVsZCBpcyBzaW5nbGUtc2NhbGFyIOKGkiBmb2xsb3cgdGhlIHBhbmUtU0VMRUNURUQgY2hhbm5lbC5cbiAgICB0aGlzLnN1cmZhY2VDaGFubmVsID0gbXVsdGljaGFubmVsID8gdGhpcy5zdG9yZS5jdXJyZW50U2VsZWN0ZWRDaGFubmVsKCkgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5zdXJmYWNlTWF4R3JpZCA9IHN1cmZhY2VSZXNvbHV0aW9uRm9yKHRoaXMucmVzb2x1dGlvblNjYWxlKS5tYXhHcmlkO1xuICAgIHRoaXMuaW1hZ2VNb2RlID0gJ2dyYXlzY2FsZSc7XG4gICAgdGhpcy52b2x1bWVNdWx0aWNoYW5uZWwgPSBmYWxzZTtcbiAgICBhd2FpdCB0aGlzLnByZWxvYWRTdXJmYWNlUGxhbmVzKHZpZXdlcik7XG4gICAgaWYgKHRoaXMudmlld2VyICE9PSB2aWV3ZXIpIHJldHVybjtcbiAgICBhd2FpdCB0aGlzLmJ1aWxkU3VyZmFjZSh2aWV3ZXIsIHRoaXMubG9hZGVkPy56ID8/IDApO1xuICAgIHRoaXMuaW5zdGFsbFN1cmZhY2VBeGVzKHZpZXdlcik7XG4gICAgLy8gU3Vic2NyaWJlIGFmdGVyIHRoZSBmaXJzdCBidWlsZCBzbyBkaXNwbGF5LXN0YXRlIGVkaXRzIHRhcmdldCBhIGxpdmUgbGF5ZXIuXG4gICAgdGhpcy5zdWJzY3JpYmVTdXJmYWNlRGlzcGxheVN0YXRlKCk7XG4gIH1cblxuICAvKiogQWRkIHRoZSAzRCBheGVzIGdpem1vICsgRE9NIGxhYmVscyBhcm91bmQgdGhlIChvcmlnaW4tY2VudGVyZWQpIHN1cmZhY2UgbWVzaCwgbWF0Y2hpbmcgdGhlXG4gICAqICB2b2x1bWUvaXNvc3VyZmFjZS4gSW5zdGFsbGVkIG9uY2UgcGVyIG1vdW50OyB0aGUgYm94IHRyYWNrcyB0aGUgbWVzaCBib3VuZHMsIFgvWSBzaG93IHRoZVxuICAgKiAgcGh5c2ljYWwgKG9yIHBpeGVsKSBleHRlbnQsIGFuZCBaIGlzIHRoZSBpbnRlbnNpdHkvaGVpZ2h0IGF4aXMuICovXG4gIHByaXZhdGUgaW5zdGFsbFN1cmZhY2VBeGVzKHZpZXdlcjogVmlld2VyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnN1cmZhY2VMYXllcikgcmV0dXJuO1xuICAgIGNvbnN0IGIgPSB0aGlzLnN1cmZhY2VMYXllci5ib3VuZHMoKTtcbiAgICBjb25zdCBib3hXID0gTWF0aC5tYXgoMSwgYi5tYXhbMF0gLSBiLm1pblswXSk7XG4gICAgY29uc3QgYm94SCA9IE1hdGgubWF4KDEsIGIubWF4WzFdIC0gYi5taW5bMV0pO1xuICAgIGNvbnN0IGJveEQgPSBNYXRoLm1heCgxLCBiLm1heFsyXSAtIGIubWluWzJdKTtcbiAgICBjb25zdCBtcHBYID0gdGhpcy5kZXNjcmlwdG9yPy5tcHBYIHx8IHRoaXMubG9hZGVkPy5pbWFnZUluZm8uaW1hZ2VNZXRhPy5bMF0/Lm1wcFggfHwgMDtcbiAgICBjb25zdCB2b3hlbCA9IG1wcFggPiAwID8gKG1wcFggKiAodGhpcy5kZXNjcmlwdG9yPy53aWR0aCA/PyB0aGlzLmltYWdlVykpIC8gTWF0aC5tYXgoMSwgdGhpcy5pbWFnZVcpIDogMTtcbiAgICB0aGlzLmF4ZXNMYXllciA9IHZpZXdlci5hZGRBeGVzKGJveFcsIGJveEgsIGJveEQsIHtcbiAgICAgIHZveGVsU2l6ZTogW3ZveGVsLCB2b3hlbCwgMV0sXG4gICAgICB2aXNpYmxlOiB0aGlzLmF4ZXNWaXNpYmxlLFxuICAgIH0pO1xuICAgIGlmICh0aGlzLmhvc3QpIHtcbiAgICAgIHRoaXMuYXhlc0xhYmVscyA9IG5ldyBOYXBhcmlBeGVzTGFiZWxzKFxuICAgICAgICB0aGlzLmhvc3QsXG4gICAgICAgIHZpZXdlci5jYW1lcmEzZCxcbiAgICAgICAgdGhpcy5idWlsZFN1cmZhY2VBeGVzTGFiZWxzKGJveFcsIGJveEgsIGJveEQsIG1wcFgpLFxuICAgICAgKTtcbiAgICAgIHRoaXMuYXhlc0xhYmVscy5zZXRWaXNpYmxlKHRoaXMuYXhlc1Zpc2libGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBYL1kvWiBlbmQtbGFiZWxzIGZvciB0aGUgc3VyZmFjZSBnaXptbzogWC9ZIGFyZSB0aGUgcGh5c2ljYWwgKMK1bSkgb3IgcGl4ZWwgZXh0ZW50IG9mIHRoZSBGVUxMXG4gICAqICBpbWFnZTsgWiBpcyB0aGUgaW50ZW5zaXR5L2hlaWdodCBheGlzLiBBbmNob3JzIGFyZSBpbiB0aGUgY2VudGVyZWQgYm94IChtYXRjaGluZyBBeGVzTGF5ZXIpLiAqL1xuICBwcml2YXRlIGJ1aWxkU3VyZmFjZUF4ZXNMYWJlbHMoXG4gICAgYm94VzogbnVtYmVyLFxuICAgIGJveEg6IG51bWJlcixcbiAgICBib3hEOiBudW1iZXIsXG4gICAgbXBwWDogbnVtYmVyLFxuICApOiBBeGlzTGFiZWxTcGVjW10ge1xuICAgIGNvbnN0IGh4ID0gYm94VyAvIDI7XG4gICAgY29uc3QgaHkgPSBib3hIIC8gMjtcbiAgICBjb25zdCBoeiA9IGJveEQgLyAyO1xuICAgIGNvbnN0IGRlc2NXID0gdGhpcy5kZXNjcmlwdG9yPy53aWR0aCA/PyB0aGlzLmltYWdlVztcbiAgICBjb25zdCBkZXNjSCA9IHRoaXMuZGVzY3JpcHRvcj8uaGVpZ2h0ID8/IHRoaXMuaW1hZ2VIO1xuICAgIGNvbnN0IGxlbiA9IChweDogbnVtYmVyKTogc3RyaW5nID0+IChtcHBYID4gMCA/IGZvcm1hdFVtKHB4ICogbXBwWCkgOiBgJHtweH0gcHhgKTtcbiAgICByZXR1cm4gW1xuICAgICAgeyBhbmNob3I6IFtoeCwgLWh5LCAtaHpdLCB0ZXh0OiBgWCDCtyAke2xlbihkZXNjVyl9YCwgY29sb3I6ICcjZWQ0NTQ1JyB9LFxuICAgICAgeyBhbmNob3I6IFstaHgsIGh5LCAtaHpdLCB0ZXh0OiBgWSDCtyAke2xlbihkZXNjSCl9YCwgY29sb3I6ICcjNGRkOTU5JyB9LFxuICAgICAgeyBhbmNob3I6IFstaHgsIC1oeSwgaHpdLCB0ZXh0OiAnWiDCtyBpbnRlbnNpdHknLCBjb2xvcjogJyM2NjhjZmYnIH0sXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmUtZmV0Y2ggZXZlcnkgc3RhY2sgc2xpY2UncyBsdW1pbmFuY2UgcGxhbmUgKGRlY2ltYXRlZCB0byB0aGUgc3VyZmFjZSBncmlkKSBpbnRvXG4gICAqIHtAbGluayBzdXJmYWNlUGxhbmVzfSwgZHJpdmluZyB7QGxpbmsgc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkfSDigJQgdGhlIHNhbWUgbG9hZC13aXRoLXByb2dyZXNzIFVYXG4gICAqIGFzIHRoZSB2b2x1bWUsIGJ1dCBrZWVwaW5nIG9uZSAyRCBwbGFuZSBwZXIgc2xpY2UgcmF0aGVyIHRoYW4gcGFja2luZyBhIDNEIHZvbHVtZS4gQm91bmRlZFxuICAgKiBjb25jdXJyZW5jeSBrZWVwcyB0aGUgY29ubmVjdGlvbiBwb29sIGJ1c3kgd2l0aG91dCBmbG9vZGluZyBpdCBvbiBhIGRlZXAgc3RhY2suXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByZWxvYWRTdXJmYWNlUGxhbmVzKHZpZXdlcjogVmlld2VyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLmxvYWRUb2tlbjsgLy8gYmFpbCBpZiBhIENhbmNlbCAvIG5ldyBwbG90IGJ1bXBzIHRoaXMgd2hpbGUgd2UgZmV0Y2hcbiAgICBjb25zdCBpbmZvID0gdGhpcy5sb2FkZWQ/LmltYWdlSW5mbztcbiAgICBjb25zdCBkZXB0aCA9IGluZm8/LmltYWdlTWV0YT8uWzBdPy56IHx8IGluZm8/LnVybHM/Lmxlbmd0aCB8fCAxO1xuICAgIGNvbnN0IHsgbWF4R3JpZCB9ID0gc3VyZmFjZVJlc29sdXRpb25Gb3IodGhpcy5yZXNvbHV0aW9uU2NhbGUpO1xuICAgIHRoaXMuc3VyZmFjZVBsYW5lcy5jbGVhcigpO1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KHRydWUpO1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoMCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBlbmRpbmc6IG51bWJlcltdID0gW107XG4gICAgICBmb3IgKGxldCB6ID0gMDsgeiA8IGRlcHRoOyB6KyspIHBlbmRpbmcucHVzaCh6KTtcbiAgICAgIGxldCBkb25lID0gMDtcbiAgICAgIGNvbnN0IHdvcmtlciA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIGNvbnN0IHogPSBwZW5kaW5nLnNoaWZ0KCk7XG4gICAgICAgICAgaWYgKHogPT09IHVuZGVmaW5lZCB8fCB0aGlzLnZpZXdlciAhPT0gdmlld2VyIHx8IHRoaXMubG9hZFRva2VuICE9PSB0b2tlbikgcmV0dXJuO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnN1cmZhY2VQbGFuZXMuc2V0KHosIGF3YWl0IHRoaXMuZmV0Y2hTdXJmYWNlUGxhbmUoeiwgbWF4R3JpZCkpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBbbmFwYXJpLWpzXSBzdXJmYWNlIHNsaWNlICR7en0gcHJlbG9hZCBmYWlsZWRgLCBlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkb25lKys7XG4gICAgICAgICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dChNYXRoLnJvdW5kKChkb25lIC8gZGVwdGgpICogMTAwKSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBwb29sID0gTWF0aC5taW4oVk9MVU1FX0ZFVENIX0NPTkNVUlJFTkNZLCBNYXRoLm1heCgxLCBkZXB0aCkpO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoQXJyYXkuZnJvbSh7IGxlbmd0aDogcG9vbCB9LCAoKSA9PiB3b3JrZXIoKSkpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBzbGljZSBgemAgYXMgYSBzaW5nbGUgV0hPTEUtaW1hZ2UgbHVtaW5hbmNlIHBsYW5lIChkZWNpbWF0ZWQgdG8gYG1heEdyaWRgKS4gUHJlZmVycyB0aGVcbiAgICogYXBwJ3MgY29tcGxldGUgcGVyLXNsaWNlIGltYWdlIChgc21hbGxVcmxzYC9gdXJsc2AsIGV4YWN0bHkgbGlrZSB0aGUgUGxvdGx5IHN1cmZhY2UpIHNvIHRoZVxuICAgKiBzdXJmYWNlIGFsd2F5cyBjb3ZlcnMgdGhlIEZVTEwgc2xpY2Ug4oCUIHRoZSB0aWxlLXB5cmFtaWQgYGZldGNoU2xpY2VgIHBhdGggd291bGQgZmFsbCBiYWNrIHRvIGFcbiAgICogc2luZ2xlIHRvcC1sZWZ0IHRpbGUgKGEgY29ybmVyKSBmb3Igc2VsZi1jb250YWluZWQgLyBub24tYC90aWxlcy9pbmZvYCBpbWFnZXMuIEZhbGxzIGJhY2sgdG9cbiAgICogc3RpdGNoaW5nIHRoZSB0aWxlIGdyaWQgb25seSB3aGVuIG5vIGNvbXBsZXRlLWltYWdlIFVSTCBpcyBhdmFpbGFibGUuXG4gICAqL1xuICAvKiogVGlsZSBidWRnZXQgdG8gc3RpdGNoIGEgd2hvbGUgc2xpY2UgYXQgfmB0YXJnZXRQeGAgcmVzb2x1dGlvbiBmcm9tIHRoZSBweXJhbWlkOiBhIGhpZ2hlciB0YXJnZXRcbiAgICogIHB1bGxzIGEgRklORVIgcHlyYW1pZCBsZXZlbCAobW9yZSByZWFsIGRldGFpbCkuIFNoYXJlZCBieSB0aGUgc3VyZmFjZSBwbGFuZSBmZXRjaCBhbmQgdGhlIHZvbHVtZVxuICAgKiAgYXNzZW1ibHkgc28gYm90aCBzY2FsZSB0aGVpciBpbi1wbGFuZSByZXNvbHV0aW9uIHdpdGggdGhlIGRlY2ltYXRlIGZhY3Rvci4gKi9cbiAgcHJpdmF0ZSB0aWxlQnVkZ2V0Rm9yKHRhcmdldFB4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHRpbGVTaXplID0gdGhpcy5kZXNjcmlwdG9yPy50aWxlU2l6ZSB8fCBUSUxFX1NJWkU7XG4gICAgcmV0dXJuIE1hdGgubWluKFxuICAgICAgTUFYX1NUSVRDSF9USUxFUyxcbiAgICAgIE1hdGgubWF4KDEsIE1hdGgucm91bmQoKHRhcmdldFB4IC8gdGlsZVNpemUpICoqIDIgKiBTVElUQ0hfQlVER0VUX0NPRUZGKSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hTdXJmYWNlUGxhbmUoXG4gICAgejogbnVtYmVyLFxuICAgIG1heEdyaWQ6IG51bWJlcixcbiAgKTogUHJvbWlzZTx7IGRhdGE6IFVpbnQ4QXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBpbmZvID0gdGhpcy5sb2FkZWQ/LmltYWdlSW5mbztcbiAgICBjb25zdCBkZXNjID0gYXdhaXQgdGhpcy5lbnN1cmVEZXNjcmlwdG9yKCk7XG4gICAgbGV0IHBsYW5lOiB7IGRhdGE6IFVpbnQ4QXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcblxuICAgIC8vIFByZWZlcnJlZDogc3RpdGNoIHRoZSBXSE9MRSBzbGljZSBmcm9tIHRoZSBzZXJ2ZXIgcHlyYW1pZCBhdCBhIHJlc29sdXRpb24gZHJpdmVuIGJ5IHRoZVxuICAgIC8vIGRlY2ltYXRlIGZhY3RvciDigJQgYSBoaWdoZXIgdGFyZ2V0IGdyaWQgcHVsbHMgYSBGSU5FUiBweXJhbWlkIGxldmVsIChtb3JlIHJlYWwgZGV0YWlsKS4gV2l0aCBhXG4gICAgLy8gZGVzY3JpcHRvciwgZmV0Y2hTbGljZSBzdGl0Y2hlcyB0aGUgd2hvbGUgY2hvc2VuIGxldmVsIChuZXZlciBhIGNvcm5lciksIHRoZW4gd2UgZG93bnNjYWxlIHRvXG4gICAgLy8gdGhlIGdyaWQuIFRoaXMgaXMgd2hhdCBtYWtlcyBcIkZ1bGxcIiBhY3R1YWxseSBoaWdoZXItcmVzIHRoYW4gXCLCvVwiLCBub3QganVzdCBhIGZpeGVkIHByZXZpZXcuXG4gICAgaWYgKGRlc2M/LmxldmVscz8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBidWRnZXQgPSB0aGlzLnRpbGVCdWRnZXRGb3IobWF4R3JpZCk7XG4gICAgICAvLyBUaGUgc3VyZmFjZSBpcyBhIHNpbmdsZSBkZWNpbWF0ZWQgcGxhbmUsIHNvIHRoZSBjb21wb3NpdGUgZmFsbGJhY2sgaXMgYWNjZXB0YWJsZSB3aGVuIHRoZVxuICAgICAgLy8gY2hhbm5lbCBoYXMgbm8gc21hbGwgcHlyYW1pZCBsZXZlbCAoa2VlcHMgaXQgZmFzdCk7IGEgbXVsdGljaGFubmVsIFZPTFVNRSBtdXN0IG5vdCBkbyB0aGlzLlxuICAgICAgcGxhbmUgPSB0aGlzLmJpdG1hcFRvTHVtaW5hbmNlKFxuICAgICAgICBhd2FpdCB0aGlzLmZldGNoU2xpY2UoeiwgdGhpcy5zdXJmYWNlQ2hhbm5lbCwgYnVkZ2V0LCB0cnVlKSxcbiAgICAgICAgbWF4R3JpZCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgKG5vIHB5cmFtaWQpOiB0aGUgYXBwJ3MgQ09NUExFVEUgcGVyLXNsaWNlIGltYWdlICh1cmxzW3pdLCBub3QgdGhlIHNtYWxsIGJsdXJyeVxuICAgIC8vIHRodW1ibmFpbCkg4oCUIHdob2xlIHNsaWNlLCBhdm9pZHMgYSBjb3JuZXIgdGlsZS4gQ2FwcGVkIGF0IHRoZSBpbWFnZSdzIG93biByZXNvbHV0aW9uLlxuICAgIGlmICghcGxhbmUpIHtcbiAgICAgIGNvbnN0IHVybCA9IGluZm8/LnVybHM/Llt6XSA/PyBpbmZvPy5zbWFsbFVybHM/Llt6XTtcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgdGhpcy50aWxlc1xuICAgICAgICAgICAgLmdldEF1dGhIZWFkZXJzKClcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiAoe30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xuICAgICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVycyB9KTtcbiAgICAgICAgICBpZiAocmVzcC5vaykge1xuICAgICAgICAgICAgcGxhbmUgPSB0aGlzLmJpdG1hcFRvTHVtaW5hbmNlKGF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKGF3YWl0IHJlc3AuYmxvYigpKSwgbWF4R3JpZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtuYXBhcmktanNdIHN1cmZhY2UgdXJsIGZldGNoIGZhaWxlZCBmb3Igej0ke3p9YCwgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExhc3QgcmVzb3J0IChubyBweXJhbWlkIGFuZCBubyBjb21wbGV0ZSBpbWFnZSk6IGEgc2luZ2xlIHRpbGUuXG4gICAgaWYgKCFwbGFuZSkge1xuICAgICAgcGxhbmUgPSB0aGlzLmJpdG1hcFRvTHVtaW5hbmNlKFxuICAgICAgICBhd2FpdCB0aGlzLmZldGNoU2xpY2UoeiwgdGhpcy5zdXJmYWNlQ2hhbm5lbCwgdGhpcy50aWxlQnVkZ2V0Rm9yKG1heEdyaWQpLCB0cnVlKSxcbiAgICAgICAgbWF4R3JpZCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBwbGFuZTtcbiAgfVxuXG4gIC8qKiBUaGUgY2hhbm5lbCBzdGF0ZSBkcml2aW5nIHRoZSBzdXJmYWNlOiB0aGUgY2hvc2VuIGJhbmQgZm9yIG11bHRpY2hhbm5lbCAobWF0Y2hlZCBieSBpbmRleCksXG4gICAqICBlbHNlIHRoZSBzaW5nbGUgZ3JheXNjYWxlIGNoYW5uZWwuICovXG4gIHByaXZhdGUgc3VyZmFjZVN0YXRlKGNoYW5uZWxzOiBJQ2hhbm5lbFN0YXRlW10pOiBJQ2hhbm5lbFN0YXRlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5zdXJmYWNlQ2hhbm5lbCA9PSBudWxsKSByZXR1cm4gY2hhbm5lbHNbMF07XG4gICAgcmV0dXJuIGNoYW5uZWxzLmZpbmQoKHMpID0+IHMuaW5kZXggPT09IHRoaXMuc3VyZmFjZUNoYW5uZWwpID8/IGNoYW5uZWxzWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIChSZSlidWlsZCB0aGUgc3VyZmFjZSBtZXNoIGZvciBzbGljZSBgemAgZnJvbSB0aGUgcHJlLWxvYWRlZCBwbGFuZSBjYWNoZSAoaW5zdGFudCDigJQgdGhpcyBpc1xuICAgKiB3aGF0IHRoZSBzdGFjayBzbGlkZXIgY2FsbHMpOyBhIHNsaWNlIG1pc3NpbmcgZnJvbSB0aGUgY2FjaGUgaXMgZmV0Y2hlZCBvbiBkZW1hbmQuIG5hcGFyaS1qcydzXG4gICAqIHB1cmUgYGhlaWdodEZpZWxkYCBidWlsZHMgdGhlIHRyaWFuZ2xlIGdyaWQgKHogPSBub3JtYWxpemVkIGludGVuc2l0eSksIHRoZW4gYGFkZFN1cmZhY2VgXG4gICAqIHJlbmRlcnMgaXQuIFRoZSBzbGljZSBwbGFuZSBhbHNvIGZlZWRzIHRoZSBpbnRlbnNpdHkgaGlzdG9ncmFtIChrZXkgMCkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGJ1aWxkU3VyZmFjZSh2aWV3ZXI6IFZpZXdlciwgejogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHBsYW5lID0gdGhpcy5zdXJmYWNlUGxhbmVzLmdldCh6KTtcbiAgICBpZiAoIXBsYW5lKSB7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dCh0cnVlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBsYW5lID0gYXdhaXQgdGhpcy5mZXRjaFN1cmZhY2VQbGFuZSh6LCB0aGlzLnN1cmZhY2VNYXhHcmlkKTtcbiAgICAgICAgdGhpcy5zdXJmYWNlUGxhbmVzLnNldCh6LCBwbGFuZSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW25hcGFyaS1qc10gc3VyZmFjZSBzbGljZSBmZXRjaCBmYWlsZWQ6JywgZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFwbGFuZSB8fCBwbGFuZS53aWR0aCA8IDIgfHwgcGxhbmUuaGVpZ2h0IDwgMiB8fCB0aGlzLnZpZXdlciAhPT0gdmlld2VyKSByZXR1cm47XG5cbiAgICBjb25zdCBzdCA9IHRoaXMuc3VyZmFjZVN0YXRlKHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKSk7XG4gICAgY29uc3Qgd2luOiBbbnVtYmVyLCBudW1iZXJdID0gW3N0Py5taW4gPz8gMCwgc3Q/Lm1heCA/PyAyNTVdO1xuICAgIHRoaXMuc3VyZmFjZVdpbmRvdyA9IHdpbjtcbiAgICAvLyBIZWlnaHQgQU5EIGNvbG91ciBhcmUgbm9ybWFsaXplZCBieSB0aGUgc2FtZSBjb250cmFzdCB3aW5kb3csIHNvIGNoYW5naW5nIG1pbi9tYXggcmVzaGFwZXMgdGhlXG4gICAgLy8gc3VyZmFjZSAoYSBwaXhlbCdzIGhlaWdodCA9IGl0cyBpbnRlbnNpdHkgd2l0aGluIFttaW4sbWF4XSkuIENlbnRlciBpdCBmb3IgdGhlIGF4ZXMgZ2l6bW8uIFRoZVxuICAgIC8vIHBsYW5lIGlzIGFscmVhZHkgZGVjaW1hdGVkIHRvIHRoZSBncmlkIGNhcCDihpIgc3RyaWRlIDEuXG4gICAgY29uc3QgelNjYWxlID0gU1VSRkFDRV9aX0FTUEVDVCAqIE1hdGgubWF4KHBsYW5lLndpZHRoLCBwbGFuZS5oZWlnaHQpO1xuICAgIGNvbnN0IHsgdmVydGljZXMsIGZhY2VzLCB2YWx1ZXMgfSA9IGhlaWdodEZpZWxkKHBsYW5lLmRhdGEsIHBsYW5lLndpZHRoLCBwbGFuZS5oZWlnaHQsIHtcbiAgICAgIHpTY2FsZSxcbiAgICAgIHpMaW1pdHM6IHdpbixcbiAgICAgIGNlbnRlcjogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8vIFByZXNlcnZlIHRoZSBvcmJpdCBjYW1lcmEgYWNyb3NzIGEgcmUtc2xpY2UgLyB3aW5kb3cgcmVidWlsZCDigJQgb25seSB0aGUgZmlyc3QgbW91bnQgZnJhbWVzLCBzb1xuICAgIC8vIHN0ZXBwaW5nIHRoZSBzdGFjayBvciBjaGFuZ2luZyB0aGUgd2luZG93IGtlZXBzIHRoZSBjdXJyZW50IHpvb20vcGFuL29yaWVudGF0aW9uLlxuICAgIGNvbnN0IGNhbSA9IHZpZXdlci5jYW1lcmEzZDtcbiAgICBjb25zdCBwcmVzZXJ2ZUNhbWVyYSA9IHRoaXMuc3VyZmFjZUxheWVyICE9IG51bGw7XG4gICAgY29uc3Qgc2F2ZWRUYXJnZXQgPSBjYW0udGFyZ2V0O1xuICAgIGNvbnN0IHNhdmVkRGlzdGFuY2UgPSBjYW0uZGlzdGFuY2U7XG4gICAgaWYgKHRoaXMuc3VyZmFjZUxheWVyKSB7XG4gICAgICB2aWV3ZXIubGF5ZXJzLnJlbW92ZSh0aGlzLnN1cmZhY2VMYXllcik7XG4gICAgICB0aGlzLnN1cmZhY2VMYXllciA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuc3VyZmFjZUxheWVyID0gdmlld2VyLmFkZFN1cmZhY2UodmVydGljZXMsIGZhY2VzLCB2YWx1ZXMsIHtcbiAgICAgIGNvbG9ybWFwOiB0aGlzLnZvbHVtZUNvbG9ybWFwKHN0KSxcbiAgICAgIGNvbnRyYXN0TGltaXRzOiB3aW4sXG4gICAgICBnYW1tYTogc3Q/LmdhbW1hID8/IDEsXG4gICAgICB3aXJlZnJhbWU6IHRoaXMuc3VyZmFjZVdpcmVmcmFtZSxcbiAgICB9KTtcbiAgICBpZiAocHJlc2VydmVDYW1lcmEpIHtcbiAgICAgIGNhbS50YXJnZXQgPSBzYXZlZFRhcmdldDtcbiAgICAgIGNhbS5kaXN0YW5jZSA9IHNhdmVkRGlzdGFuY2U7XG4gICAgfVxuXG4gICAgdGhpcy5pbWFnZVcgPSBwbGFuZS53aWR0aDtcbiAgICB0aGlzLmltYWdlSCA9IHBsYW5lLmhlaWdodDtcbiAgICB0aGlzLnZvbHVtZURpbXMgPSB7IHdpZHRoOiBwbGFuZS53aWR0aCwgaGVpZ2h0OiBwbGFuZS5oZWlnaHQsIGRlcHRoOiBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKHpTY2FsZSkpIH07XG4gICAgLy8gUmV1c2UgdGhlIHZvbHVtZSBpbnRlbnNpdHktaGlzdG9ncmFtIHBhdGg6IHRoZSBzbGljZSdzIHNjYWxhciBwbGFuZSBpcyB0aGUgaGlzdG9ncmFtIHNvdXJjZS5cbiAgICB0aGlzLnZvbHVtZUNoYW5uZWxEYXRhLmNsZWFyKCk7XG4gICAgdGhpcy52b2x1bWVDaGFubmVsRGF0YS5zZXQoMCwgcGxhbmUuZGF0YSk7XG4gICAgdGhpcy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gIH1cblxuICAvKiogU3Vic2NyaWJlIHRoZSBzdG9yZSBjb2xvcm1hcCAvIHJldmVyc2UgLyBpbnZlcnQgLyBjaGFubmVsIHdpbmRvdyDihpIgdGhlIHN1cmZhY2UsIHNvIGhpc3RvZ3JhbVxuICAgKiAgJiBjaGFubmVsLWRpYWxvZyBlZGl0cyB1cGRhdGUgaXQgbGl2ZSB3aXRob3V0IGEgcmUtZmV0Y2guICoqbWluL21heCByZXNoYXBlcyB0aGUgc3VyZmFjZSdzXG4gICAqICBoZWlnaHQqKiAoYSBwaXhlbCdzIGhlaWdodCA9IGl0cyBpbnRlbnNpdHkgd2l0aGluIFttaW4sbWF4XSksIHNvIGEgd2luZG93IGNoYW5nZSByZWJ1aWxkcyB0aGVcbiAgICogIG1lc2ggZ2VvbWV0cnkgKGZyb20gdGhlIGNhY2hlZCBzbGljZSk7IGNvbG91ci1vbmx5IGVkaXRzIChjb2xvcm1hcC9MVVQsIGdhbW1hLCByZXZlcnNlLCBpbnZlcnQpXG4gICAqICBqdXN0IHVwZGF0ZSB0aGUgbGF5ZXIncyB1bmlmb3Jtcy4gKi9cbiAgcHJpdmF0ZSBzdWJzY3JpYmVTdXJmYWNlRGlzcGxheVN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGxheVN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmRpc3BsYXlTdWIgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXAoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0UmV2ZXJzZVNjYWxlKCksXG4gICAgICB0aGlzLnN0b3JlLmdldEludmVydCgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRDaGFubmVsU3RhdGVzKCksXG4gICAgICB0aGlzLnN0b3JlLmdldFNlbGVjdGVkQ2hhbm5lbCgpLFxuICAgIF0pLnN1YnNjcmliZSgoW2NvbG9ybWFwLCByZXZlcnNlLCBpbnZlcnQsIGNoYW5uZWxzLCBzZWxlY3RlZF0pID0+IHtcbiAgICAgIHRoaXMuY3VycmVudENvbG9ybWFwID0gKGNvbG9ybWFwIGFzIENvbG9ybWFwTm9kZSkgPz8gbnVsbDtcbiAgICAgIHRoaXMuY3VycmVudFJldmVyc2UgPSByZXZlcnNlO1xuICAgICAgdGhpcy5pbnZlcnRFbmFibGVkID0gaW52ZXJ0O1xuICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLnN1cmZhY2VMYXllcjtcbiAgICAgIGlmICghbGF5ZXIgfHwgIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgICAvLyBTZWxlY3RlZCBjaGFubmVsIGNoYW5nZWQgKG11bHRpY2hhbm5lbCk6IHJlLWZldGNoIFRIQVQgYmFuZCdzIHBsYW5lcyBhbmRcbiAgICAgIC8vIHJlYnVpbGQgdGhlIGhlaWdodC1maWVsZCBmb3IgdGhlIGN1cnJlbnQgc2xpY2UuXG4gICAgICBpZiAodGhpcy5zdXJmYWNlTXVsdGljaGFubmVsICYmIHNlbGVjdGVkICE9PSB0aGlzLnN1cmZhY2VDaGFubmVsKSB7XG4gICAgICAgIHRoaXMuc3VyZmFjZUNoYW5uZWwgPSBzZWxlY3RlZDtcbiAgICAgICAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IHRoaXMucHJlbG9hZFN1cmZhY2VQbGFuZXModGhpcy52aWV3ZXIhKTtcbiAgICAgICAgICBpZiAodGhpcy52aWV3ZXIpIGF3YWl0IHRoaXMuYnVpbGRTdXJmYWNlKHRoaXMudmlld2VyLCB0aGlzLmxvYWRlZD8ueiA/PyAwKTtcbiAgICAgICAgfSkoKS5jYXRjaCgoZXJyKSA9PiBjb25zb2xlLmVycm9yKCdbbmFwYXJpLWpzXSBzdXJmYWNlIGNoYW5uZWwgc3dpdGNoIGZhaWxlZDonLCBlcnIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3QgPSB0aGlzLnN1cmZhY2VTdGF0ZShjaGFubmVscyk7XG4gICAgICBjb25zdCB3aW46IFtudW1iZXIsIG51bWJlcl0gPSBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV07XG4gICAgICBjb25zdCB3aW5kb3dDaGFuZ2VkID1cbiAgICAgICAgIXRoaXMuc3VyZmFjZVdpbmRvdyB8fCB3aW5bMF0gIT09IHRoaXMuc3VyZmFjZVdpbmRvd1swXSB8fCB3aW5bMV0gIT09IHRoaXMuc3VyZmFjZVdpbmRvd1sxXTtcbiAgICAgIGlmICh3aW5kb3dDaGFuZ2VkKSB7XG4gICAgICAgIC8vIEhlaWdodCBmb2xsb3dzIHRoZSBjb250cmFzdCB3aW5kb3cg4oaSIHJlYnVpbGQgdGhlIG1lc2ggZm9yIHRoZSBuZXcgW21pbixtYXhdIChjYW1lcmEga2VwdCkuXG4gICAgICAgIHZvaWQgdGhpcy5idWlsZFN1cmZhY2UodGhpcy52aWV3ZXIsIHRoaXMubG9hZGVkPy56ID8/IDApLmNhdGNoKChlcnIpID0+XG4gICAgICAgICAgY29uc29sZS5lcnJvcignW25hcGFyaS1qc10gc3VyZmFjZSB3aW5kb3cgcmVidWlsZCBmYWlsZWQ6JywgZXJyKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gQ29sb3VyLW9ubHkgY2hhbmdlOiB1cGRhdGUgdW5pZm9ybXMgaW4gcGxhY2UsIG5vIGdlb21ldHJ5IHJlYnVpbGQuXG4gICAgICBsYXllci5jb2xvcm1hcCA9IHRoaXMudm9sdW1lQ29sb3JtYXAoc3QpO1xuICAgICAgaWYgKHN0KSB7XG4gICAgICAgIGxheWVyLmNvbnRyYXN0TGltaXRzID0gd2luO1xuICAgICAgICBsYXllci5nYW1tYSA9IHN0LmdhbW1hO1xuICAgICAgfVxuICAgICAgdGhpcy52aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmaXRDYW1lcmFTb29uKCk6IHZvaWQge1xuICAgIGNvbnN0IHJ1biA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmICh0aGlzLnZpZXdlciAmJiB0aGlzLmNhbnZhcyAmJiB0aGlzLmltYWdlVyA+IDAgJiYgdGhpcy5pbWFnZUggPiAwKSB7XG4gICAgICAgIHRoaXMudmlld2VyLmNhbWVyYS5maXQoXG4gICAgICAgICAgdGhpcy5pbWFnZVcsXG4gICAgICAgICAgdGhpcy5pbWFnZUgsXG4gICAgICAgICAgdGhpcy5jYW52YXMuY2xpZW50V2lkdGggfHwgdGhpcy5pbWFnZVcsXG4gICAgICAgICAgdGhpcy5jYW52YXMuY2xpZW50SGVpZ2h0IHx8IHRoaXMuaW1hZ2VILFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbicpIHJlcXVlc3RBbmltYXRpb25GcmFtZShydW4pO1xuICAgIGVsc2UgcnVuKCk7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgUGxvdGx5LXNwZWNpZmljOyBob3N0IHJlLWRyaXZlcyBwbG90KCkgZnJvbSBpdHMgaW1hZ2Ugc3RyZWFtLiAqL1xuICByZWxvYWRBbmRQbG90KCk6IHZvaWQge1xuICAgIC8qIG5vLW9wICovXG4gIH1cblxuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRUb2tlbisrOyAvLyBpbnZhbGlkYXRlIGFueSBpbi1mbGlnaHQgZnJhbWUgbG9hZGluZyBmcm9tIHRoZSBwcmV2aW91cyBwbG90XG4gICAgdGhpcy5kaXNwbGF5U3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZGlzcGxheVN1YiA9IG51bGw7XG4gICAgdGhpcy5zY2FsZUJhcj8uZGVzdHJveSgpO1xuICAgIHRoaXMuc2NhbGVCYXIgPSBudWxsO1xuICAgIHRoaXMubmF2aWdhdG9yPy5kZXN0cm95KCk7XG4gICAgdGhpcy5uYXZpZ2F0b3IgPSBudWxsO1xuICAgIHRoaXMucmVnaW9uT3ZlcmxheT8uZGVzdHJveSgpO1xuICAgIHRoaXMucmVnaW9uT3ZlcmxheSA9IG51bGw7XG4gICAgdGhpcy5heGVzTGFiZWxzPy5kZXN0cm95KCk7XG4gICAgdGhpcy5heGVzTGFiZWxzID0gbnVsbDtcbiAgICB0aGlzLnpIYW5kbGU/LmRlc3Ryb3koKTtcbiAgICB0aGlzLnpIYW5kbGUgPSBudWxsO1xuICAgIHRoaXMudm9sdW1lV29ybGRCYXNlID0gbnVsbDtcbiAgICB0aGlzLmNhY2hlZEltYWdlID0gbnVsbDtcbiAgICB0aGlzLmNhY2hlZEltYWdlU291cmNlID0gbnVsbDtcbiAgICB0aGlzLmxhc3RQaXhlbHNSZWN0ID0gbnVsbDtcbiAgICB0aGlzLm5hdGl2ZUhpc3RvZ3JhbXMuY2xlYXIoKTtcbiAgICB0aGlzLnRpbGVkID0gZmFsc2U7XG4gICAgdGhpcy5oaXN0U2FtcGxlcy5jbGVhcigpO1xuICAgIGlmICh0aGlzLnJlYWRiYWNrVGltZXIgIT0gbnVsbCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVhZGJhY2tUaW1lcik7XG4gICAgICB0aGlzLnJlYWRiYWNrVGltZXIgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmNhbWVyYVJlYWRiYWNrT2ZmPy4oKTtcbiAgICB0aGlzLmNhbWVyYVJlYWRiYWNrT2ZmID0gbnVsbDtcbiAgICB0aGlzLmNoYW5uZWxWaWV3ID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxUaWxlc01ncj8uZGV0YWNoKCk7XG4gICAgdGhpcy52aWV3ZXI/LmRpc3Bvc2UoKTtcbiAgICB0aGlzLnZpZXdlciA9IG51bGw7XG4gICAgaWYgKHRoaXMuY2FudmFzICYmIHRoaXMuaG9zdD8uY29udGFpbnModGhpcy5jYW52YXMpKSB0aGlzLmhvc3QucmVtb3ZlQ2hpbGQodGhpcy5jYW52YXMpO1xuICAgIHRoaXMuY2FudmFzID0gbnVsbDtcbiAgICB0aGlzLmxhc3RQaXhlbHMgPSBudWxsO1xuICAgIHRoaXMudm9sdW1lVmlldyA9IG51bGw7XG4gICAgdGhpcy52b2x1bWVNdWx0aWNoYW5uZWwgPSBmYWxzZTtcbiAgICB0aGlzLnN1cmZhY2VMYXllciA9IG51bGw7XG4gICAgdGhpcy5zdXJmYWNlQ2hhbm5lbCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnN1cmZhY2VQbGFuZXMuY2xlYXIoKTtcbiAgICB0aGlzLnN1cmZhY2VXaW5kb3cgPSBudWxsO1xuICAgIHRoaXMuc2NhdHRlclJlZ2lvblN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnNjYXR0ZXJSZWdpb25TdWIgPSBudWxsO1xuICAgIHRoaXMuc3BhdGlhbFN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnNwYXRpYWxTdWIgPSBudWxsO1xuICAgIHRoaXMucmVtb3ZlU3BhdGlhbEhvdmVyKCk7XG4gICAgdGhpcy5ob3ZlclNvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5ob3ZlclNvdXJjZUtleSA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsUG9pbnRzID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxMYXllcktleSA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsUG9pbnRzM2QgPSBudWxsO1xuICAgIHRoaXMuc3BhdGlhbExheWVyS2V5M2QgPSBudWxsO1xuICAgIHRoaXMuc3BhdGlhbFNjYWxhcktleTNkID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxWb2x1bWUgPSBudWxsO1xuICAgIHRoaXMuc3BhdGlhbFZvbHVtZUtleSA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsT3JpZ2luM2QgPSBbMCwgMCwgMF07XG4gICAgdGhpcy5zcGF0aWFsU2NhbGVCYXJLZXkgPSBudWxsO1xuICAgIC8vIERyb3AgdGhlIGNhY2hlZCBpbnRlcmxlYXZlZCBjb29yZGluYXRlcyB0b286IGhvbGRpbmcgMy43TSB4IDMgZmxvYXRzIGFmdGVyXG4gICAgLy8gYSB0ZWFyZG93biBpcyB+NDVNQiBvZiByZXRhaW5lZCBoZWFwIGZvciBhIHNjZW5lIHRoYXQgbm8gbG9uZ2VyIGV4aXN0cy5cbiAgICB0aGlzLnNwYXRpYWxQb3NpdGlvbnMzZCA9IG51bGw7XG4gICAgLy8gSW52YWxpZGF0ZSBhbnkgY29sb3VyIGZldGNoIHN0aWxsIGluIGZsaWdodCBzbyBpdCBjYW4ndCBhdHRhY2ggdG8gdGhlIG5leHQgc2NlbmUuXG4gICAgdGhpcy5zcGF0aWFsUmVidWlsZFRva2VuKys7XG4gICAgdGhpcy5zY2F0dGVyMmRQb2ludHMgPSBudWxsO1xuICAgIHRoaXMuc2NhdHRlcjNkTGF5ZXIgPSBudWxsO1xuICAgIHRoaXMuYXhlc0xheWVyID0gbnVsbDtcbiAgICB0aGlzLnZvbHVtZURpbXMgPSBudWxsO1xuICAgIHRoaXMudm9sdW1lQ2hhbm5lbERhdGEuY2xlYXIoKTtcbiAgfVxuXG4gIHJlbGF5b3V0KF90cnVlSW1hZ2VTaXplPzogbnVtYmVyW10pOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdlcj8ucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkIFBsb3RseS1zcGVjaWZpYyBheGlzIHJlc2V0LiAqL1xuICByZXNldEF4ZXMoKTogdm9pZCB7XG4gICAgdGhpcy5maXRDYW1lcmFTb29uKCk7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgUGxvdGx5LXNwZWNpZmljIGF1dG9zY2FsZS4gKi9cbiAgYXV0b3NjYWxlKCk6IHZvaWQge1xuICAgIHRoaXMuZml0Q2FtZXJhU29vbigpO1xuICAgIHRoaXMuYXV0b3NjYWxlRXZlbnQkLm5leHQodW5kZWZpbmVkKTtcbiAgfVxuXG4gIHpvb21JbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52aWV3ZXIpIHRoaXMudmlld2VyLmNhbWVyYS56b29tID0gdGhpcy52aWV3ZXIuY2FtZXJhLnpvb20gKiAxLjM7XG4gIH1cblxuICB6b29tT3V0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnZpZXdlcikgdGhpcy52aWV3ZXIuY2FtZXJhLnpvb20gPSB0aGlzLnZpZXdlci5jYW1lcmEuem9vbSAvIDEuMztcbiAgfVxuXG4gIHNldERyYWdNb2RlKF9tb2RlOiBzdHJpbmcgfCBmYWxzZSk6IHZvaWQge1xuICAgIC8vIE5vLW9wOiBwYW4gYW5kIHpvb20gYXJlIGFsd2F5cyB0aGUgbmFwYXJpIGNhbWVyYSdzIGRlZmF1bHQgZ2VzdHVyZXMsIGFuZCBwYW4vem9vbSBnYXRpbmcgZm9yXG4gICAgLy8gZHJhd2luZyBpcyBvd25lZCBieSB0aGUgcmVnaW9uIG92ZXJsYXkncyBzZXRNb2RlIChzZXRDb250cm9sc0VuYWJsZWQpLiBUb2dnbGluZyBjb250cm9scyBoZXJlXG4gICAgLy8gd291bGQgZmlnaHQgdGhhdCDigJQgdGhlIGhvc3QgY2FsbHMgc2V0RHJhZ01vZGUoZmFsc2UpIGFsb25nc2lkZSBvdmVybGF5LnNldE1vZGUoPHRvb2w+KS5cbiAgfVxuXG4gIHNldEltYWdlU21vb3RoaW5nRW5hYmxlZChlbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5pbWFnZVNtb290aGluZyA9IGVuYWJsZWQ7XG4gICAgLy8gQXBwbHkgbGl2ZSB0byB0aGUgcmVuZGVyZWQgaW1hZ2UgbGF5ZXJzOyBiYWtlZCBpbnRvIHRoZSBuZXh0IHJlbmRlciB0b28uXG4gICAgdGhpcy5jaGFubmVsVmlldz8uc2V0SW50ZXJwb2xhdGlvbihlbmFibGVkID8gJ2xpbmVhcicgOiAnbmVhcmVzdCcpO1xuICB9XG5cbiAgc2V0U2hvd1N0YWNrKF9zaG93c3RhY2s6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvKiBzdGFjayBuYXZpZ2F0ZWQgdmlhIHNldFpJbmRleCAqL1xuICB9XG5cbiAgc2V0WkluZGV4KHpJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubG9hZGVkKSB0aGlzLmxvYWRlZC56ID0gekluZGV4O1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBpZiAoIXYpIHJldHVybjtcbiAgICBpZiAodGhpcy5uYXZpZ2F0b3IpIHZvaWQgdGhpcy5yZWZyZXNoTmF2aWdhdG9ySW1hZ2UoekluZGV4KTtcbiAgICAvLyBTdXJmYWNlOiBvbmUgc2xpY2Ug4oaSIG9uZSBtZXNoLCBzbyByZS1idWlsZCB0aGUgaGVpZ2h0IGZpZWxkIGZvciB0aGUgbmV3IHNsaWNlLlxuICAgIGlmICh0aGlzLnN1cmZhY2VMYXllcikge1xuICAgICAgdm9pZCB0aGlzLmJ1aWxkU3VyZmFjZSh2LCB6SW5kZXgpLmNhdGNoKChlcnIpID0+XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tuYXBhcmktanNdIHNldFpJbmRleCBzdXJmYWNlIGZhaWxlZDonLCBlcnIpLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gVm9sdW1lIC8gaXNvc3VyZmFjZTogc3RlcCB0aGUgdm9sdW1lJ3MgeiBwbGFuZSBpbiBwbGFjZS5cbiAgICBpZiAodGhpcy52b2x1bWVWaWV3KSB7XG4gICAgICB2LmRpbXMueiA9IHpJbmRleDtcbiAgICAgIHRoaXMuc2NoZWR1bGVSZWFkYmFjaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBUaWxlZCAyRCBpbWFnZToganVzdCBtb3ZlIHRoZSBkaW1zIHBsYW5lIOKAlCB0aGUgdGlsZWQgdmlzdWFsIGZldGNoZXMgdGhlIG5ldyBzbGljZSdzIHRpbGVzXG4gICAgLy8gKGNhY2hlZCBwZXIgeiksIG5vIGxheWVyIHJlYnVpbGQuIFJlZnJlc2ggdGhlIGNvYXJzZSBoaXN0b2dyYW0gc2FtcGxlIGZvciB0aGUgbmV3IHNsaWNlLlxuICAgIGlmICh0aGlzLnRpbGVkKSB7XG4gICAgICB2LmRpbXMueiA9IHpJbmRleDtcbiAgICAgIGlmICh0aGlzLmRlc2NyaXB0b3IpIHZvaWQgdGhpcy5yZWZyZXNoSGlzdG9ncmFtU2FtcGxlcyh6SW5kZXgsIHRoaXMuZGVzY3JpcHRvcik7XG4gICAgICB0aGlzLnJlZHJhd1NwYXRpYWxNYXJrZXJzKCk7XG4gICAgICB0aGlzLnNjaGVkdWxlUmVhZGJhY2soKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gMkQgaW1hZ2UgKHN0aXRjaCBmYWxsYmFjayk6IHJlLXJlbmRlciB0aGUgc2xpY2UgKHJlLWZldGNoZXMgcGVyLWNoYW5uZWwgLyBjb21wb3NpdGUpLiBCcmFuY2hcbiAgICAvLyBvZiBhIHZvbHVtZSBsYXllciAobm90IGN1cnJlbnRQbG90VHlwZSwgd2hpY2ggY291bGQgYmUgc3RhbGUgYW5kIHNpbGVudGx5IG5vLW9wIHRoZSBzd2FwKS5cbiAgICAvLyBUaGUgdG9rZW4gbGV0cyByZW5kZXJJbWFnZSBkcm9wIGEgc3VwZXJzZWRlZCBzY3J1YiBzbyBhIHNsb3cgb2xkZXIgc2xpY2UgY2FuJ3QgY2xvYmJlciBhIG5ld2VyIG9uZS5cbiAgICBjb25zdCByZXEgPSArK3RoaXMuc2xpY2VSZXE7XG4gICAgdm9pZCB0aGlzLnJlbmRlckltYWdlKHpJbmRleCwgcmVxKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICBpZiAocmVxICE9PSB0aGlzLnNsaWNlUmVxKSByZXR1cm47XG4gICAgICAgIC8vIEFGVEVSIHRoZSBpbWFnZSwgbmV2ZXIgYmVmb3JlOiB0aGUgcmVuZGVyIGNsZWFycyB0aGUgbGF5ZXIgbGlzdCwgc29cbiAgICAgICAgLy8gbWFya2VycyBkcmF3biBmaXJzdCBhcmUgd2lwZWQgYnkgdGhlIHZlcnkgaW1hZ2UgbWVhbnQgdG8gc2l0IHVuZGVyIHRoZW0uXG4gICAgICAgIC8vIE92ZXIgYSB2b2x1bWUtYmFja2VkIGRhdGFzZXQgdGhlIHBsYW5lIGFsc28gZGVjaWRlcyB3aGljaCBvYnNlcnZhdGlvbnNcbiAgICAgICAgLy8gYXJlIGRyYXduIGF0IGFsbCwgc28gdGhpcyBpcyB3aGF0IG1vdmVzIHRoZSBjZWxscyB3aXRoIHRoZSBzZWN0aW9uLlxuICAgICAgICB0aGlzLnJlZHJhd1NwYXRpYWxNYXJrZXJzKCk7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVSZWFkYmFjaygpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiBjb25zb2xlLmVycm9yKCdbbmFwYXJpLWpzXSBzZXRaSW5kZXggc2xpY2UgZmFpbGVkOicsIGVycikpO1xuICB9XG5cbiAgc2V0U3RhY2tMb2FkaW5nKHN0YWNrTG9hZGluZzogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KHN0YWNrTG9hZGluZyk7XG4gIH1cblxuICAvKiogQ2FuY2VsIGluLWZsaWdodCBmcmFtZSBsb2FkaW5nOiBidW1wIHRoZSBsb2FkIGdlbmVyYXRpb24gc28gdGhlIHZvbHVtZS1hc3NlbWJseSAvIHN1cmZhY2VcbiAgICogIHByZWxvYWQgd29ya2VycyBzdG9wIGZldGNoaW5nIG1vcmUgZnJhbWVzLCBhbmQgY2xlYXIgdGhlIGxvYWRpbmcgZmxhZyArIHByb2dyZXNzLiAqL1xuICBjYW5jZWxMb2FkaW5nKCk6IHZvaWQge1xuICAgIHRoaXMubG9hZFRva2VuKys7XG4gICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoMCk7XG4gIH1cblxuICBpc1N0YWNrTG9hZGluZygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zdGFja0xvYWRpbmckLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0U3RhY2tMb2FkaW5nUHJvZ3Jlc3MoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXRUcnVlSW1hZ2VTaXplKCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmltYWdlVyA+IDAgJiYgdGhpcy5pbWFnZUggPiAwID8geyB3aWR0aDogdGhpcy5pbWFnZVcsIGhlaWdodDogdGhpcy5pbWFnZUggfSA6IG51bGw7XG4gIH1cblxuICBnZXRDdXJyZW50SW1hZ2UoKTogUHJvbWlzZTxJbWFnZSB8IG51bGw+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICB9XG5cbiAgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhKCk6IFBpeGVsRGF0YSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmxhc3RQaXhlbHM7XG4gIH1cblxuICBnZXREaXNwbGF5ZWRTb3VyY2VSZWN0KCk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsIHtcbiAgICBjb25zdCB2ID0gdGhpcy52aWV3ZXI7XG4gICAgY29uc3Qgc2l6ZSA9IHRoaXMuZ2V0VHJ1ZUltYWdlU2l6ZSgpO1xuICAgIGlmICghdiB8fCAhc2l6ZSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgciA9IHYudmlzaWJsZVdvcmxkUmVjdCgpO1xuICAgIGNvbnN0IHggPSBNYXRoLm1heCgwLCByLngpO1xuICAgIGNvbnN0IHkgPSBNYXRoLm1heCgwLCByLnkpO1xuICAgIHJldHVybiB7XG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIHdpZHRoOiBNYXRoLm1pbihzaXplLndpZHRoLCByLnggKyByLndpZHRoKSAtIHgsXG4gICAgICBoZWlnaHQ6IE1hdGgubWluKHNpemUuaGVpZ2h0LCByLnkgKyByLmhlaWdodCkgLSB5LFxuICAgIH07XG4gIH1cblxuICBkb3dubG9hZEltYWdlKCk6IHZvaWQge1xuICAgIHZvaWQgdGhpcy5leHBvcnRDb21wb3NpdGUoKTtcbiAgfVxuXG4gIHNldFBsb3RUeXBlKHBsb3RUeXBlOiBQbG90VHlwZSk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFBsb3RUeXBlID0gcGxvdFR5cGU7XG4gIH1cblxuICAvKiogTWFwIGEgUGxvdGx5LXN0eWxlIDNEIGRyYWcgbW9kZSBvbnRvIG5hcGFyaS1qcydzIGNhbWVyYSBkcmFnIG1vZGUuICovXG4gIHNldFN1cmZhY2VEcmFnTW9kZShtb2RlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgY29uc3QgbSA9IG1vZGUgPT09ICdwYW4nID8gJ3BhbicgOiBtb2RlID09PSAnem9vbScgPyAnem9vbScgOiAncm90YXRlJzsgLy8gb3JiaXQvdHVybnRhYmxlIOKGkiByb3RhdGVcbiAgICB0aGlzLnZpZXdlci5zZXRDYW1lcmFEcmFnTW9kZShtKTtcbiAgfVxuXG4gIC8qKiBSZS1mcmFtZSB0aGUgM0QgY2FtZXJhIG9uIHRoZSBjdXJyZW50IDNEIGxheWVyLiBBIHN1cmZhY2UgbWVzaCBzaXRzIGluIHRoZSBwb3NpdGl2ZSBvY3RhbnRcbiAgICogIChub3QgY2VudHJlZCksIHNvIGZyYW1lIGl0IGJ5IGl0cyBvd24gYm91bmRzOyBhIHZvbHVtZS9pc29zdXJmYWNlIHVzZXMgaXRzIGNlbnRyZWQgYm94LiAqL1xuICByZXNldFN1cmZhY2VDYW1lcmEoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpZXdlcikgcmV0dXJuO1xuICAgIGNvbnN0IG1lc2hMYXllciA9IHRoaXMuc3VyZmFjZUxheWVyID8/IHRoaXMuc2NhdHRlcjNkTGF5ZXI7XG4gICAgaWYgKG1lc2hMYXllcikge1xuICAgICAgY29uc3QgYiA9IG1lc2hMYXllci5ib3VuZHMoKTtcbiAgICAgIHRoaXMudmlld2VyLmNhbWVyYTNkLnRhcmdldCA9IGIuY2VudGVyO1xuICAgICAgdGhpcy52aWV3ZXIuY2FtZXJhM2QuZGlzdGFuY2UgPSBNYXRoLm1heChiLnJhZGl1cyAqIDIuNSwgMWUtMyk7XG4gICAgICB0aGlzLnZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGQgPSB0aGlzLnZvbHVtZURpbXM7XG4gICAgaWYgKGQpIHRoaXMudmlld2VyLmNhbWVyYTNkLmZyYW1lKGQud2lkdGgsIGQuaGVpZ2h0LCBkLmRlcHRoKTtcbiAgfVxuXG4gIGdldEF1dG9zY2FsZUV2ZW50KCk6IE9ic2VydmFibGU8dW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLmF1dG9zY2FsZUV2ZW50JC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldFBsb3RUeXBlRGVzY3JpcHRvcnMoKTogUGxvdFR5cGVEZXNjcmlwdG9yW10ge1xuICAgIC8vIFRoZSBXZWJHUFUgbmFwYXJpLWpzIG9wdGlvbnMsIG9mZmVyZWQgYWxvbmdzaWRlIChub3QgcmVwbGFjaW5nKSB0aGUgT1NEL1Bsb3RseSB0eXBlcy5cbiAgICByZXR1cm4gW1xuICAgICAgUExPVF9UWVBFX0RFU0NSSVBUT1JTW1Bsb3RUeXBlLk5BUEFSSV9JTUFHRV0hLFxuICAgICAgUExPVF9UWVBFX0RFU0NSSVBUT1JTW1Bsb3RUeXBlLk5BUEFSSV9TQ0FUVEVSXSEsXG4gICAgICBQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuTkFQQVJJX1NVUkZBQ0VdISxcbiAgICAgIFBMT1RfVFlQRV9ERVNDUklQVE9SU1tQbG90VHlwZS5OQVBBUklfU0NBVFRFUjNEXSEsXG4gICAgICBQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuTkFQQVJJX1ZPTFVNRV0hLFxuICAgICAgUExPVF9UWVBFX0RFU0NSSVBUT1JTW1Bsb3RUeXBlLk5BUEFSSV9JU09TVVJGQUNFXSEsXG4gICAgICAvLyBHYXRlZCBieSBgcmVxdWlyZXNTcGF0aWFsRGF0YWAsIHNvIHRoZSBzZWxlY3RvciBoaWRlcyBpdCB1bnRpbCBhIGRhdGFzZXQgaXMgcHVibGlzaGVkLlxuICAgICAgUExPVF9UWVBFX0RFU0NSSVBUT1JTW1Bsb3RUeXBlLlNQQVRJQUxfT01JQ1NdISxcbiAgICBdO1xuICB9XG5cbiAgLyoqIFRoZSBuYXBhcmkgM0QgZGVjaW1hdGUgZmFjdG9yICgxID0gZnVsbCDigKYgOCA9IOKFmykuIFJlYWQgYnkgdGhlIHRvb2xiYXIgdG8gaW5pdCB0aGUgY29udHJvbC4gKi9cbiAgZ2V0UmVzb2x1dGlvblNjYWxlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x1dGlvblNjYWxlO1xuICB9XG5cbiAgLyoqIFNldCB0aGUgZGVjaW1hdGUgZmFjdG9yIGZvciB0aGUgbmFwYXJpIDNEIHR5cGVzLiBUYWtlcyBlZmZlY3Qgb24gdGhlIG5leHQgKHJlKWxvYWQg4oCUIHRoZSBob3N0XG4gICAqICByZS1wbG90cyBhZnRlciBjYWxsaW5nIHRoaXMsIHNpbmNlIGRlY2ltYXRpb24gY2hhbmdlcyB0aGUgZmV0Y2hlZC9hc3NlbWJsZWQgZGF0YS4gKi9cbiAgc2V0UmVzb2x1dGlvblNjYWxlKHNjYWxlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJlc29sdXRpb25TY2FsZSA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoc2NhbGUpKTtcbiAgfVxuXG4gIGdldEludGVuc2l0eVByb2ZpbGUkKCk6IE9ic2VydmFibGU8SW50ZW5zaXR5UHJvZmlsZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5UHJvZmlsZSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICByZW5kZXJJbnRlbnNpdHlJbnNldChfZGl2SWQ6IHN0cmluZywgX3Byb2ZpbGVzOiBJbnRlbnNpdHlQcm9maWxlW10pOiB2b2lkIHtcbiAgICAvKiBQbG90bHkgb3ducyB0aGUgaW50ZW5zaXR5IGluc2V0ICovXG4gIH1cblxuICAvKiogUmVhZCB0aGUgZGlzcGxheWVkIGNvbXBvc2l0ZSBpbnRvIGBsYXN0UGl4ZWxzYCAodGhlIHBpeGVsLXRvb2xzJyBzb3VyY2UpICsgZW1pdCB0aGUgY2xhbXBlZFxuICAgKiAgdmlzaWJsZSByZWdpb24uIEEgZnJlc2ggUGl4ZWxEYXRhIG9iamVjdCBtZWFucyBjYWNoZWRJbWFnZURhdGEoKSByZWJ1aWxkcyBhdXRvbWF0aWNhbGx5LiAqL1xuICBwcml2YXRlIGFzeW5jIHJ1blJlYWRiYWNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBpZiAoIXYpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHggPSBhd2FpdCB2LnJlYWREaXNwbGF5ZWRQaXhlbHMoKTtcbiAgICAgIGlmICh0aGlzLnZpZXdlciAhPT0gdikgcmV0dXJuO1xuICAgICAgY29uc3QgcmVjdCA9IHYudmlzaWJsZVdvcmxkUmVjdCgpOyAvLyBjYXB0dXJlIFdJVEggdGhlIHBpeGVscyAoc2FtZSBjYW1lcmEpXG4gICAgICB0aGlzLmxhc3RQaXhlbHMgPSBweDtcbiAgICAgIHRoaXMubGFzdFBpeGVsc1JlY3QgPSByZWN0O1xuICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuZ2V0VHJ1ZUltYWdlU2l6ZSgpO1xuICAgICAgaWYgKHNpemUgJiYgcmVjdCkge1xuICAgICAgICBjb25zdCB4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oc2l6ZS53aWR0aCwgcmVjdC54KSk7XG4gICAgICAgIGNvbnN0IHkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihzaXplLmhlaWdodCwgcmVjdC55KSk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oc2l6ZS53aWR0aCAtIHgsIHJlY3Qud2lkdGgpKTtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oc2l6ZS5oZWlnaHQgLSB5LCByZWN0LmhlaWdodCkpO1xuICAgICAgICB0aGlzLnZpZXdwb3J0Q2hhbmdlJC5uZXh0KHsgeCwgeSwgd2lkdGgsIGhlaWdodCB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8qIHJlYWRiYWNrIHVuYXZhaWxhYmxlICovXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZVJlYWRiYWNrKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9PT0gJ2Z1bmN0aW9uJykgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHZvaWQgdGhpcy5ydW5SZWFkYmFjaygpKTtcbiAgICBlbHNlIHNldFRpbWVvdXQoKCkgPT4gdm9pZCB0aGlzLnJ1blJlYWRiYWNrKCksIDApO1xuICB9XG5cbiAgLyoqIERlYm91bmNlZCByZWFkYmFjayDigJQgYXJtZWQgb24gY2FtZXJhIGNoYW5nZXMgc28gYGxhc3RQaXhlbHNgIHRyYWNrcyB0aGUgY3VycmVudCB2aWV3IGFmdGVyIGFcbiAgICogIHBhbi96b29tIHNldHRsZXMgKGFuZCBhZnRlciB0aWxlZCBsZXZlbHMgZmluaXNoIGxvYWRpbmcpLCB3aGljaCB0aGUgb24tY2FudmFzIHBpeGVsIHRvb2xzXG4gICAqICAod2FuZC9icnVzaC9TQU0pIHJlYWQgc3luY2hyb25vdXNseS4gQ29hbGVzY2VzIHJhcGlkIGNoYW5nZXMuICovXG4gIHByaXZhdGUgYXJtUmVhZGJhY2soZGVsYXlNcyA9IDI1MCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlYWRiYWNrVGltZXIgIT0gbnVsbCkgY2xlYXJUaW1lb3V0KHRoaXMucmVhZGJhY2tUaW1lcik7XG4gICAgdGhpcy5yZWFkYmFja1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJlYWRiYWNrVGltZXIgPSBudWxsO1xuICAgICAgdm9pZCB0aGlzLnJ1blJlYWRiYWNrKCk7XG4gICAgfSwgZGVsYXlNcyk7XG4gIH1cblxuICAvLyDilIDilIAgSVJlZ2lvblN0b3JlICsgY2xhc3NpZmljYXRpb24gY29sb3VycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gSW5oZXJpdGVkIGZyb20gQmFzZVN0b3JlVmlzdWFsaXplciDigJQgcHVyZSBkZWxlZ2F0aW9ucyB0byB0aGUgc2hhcmVkXG4gIC8vIFJlZ2lvblN0b3JlIC8gVmlzdWFsaXplclN0b3JlIChpZGVudGljYWwgdG8gdGhlIE9TRCBiYWNrZW5kKS5cblxuICAvLyDilIDilIAgUGl4ZWwgdG9vbHM6IHJldXNlIHRoZSBzaGFyZWQsIGJhY2tlbmQtYWdub3N0aWMgdG9vbCBzZXJ2aWNlcyB3aXRoIGEgbmFwYXJpIGhvc3Qg4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIEJ1aWxkIHRoZSBjb29yZGluYXRlIHRyYW5zZm9ybSArIHRvb2wgaG9zdHMgZm9yIHRoZSBjdXJyZW50IHZpZXdlciAoY2FsbGVkIGZyb20gcGxvdCgpKS4gVGhlXG4gICAqICBwaXhlbCB0b29scyByZWFkIGRpc3BsYXllZCBwaXhlbHMgc3luY2hyb25vdXNseSBmcm9tIHRoZSBsYXN0IHJlYWRiYWNrIGFuZCBjb252ZXJ0IHBvaW50ZXJcbiAgICogIGNvb3JkcyB2aWEgdGhlIG5hcGFyaSBjYW1lcmEsIGV4YWN0bHkgbWlycm9yaW5nIHRoZSBPU0QgaG9zdC4gKi9cbiAgcHJpdmF0ZSBidWlsZFRvb2xIb3N0cygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgdGhpcy5jb29yZFRyYW5zZm9ybSA9IG5ldyBOYXBhcmlDb29yZGluYXRlVHJhbnNmb3JtKFxuICAgICAgdGhpcy52aWV3ZXIsXG4gICAgICAoKSA9PiAhIXRoaXMudmlld2VyICYmIHRoaXMuaW1hZ2VXID4gMCxcbiAgICApO1xuICAgIGNvbnN0IHJlZ2lvbnMgPSB0aGlzLnJlZ2lvblN0b3JlO1xuICAgIHRoaXMud2FuZEhvc3QgPSB7XG4gICAgICBnZXRSZWdpb25zOiAoKSA9PiByZWdpb25zLmdldFJlZ2lvbnMoKSxcbiAgICAgIHNldFJlZ2lvbnM6IChyKSA9PiByZWdpb25zLnNldFJlZ2lvbnMociksXG4gICAgICBnZXRDYWNoZWRJbWFnZURhdGE6ICgpID0+IHRoaXMuY2FjaGVkSW1hZ2VEYXRhKCksXG4gICAgICBnZXRBY3RpdmVGcmFtZUluZGV4OiAoKSA9PiB0aGlzLmxvYWRlZD8ueiA/PyAwLFxuICAgICAgZ2V0T3ZlcmxheUNvbnRhaW5lcjogKCkgPT4gdGhpcy5ob3N0LFxuICAgICAgZ2V0Q29vcmRpbmF0ZVRyYW5zZm9ybTogKCkgPT4gdGhpcy5jb29yZFRyYW5zZm9ybSBhcyBJQ29vcmRpbmF0ZVRyYW5zZm9ybSxcbiAgICAgIGdldEZpbGVOYW1lOiAoKSA9PiB0aGlzLmxvYWRlZD8uZmlsZW5hbWUsXG4gICAgICBnZXRTaGFwZUNvbG9yOiAoKSA9PiByZWdpb25zLmdldFNoYXBlQ29sb3IoKSxcbiAgICB9O1xuICAgIHRoaXMuZXJhc2VySG9zdCA9IHtcbiAgICAgIGdldFJlZ2lvbnM6ICgpID0+IHJlZ2lvbnMuZ2V0UmVnaW9ucygpLFxuICAgICAgc2V0UmVnaW9uczogKHIpID0+IHJlZ2lvbnMuc2V0UmVnaW9ucyhyKSxcbiAgICAgIGludmFsaWRhdGVXYW5kUmVnaW9uOiAoKSA9PiB0aGlzLndhbmRUb29sLmNsZWFyQWN0aXZlUmVnaW9uKCksXG4gICAgICBnZXRPdmVybGF5Q29udGFpbmVyOiAoKSA9PiB0aGlzLmhvc3QsXG4gICAgICBnZXRDb29yZGluYXRlVHJhbnNmb3JtOiAoKSA9PiB0aGlzLmNvb3JkVHJhbnNmb3JtIGFzIElDb29yZGluYXRlVHJhbnNmb3JtLFxuICAgICAgZ2V0Q2FjaGVkSW1hZ2VSYXRpbzogKCkgPT4gdGhpcy5jYWNoZWRJbWFnZURhdGEoKT8ucmF0aW9zWzBdID8/IDEsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgem9vbUJveEhvc3QoKTogWm9vbVRvQm94VG9vbEhvc3Qge1xuICAgIHJldHVybiB7XG4gICAgICBnZXRQbG90RGl2OiAoKSA9PiB0aGlzLnBsb3REaXZJZCxcbiAgICAgIHBpeGVsVG9EYXRhOiAocHgsIHB5KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmhvc3Q/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBpZiAoIXRoaXMudmlld2VyIHx8ICFyZWN0KSByZXR1cm4geyB4OiAwLCB5OiAwIH07XG4gICAgICAgIGNvbnN0IFt4LCB5XSA9IHRoaXMudmlld2VyLmNhbnZhc1RvV29ybGQocmVjdC5sZWZ0ICsgcHgsIHJlY3QudG9wICsgcHkpO1xuICAgICAgICByZXR1cm4geyB4LCB5IH07XG4gICAgICB9LFxuICAgICAgYXBwbHlab29tVG9Cb3g6IChjb29yZHMpID0+IHRoaXMuYXBwbHlab29tVG9Cb3goY29vcmRzKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFpvb20vcGFuIHRoZSBjYW1lcmEgdG8gZml0IGEgZGF0YS1zcGFjZSByZWN0YW5nbGUgYFt4TWluLCB4TWF4LCB5TWF4LCB5TWluXWAuICovXG4gIHByaXZhdGUgYXBwbHlab29tVG9Cb3goY29vcmRpbmF0ZXM6IG51bWJlcltdKTogdm9pZCB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdiB8fCAhdGhpcy5jYW52YXMgfHwgY29vcmRpbmF0ZXMubGVuZ3RoIDwgNCkgcmV0dXJuO1xuICAgIGNvbnN0IFt4TWluLCB4TWF4LCB5QSwgeUJdID0gY29vcmRpbmF0ZXM7XG4gICAgY29uc3QgeDAgPSBNYXRoLm1pbih4TWluLCB4TWF4KTtcbiAgICBjb25zdCB4MSA9IE1hdGgubWF4KHhNaW4sIHhNYXgpO1xuICAgIGNvbnN0IHkwID0gTWF0aC5taW4oeUEsIHlCKTtcbiAgICBjb25zdCB5MSA9IE1hdGgubWF4KHlBLCB5Qik7XG4gICAgY29uc3QgdyA9IE1hdGgubWF4KDEsIHgxIC0geDApO1xuICAgIGNvbnN0IGggPSBNYXRoLm1heCgxLCB5MSAtIHkwKTtcbiAgICBjb25zdCB2dyA9IHRoaXMuY2FudmFzLmNsaWVudFdpZHRoIHx8IHc7XG4gICAgY29uc3QgdmggPSB0aGlzLmNhbnZhcy5jbGllbnRIZWlnaHQgfHwgaDtcbiAgICB2LmNhbWVyYS5jZW50ZXIgPSBbKHgwICsgeDEpIC8gMiwgKHkwICsgeTEpIC8gMl07XG4gICAgdi5jYW1lcmEuem9vbSA9IE1hdGgubWluKHZ3IC8gdywgdmggLyBoKTtcbiAgICB2LnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKiBCdWlsZCBDYWNoZWRJbWFnZURhdGEgZnJvbSB0aGUgbW9zdCByZWNlbnQgcmVhZGJhY2sgKFJHQkEgZGV2aWNlIHBpeGVscyDihpIgW3ldW3hdPVtyLGcsYl0pLFxuICAgKiAgd2l0aCByYXRpb3Mvb3JpZ2luIG1hcHBpbmcgaW1hZ2UgY29vcmRzIOKGlCByZWFkYmFjayBwaXhlbHMuIENhY2hlZCB1bnRpbCB0aGUgcmVhZGJhY2sgY2hhbmdlcy4gKi9cbiAgcHJpdmF0ZSBjYWNoZWRJbWFnZURhdGEoKTogQ2FjaGVkSW1hZ2VEYXRhIHwgbnVsbCB7XG4gICAgY29uc3QgcHggPSB0aGlzLmxhc3RQaXhlbHM7XG4gICAgaWYgKCFweCB8fCAhdGhpcy52aWV3ZXIpIHJldHVybiBudWxsO1xuICAgIGlmICh0aGlzLmNhY2hlZEltYWdlICYmIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPT09IHB4KSByZXR1cm4gdGhpcy5jYWNoZWRJbWFnZTtcbiAgICBjb25zdCB3ID0gcHgud2lkdGg7XG4gICAgY29uc3QgaCA9IHB4LmhlaWdodDtcbiAgICBjb25zdCBkYXRhID0gcHguZGF0YTtcbiAgICBjb25zdCBtYXRyaXg6IG51bWJlcltdW11bXSA9IG5ldyBBcnJheShoKTtcbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGg7IHkrKykge1xuICAgICAgY29uc3Qgcm93OiBudW1iZXJbXVtdID0gbmV3IEFycmF5KHcpO1xuICAgICAgY29uc3QgYmFzZSA9IHkgKiB3ICogNDtcbiAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdzsgeCsrKSB7XG4gICAgICAgIGNvbnN0IG8gPSBiYXNlICsgeCAqIDQ7XG4gICAgICAgIHJvd1t4XSA9IFtkYXRhW29dLCBkYXRhW28gKyAxXSwgZGF0YVtvICsgMl1dO1xuICAgICAgfVxuICAgICAgbWF0cml4W3ldID0gcm93O1xuICAgIH1cbiAgICAvLyBVc2UgdGhlIHJlY3QgY2FwdHVyZWQgV0lUSCB0aGlzIHJlYWRiYWNrIChub3QgdGhlIGxpdmUgb25lKSBzbyByYXRpb3Mvb3JpZ2luIG1hdGNoIHRoZVxuICAgIC8vIG1hdHJpeCdzIGNhbWVyYSDigJQgb3RoZXJ3aXNlIGEgcGFuL3pvb20gc2luY2UgdGhlIHJlYWRiYWNrIG1pcy1zY2FsZXMgdGhlIHRyYWNlZCByZWdpb24uXG4gICAgY29uc3QgcmVjdCA9IHRoaXMubGFzdFBpeGVsc1JlY3QgPz8gdGhpcy52aWV3ZXIudmlzaWJsZVdvcmxkUmVjdCgpO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2UgPSB7XG4gICAgICBmcmFtZXM6IFttYXRyaXhdLFxuICAgICAgd2lkdGg6IHcsXG4gICAgICBoZWlnaHQ6IGgsXG4gICAgICByYXRpb3M6IFtyZWN0LndpZHRoIC8gdywgcmVjdC5oZWlnaHQgLyBoXSxcbiAgICAgIGlzR3JheXNjYWxlOiBmYWxzZSxcbiAgICAgIG9yaWdpblg6IHJlY3QueCxcbiAgICAgIG9yaWdpblk6IHJlY3QueSxcbiAgICB9O1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBweDtcbiAgICByZXR1cm4gdGhpcy5jYWNoZWRJbWFnZTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJVG9vbENvbnRyb2xsZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIENvbnRyb2wgZ2F0aW5nOiBhIHRvb2wgdGhhdCBBQ1RJVkFURVMgZGlzYWJsZXMgdGhlIGNhbWVyYSBjb250cm9sczsgZGVhY3RpdmF0aW9uIGlzIGEgbm8tb3BcbiAgLy8gYmVjYXVzZSB0aGUgaG9zdCBhbHdheXMgY2FsbHMgdGhlIHJlZ2lvbiBvdmVybGF5J3Mgc2V0TW9kZSBGSVJTVCBpbiBlYWNoIHRvZ2dsZSAod2hpY2ggc2V0c1xuICAvLyB0aGUgYmFzZWxpbmUgZW5hYmxlZC9kaXNhYmxlZCksIHNvIHJlLWVuYWJsaW5nIGhlcmUgd291bGQgZmlnaHQgYSBmcmVzaGx5LWFjdGl2YXRlZCBkcmF3IG1vZGUuXG4gIHNldFdhbmRNb2RlKGFjdGl2ZTogYm9vbGVhbiwgb3B0aW9ucz86IElXYW5kT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjsgLy8gbm8gcGxvdCB5ZXQg4oaSIG5vdGhpbmcgdG8gZHJpdmVcbiAgICBpZiAoIWFjdGl2ZSkge1xuICAgICAgdGhpcy53YW5kVG9vbC5zZXRNb2RlKGZhbHNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy52aWV3ZXI/LnNldENvbnRyb2xzRW5hYmxlZChmYWxzZSk7XG4gICAgdGhpcy5jYWNoZWRJbWFnZVNvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5hcm1SZWFkYmFjaygwKTtcbiAgICBpZiAodGhpcy53YW5kSG9zdCkgdGhpcy53YW5kVG9vbC5iaW5kSG9zdCh0aGlzLndhbmRIb3N0KTtcbiAgICB0aGlzLndhbmRUb29sLnNldE1vZGUodHJ1ZSwgKG9wdGlvbnMgPz8ge30pIGFzIHVua25vd24gYXMgV2FuZE9wdGlvbnMpO1xuICB9XG4gIHNldFdhbmRPcHRpb25zKG9wdGlvbnM6IElXYW5kT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMud2FuZFRvb2wuc2V0T3B0aW9ucygob3B0aW9ucyA/PyB7fSkgYXMgdW5rbm93biBhcyBXYW5kT3B0aW9ucyk7XG4gIH1cbiAgY2xlYXJBY3RpdmVXYW5kUmVnaW9uKCk6IHZvaWQge1xuICAgIHRoaXMud2FuZFRvb2wuY2xlYXJBY3RpdmVSZWdpb24oKTtcbiAgfVxuICBzZXRCcnVzaE1vZGUoYWN0aXZlOiBib29sZWFuLCBvcHRpb25zPzogSUJydXNoT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBpZiAoIWFjdGl2ZSkge1xuICAgICAgdGhpcy5icnVzaFRvb2wuc2V0TW9kZShmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudmlld2VyPy5zZXRDb250cm9sc0VuYWJsZWQoZmFsc2UpO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMuYXJtUmVhZGJhY2soMCk7XG4gICAgaWYgKHRoaXMud2FuZEhvc3QpIHRoaXMuYnJ1c2hUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHRoaXMuYnJ1c2hUb29sLnNldE1vZGUodHJ1ZSwgKG9wdGlvbnMgPz8ge30pIGFzIHVua25vd24gYXMgQnJ1c2hPcHRpb25zKTtcbiAgfVxuICBzZXRCcnVzaE9wdGlvbnMob3B0aW9uczogSUJydXNoT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMuYnJ1c2hUb29sLnNldE9wdGlvbnMob3B0aW9ucyA/PyB7fSk7XG4gIH1cbiAgc2V0VmVydGV4RXJhc2VyTW9kZShhY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgaWYgKGFjdGl2ZSkge1xuICAgICAgdGhpcy52aWV3ZXI/LnNldENvbnRyb2xzRW5hYmxlZChmYWxzZSk7XG4gICAgICB0aGlzLmNhY2hlZEltYWdlU291cmNlID0gbnVsbDtcbiAgICAgIGlmICh0aGlzLmVyYXNlckhvc3QpIHRoaXMuZXJhc2VyVG9vbC5iaW5kSG9zdCh0aGlzLmVyYXNlckhvc3QpO1xuICAgIH1cbiAgICB0aGlzLmVyYXNlclRvb2wuc2V0TW9kZShhY3RpdmUpO1xuICB9XG4gIHNldFZlcnRleEVyYXNlclJhZGl1cyhyYWRpdXM6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZXJhc2VyVG9vbC5zZXRSYWRpdXMocmFkaXVzKTtcbiAgfVxuICBzZXRab29tVG9Cb3hNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBpZiAoYWN0aXZlKSB7XG4gICAgICB0aGlzLnZpZXdlcj8uc2V0Q29udHJvbHNFbmFibGVkKGZhbHNlKTtcbiAgICAgIHRoaXMuem9vbVRvQm94VG9vbC5iaW5kSG9zdCh0aGlzLnpvb21Cb3hIb3N0KCkpO1xuICAgIH1cbiAgICB0aGlzLnpvb21Ub0JveFRvb2wuc2V0TW9kZShhY3RpdmUpO1xuICB9XG4gIC8vIFNBTSAvIGNlbGxwb3NlIOKAlCBzZXJ2ZXIgcm91bmQtdHJpcHMgdGhhdCByZWFkIHRoZSBkcmF3biByZWN0YW5nbGVzICsgZGlzcGxheWVkIHBpeGVscyB0aHJvdWdoXG4gIC8vIHRoZSBzYW1lIHdhbmQgaG9zdCAocmVjdGFuZ2xlcyBmcm9tIHRoZSBSZWdpb25TdG9yZSwgaW1hZ2UgZnJvbSB0aGUgcmVhZGJhY2spLlxuICBhc3luYyBzZWdtZW50UmVjdGFuZ2xlcygpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGlmICghdGhpcy52aWV3ZXIgfHwgIXRoaXMud2FuZEhvc3QpIHJldHVybiAwO1xuICAgIGF3YWl0IHRoaXMucnVuUmVhZGJhY2soKTsgLy8gdGhlIFNBTSBlbWJlZGRpbmcgc2FtcGxlcyB0aGUgY3VycmVudGx5LWRpc3BsYXllZCBpbWFnZVxuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMuc2FtVG9vbC5iaW5kSG9zdCh0aGlzLndhbmRIb3N0KTtcbiAgICByZXR1cm4gdGhpcy5zYW1Ub29sLnNlZ21lbnRCb3hlcygpO1xuICB9XG4gIGFzeW5jIHNlZ21lbnRSZWN0YW5nbGVzQ2VsbHBvc2UoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAoIXRoaXMudmlld2VyIHx8ICF0aGlzLndhbmRIb3N0IHx8ICF0aGlzLmNlbGxTZWdtZW50ZXIpIHJldHVybiAwO1xuICAgIGF3YWl0IHRoaXMucnVuUmVhZGJhY2soKTtcbiAgICB0aGlzLmNhY2hlZEltYWdlU291cmNlID0gbnVsbDtcbiAgICB0aGlzLmNlbGxTZWdtZW50VG9vbC5iaW5kSG9zdCh0aGlzLndhbmRIb3N0KTtcbiAgICByZXR1cm4gdGhpcy5jZWxsU2VnbWVudFRvb2wuc2VnbWVudEJveGVzKHRoaXMuY2VsbFNlZ21lbnRlcik7XG4gIH1cbiAgc2V0U2FtTW9kZWwoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2FtVG9vbC5zZXRNb2RlbChpZCk7XG4gICAgdGhpcy5zYW1Qb2ludFRvb2wuc2V0TW9kZWwoaWQpO1xuICB9XG4gIHNldFNhbVBvaW50TW9kZShhY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgaWYgKGFjdGl2ZSkge1xuICAgICAgdGhpcy52aWV3ZXI/LnNldENvbnRyb2xzRW5hYmxlZChmYWxzZSk7XG4gICAgICB0aGlzLmNhY2hlZEltYWdlU291cmNlID0gbnVsbDtcbiAgICAgIHRoaXMuYXJtUmVhZGJhY2soMCk7IC8vIHJlZnJlc2ggdGhlIHJlYWRiYWNrIHRoZSBjbGljaydzIGVtYmVkZGluZyB3aWxsIHNhbXBsZVxuICAgICAgaWYgKHRoaXMud2FuZEhvc3QpIHRoaXMuc2FtUG9pbnRUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIH1cbiAgICB0aGlzLnNhbVBvaW50VG9vbC5zZXRNb2RlKGFjdGl2ZSk7XG4gIH1cbiAgY29tbWl0U2FtUG9pbnRzKCk6IHZvaWQge1xuICAgIHRoaXMuc2FtUG9pbnRUb29sLmNvbW1pdCgpO1xuICB9XG4gIGNsZWFyU2FtUG9pbnRzKCk6IHZvaWQge1xuICAgIHRoaXMuc2FtUG9pbnRUb29sLmNsZWFyKCk7XG4gIH1cblxuICAvLyDilIDilIAgSURpc3BsYXlPcHRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBJbmhlcml0ZWQgZnJvbSBCYXNlU3RvcmVWaXN1YWxpemVyIOKAlCBwdXJlIGRlbGVnYXRpb25zIHRvIHRoZSBzaGFyZWRcbiAgLy8gVmlzdWFsaXplclN0b3JlIChpZGVudGljYWwgdG8gdGhlIE9TRCBiYWNrZW5kKS5cblxuICAvLyDilIDilIAgSUludGVuc2l0eVNhbXBsaW5nOiBQbG90bHkgb3ducyBzYW1wbGluZzsgZW1pdCB2aWV3cG9ydCBjaGFuZ2VzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBlbnN1cmVJbnRlbnNpdHlTYW1wbGluZyhfaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCBfekluZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cbiAgcmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pKFxuICAgIF94OiBudW1iZXIsXG4gICAgX3k6IG51bWJlcixcbiAgICBfd2lkdGg6IG51bWJlcixcbiAgICBfaGVpZ2h0OiBudW1iZXIsXG4gICAgX3pJbmRleDogbnVtYmVyLFxuICApOiB2b2lkIHt9XG4gIGdldFZpZXdwb3J0Q2hhbmdlJCgpOiBPYnNlcnZhYmxlPHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+IHtcbiAgICByZXR1cm4gdGhpcy52aWV3cG9ydENoYW5nZSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvLyDilIDilIAgSVZpc3VhbGl6ZXIgY29tcG9zaXRlIG1lbWJlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGdldFJlZ2lvbk92ZXJsYXkoKTogSVJlZ2lvbk92ZXJsYXkgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25PdmVybGF5O1xuICB9XG4gIGdldElzb3N1cmZhY2VDb250cm9scygpOiBJSXNvc3VyZmFjZUNvbnRyb2xzIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLnZvbHVtZVZpZXcpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB7XG4gICAgICBzZXRJc29SYW5nZTogKGlzb01pbjogbnVtYmVyLCBpc29NYXg6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgICAgICAvLyBBcHBseSB0byBldmVyeSBjaGFubmVsJ3Mgdm9sdW1lIGxheWVyLlxuICAgICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMudm9sdW1lVmlldz8ubGF5ZXJzID8/IFtdKSB7XG4gICAgICAgICAgbGF5ZXIuY29udHJhc3RMaW1pdHMgPSBbaXNvTWluLCBpc29NYXhdO1xuICAgICAgICAgIGxheWVyLnJlbmRlcmluZyA9ICdpc28nO1xuICAgICAgICAgIGxheWVyLmlzb1RocmVzaG9sZCA9IDAuNTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpZXdlcj8ucmVxdWVzdFJlbmRlcigpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG4gIGdldEludGVuc2l0eUNvbnRyb2xzKCk6IElJbnRlbnNpdHlDb250cm9scyB8IG51bGwge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGdldFN1cmZhY2UzZENvbnRyb2xzKCk6IElTdXJmYWNlM2RDb250cm9scyB8IG51bGwge1xuICAgIGlmICghdGhpcy52b2x1bWVWaWV3ICYmICF0aGlzLnN1cmZhY2VMYXllciAmJiAhdGhpcy5zY2F0dGVyM2RMYXllcikgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNldFN1cmZhY2VEcmFnTW9kZTogKG1vZGU6IHN0cmluZyk6IHZvaWQgPT4gdGhpcy5zZXRTdXJmYWNlRHJhZ01vZGUobW9kZSksXG4gICAgICByZXNldFN1cmZhY2VDYW1lcmE6ICgpOiB2b2lkID0+IHRoaXMucmVzZXRTdXJmYWNlQ2FtZXJhKCksXG4gICAgICBzZXRBeGVzVmlzaWJsZTogKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5heGVzVmlzaWJsZSA9IHZpc2libGU7XG4gICAgICAgIHRoaXMuYXhlc0xhYmVscz8uc2V0VmlzaWJsZSh2aXNpYmxlKTtcbiAgICAgICAgaWYgKHRoaXMuYXhlc0xheWVyKSB7XG4gICAgICAgICAgdGhpcy5heGVzTGF5ZXIudmlzaWJsZSA9IHZpc2libGU7XG4gICAgICAgICAgdGhpcy52aWV3ZXI/LnJlcXVlc3RSZW5kZXIoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGF4ZXNWaXNpYmxlOiAoKTogYm9vbGVhbiA9PiB0aGlzLmF4ZXNWaXNpYmxlLFxuICAgICAgLy8gU3VyZmFjZSB3aXJlZnJhbWUgKG5hcGFyaS1qcyBzdXJmYWNlIG9ubHkpIOKAlCBhIGxpdmUgbGF5ZXIgcHJvcGVydHksIG5vIHJlYnVpbGQgbmVlZGVkLlxuICAgICAgc2V0V2lyZWZyYW1lOiAob246IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5zdXJmYWNlV2lyZWZyYW1lID0gb247XG4gICAgICAgIGlmICh0aGlzLnN1cmZhY2VMYXllcikge1xuICAgICAgICAgIHRoaXMuc3VyZmFjZUxheWVyLndpcmVmcmFtZSA9IG9uO1xuICAgICAgICAgIHRoaXMudmlld2VyPy5yZXF1ZXN0UmVuZGVyKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB3aXJlZnJhbWU6ICgpOiBib29sZWFuID0+IHRoaXMuc3VyZmFjZVdpcmVmcmFtZSxcbiAgICB9O1xuICB9XG4gIGdldEhpc3RvZ3JhbShjaGFubmVsSW5kZXg6IG51bWJlciwgYmluczogbnVtYmVyKTogSUhpc3RvZ3JhbSB8IG51bGwge1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBpZiAoIXYpIHJldHVybiBudWxsO1xuICAgIC8vIFZvbHVtZSAvIGlzb3N1cmZhY2U6IGludGVuc2l0eSBoaXN0b2dyYW0gb2YgdGhlIGFzc2VtYmxlZCAoZG93bnNhbXBsZWQpIHVpbnQ4IHZvbHVtZSBmb3IgdGhlXG4gICAgLy8gcmVxdWVzdGVkIGNoYW5uZWwgKG11bHRpY2hhbm5lbCkgb3IgdGhlIHNpbmdsZSBncmF5c2NhbGUgdm9sdW1lIChrZXkgMCkuXG4gICAgaWYgKHRoaXMudm9sdW1lQ2hhbm5lbERhdGEuc2l6ZSkge1xuICAgICAgY29uc3QgZGF0YSA9IHRoaXMudm9sdW1lQ2hhbm5lbERhdGEuZ2V0KGNoYW5uZWxJbmRleCkgPz8gdGhpcy52b2x1bWVDaGFubmVsRGF0YS5nZXQoMCk7XG4gICAgICByZXR1cm4gZGF0YSA/IHRoaXMudG9JSGlzdG9ncmFtKGhpc3RvZ3JhbVNjYWxhcihkYXRhLCBiaW5zLCAwLCAyNTUpKSA6IG51bGw7XG4gICAgfVxuICAgIC8vIFRpbGVkIG1vZGUgaGFzIG5vIGZ1bGwgaW4tbWVtb3J5IHBpeGVscyDihpIgdXNlIHRoZSBjb2Fyc2UgcGVyLWNoYW5uZWwgc2FtcGxlIChSR0I6IHJlYWRiYWNrKS5cbiAgICBpZiAodGhpcy50aWxlZCkge1xuICAgICAgaWYgKHRoaXMuaW1hZ2VNb2RlID09PSAncmdiJykgcmV0dXJuIHRoaXMucmdiSGlzdG9ncmFtKGNoYW5uZWxJbmRleCwgYmlucyk7XG4gICAgICBjb25zdCBzYW1wbGUgPSB0aGlzLmhpc3RTYW1wbGVzLmdldCh0aGlzLmltYWdlTW9kZSA9PT0gJ2dyYXlzY2FsZScgPyAwIDogY2hhbm5lbEluZGV4KTtcbiAgICAgIHJldHVybiBzYW1wbGUgPyB0aGlzLnRvSUhpc3RvZ3JhbShoaXN0b2dyYW1TY2FsYXIoc2FtcGxlLCBiaW5zLCAwLCAyNTUpKSA6IG51bGw7XG4gICAgfVxuICAgIC8vIEdyYXlzY2FsZS9tdWx0aWNoYW5uZWwgKHN0aXRjaCk6IG5hdGl2ZSBwZXItY2hhbm5lbCBoaXN0b2dyYW0gc3RyYWlnaHQgZnJvbSB0aGUgaW4tbWVtb3J5XG4gICAgLy8gc2NhbGFyIGxheWVyIChubyBHUFUgcmVhZGJhY2spLiBSR0I6IGJpbiB0aGUgZGlzcGxheWVkIHBpeGVscycgUi9HL0IgYnl0ZSAoOC1iaXQgY2xpZW50IHBhdGgpLlxuICAgIGNvbnN0IGxheWVyID0gdGhpcy5jaGFubmVsVmlldz8ubGF5ZXJzW3RoaXMuaW1hZ2VNb2RlID09PSAnZ3JheXNjYWxlJyA/IDAgOiBjaGFubmVsSW5kZXhdO1xuICAgIGlmIChsYXllcikge1xuICAgICAgY29uc3QgaCA9IHYubGF5ZXJIaXN0b2dyYW0obGF5ZXIsIGJpbnMpO1xuICAgICAgaWYgKGgpIHJldHVybiB0aGlzLnRvSUhpc3RvZ3JhbShoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaW1hZ2VNb2RlID09PSAncmdiJykgcmV0dXJuIHRoaXMucmdiSGlzdG9ncmFtKGNoYW5uZWxJbmRleCwgYmlucyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZ2V0SGlzdG9ncmFtJChjaGFubmVsSW5kZXg6IG51bWJlciwgYmluczogbnVtYmVyKTogT2JzZXJ2YWJsZTxJSGlzdG9ncmFtIHwgbnVsbD4ge1xuICAgIC8vID44LWJpdCBjaGFubmVsczogZmV0Y2ggdGhlIHRydWUgbmF0aXZlIGRpc3RyaWJ1dGlvbiBmcm9tIHRoZSBzZXJ2ZXIgKHRoZSBkaXNwbGF5ZWQgcGl4ZWxzXG4gICAgLy8gYXJlIDgtYml0LCBzbyB0aGUgY2xpZW50IGhpc3RvZ3JhbSB3b3VsZCBiZSBjbGlwcGVkKS4gOC1iaXQgY2hhbm5lbHMgdXNlIHRoZSBjbGllbnQgcGF0aC5cbiAgICBjb25zdCBiaXREZXB0aCA9IHRoaXMuZGVzY3JpcHRvcj8uY2hhbm5lbEluZm8/LltjaGFubmVsSW5kZXhdPy5iaXREZXB0aCA/PyA4O1xuICAgIGlmIChiaXREZXB0aCA+IDgpIHtcbiAgICAgIGNvbnN0IHogPSB0aGlzLmxvYWRlZD8ueiA/PyAwO1xuICAgICAgY29uc3Qga2V5ID0gYCR7en18JHtjaGFubmVsSW5kZXh9YDtcbiAgICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMubmF0aXZlSGlzdG9ncmFtcy5nZXQoa2V5KTtcbiAgICAgIGlmIChjYWNoZWQpIHJldHVybiBvZihjYWNoZWQpO1xuICAgICAgcmV0dXJuIGZyb20odGhpcy5mZXRjaE5hdGl2ZUhpc3RvZ3JhbShjaGFubmVsSW5kZXgsIGJpbnMsIHosIGtleSkpO1xuICAgIH1cbiAgICByZXR1cm4gb2YodGhpcy5nZXRIaXN0b2dyYW0oY2hhbm5lbEluZGV4LCBiaW5zKSk7XG4gIH1cblxuICAvKiogRmV0Y2ggKyBjYWNoZSBvbmUgY2hhbm5lbCdzIG5hdGl2ZS1iaXQtZGVwdGggaGlzdG9ncmFtIGZyb20gYEdFVCAvaGlzdG9ncmFtYCAoPjgtYml0KS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaE5hdGl2ZUhpc3RvZ3JhbShcbiAgICBjaGFubmVsOiBudW1iZXIsXG4gICAgYmluczogbnVtYmVyLFxuICAgIHo6IG51bWJlcixcbiAgICBrZXk6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxJSGlzdG9ncmFtIHwgbnVsbD4ge1xuICAgIGNvbnN0IGluZm9CNjQgPSB0aGlzLnRpbGVzLmdldFNlbGVjdGVkSW5mb0I2NCgpO1xuICAgIGlmICghaW5mb0I2NCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgaGVhZGVycyA9IGF3YWl0IHRoaXMudGlsZXNcbiAgICAgIC5nZXRBdXRoSGVhZGVycygpXG4gICAgICAuY2F0Y2goKCkgPT4gKHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmFwaX1oaXN0b2dyYW0/aW5mbz0ke2luZm9CNjR9JmNoYW5uZWw9JHtjaGFubmVsfSZ6PSR7en0mYmlucz0ke2JpbnN9YDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKHVybCwgeyBoZWFkZXJzIH0pO1xuICAgICAgaWYgKCFyZXNwLm9rKSByZXR1cm4gbnVsbDsgLy8gMjAyIChzdGlsbCBjYWNoaW5nKSBvciB0cmFuc2llbnQg4oaSIG51bGw7IHRoZSBwYW5lIHJldHJpZXNcbiAgICAgIGNvbnN0IGhpID0gKGF3YWl0IHJlc3AuanNvbigpKSBhcyB7XG4gICAgICAgIGJpdERlcHRoOiBudW1iZXI7XG4gICAgICAgIHJhbmdlTWluOiBudW1iZXI7XG4gICAgICAgIHJhbmdlTWF4OiBudW1iZXI7XG4gICAgICAgIG9ic2VydmVkTWluOiBudW1iZXI7XG4gICAgICAgIG9ic2VydmVkTWF4OiBudW1iZXI7XG4gICAgICAgIGJpbldpZHRoOiBudW1iZXI7XG4gICAgICAgIGNvdW50czogbnVtYmVyW107XG4gICAgICB9O1xuICAgICAgaWYgKCFoaT8uY291bnRzKSByZXR1cm4gbnVsbDtcbiAgICAgIGNvbnN0IG91dDogSUhpc3RvZ3JhbSA9IHtcbiAgICAgICAgYmluczogaGkuY291bnRzLm1hcCgoXywgaSkgPT4gaGkucmFuZ2VNaW4gKyBpICogaGkuYmluV2lkdGgpLFxuICAgICAgICBjb3VudHM6IGhpLmNvdW50cyxcbiAgICAgICAgbWF4OiBoaS5jb3VudHMucmVkdWNlKChtLCBjKSA9PiAoYyA+IG0gPyBjIDogbSksIDApLFxuICAgICAgICBiaXREZXB0aDogaGkuYml0RGVwdGgsXG4gICAgICAgIHJhbmdlTWluOiBoaS5yYW5nZU1pbixcbiAgICAgICAgcmFuZ2VNYXg6IGhpLnJhbmdlTWF4LFxuICAgICAgICBvYnNlcnZlZE1pbjogaGkub2JzZXJ2ZWRNaW4sXG4gICAgICAgIG9ic2VydmVkTWF4OiBoaS5vYnNlcnZlZE1heCxcbiAgICAgIH07XG4gICAgICB0aGlzLm5hdGl2ZUhpc3RvZ3JhbXMuc2V0KGtleSwgb3V0KTtcbiAgICAgIHJldHVybiBvdXQ7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIG5hdGl2ZSBoaXN0b2dyYW0gZmV0Y2ggZmFpbGVkJywgZXJyKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBQZXItY2hhbm5lbCBoaXN0b2dyYW0gb2YgdGhlIGRpc3BsYXllZCBSR0IgY29tcG9zaXRlIChSL0cvQiBieXRlKSwgZnJvbSB0aGUgbGFzdCByZWFkYmFjay4gKi9cbiAgcHJpdmF0ZSByZ2JIaXN0b2dyYW0oY2hhbm5lbEluZGV4OiBudW1iZXIsIGJpbnM6IG51bWJlcik6IElIaXN0b2dyYW0gfCBudWxsIHtcbiAgICBjb25zdCBweCA9IHRoaXMubGFzdFBpeGVscztcbiAgICBpZiAoIXB4KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBiYW5kID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMiwgY2hhbm5lbEluZGV4KSk7XG4gICAgY29uc3QgbiA9IE1hdGgubWF4KDEsIE1hdGgubWluKDI1NiwgTWF0aC5mbG9vcihiaW5zKSB8fCAyNTYpKTtcbiAgICBjb25zdCBjb3VudHMgPSBuZXcgQXJyYXkobikuZmlsbCgwKTtcbiAgICBjb25zdCBkYXRhID0gcHguZGF0YTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgIGlmIChkYXRhW2kgKyAzXSA9PT0gMCkgY29udGludWU7IC8vIHNraXAgdHJhbnNwYXJlbnQgcGFkZGluZ1xuICAgICAgY291bnRzW01hdGgubWluKG4gLSAxLCAoZGF0YVtpICsgYmFuZF0gKiBuKSA+PiA4KV0rKztcbiAgICB9XG4gICAgY29uc3QgYmluc0FyciA9IEFycmF5LmZyb20oeyBsZW5ndGg6IG4gfSwgKF8sIGkpID0+IChpICogMjU2KSAvIG4pO1xuICAgIHJldHVybiB7IGJpbnM6IGJpbnNBcnIsIGNvdW50cywgbWF4OiBjb3VudHMucmVkdWNlKChtLCBjKSA9PiAoYyA+IG0gPyBjIDogbSksIDApIH07XG4gIH1cbiAgZXhwb3J0Q29tcG9zaXRlKCk6IHZvaWQge1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBpZiAoIXYpIHJldHVybjtcbiAgICB2b2lkIHYuc2NyZWVuc2hvdCgpLnRoZW4oKGJsb2IpID0+IHtcbiAgICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgYS5ocmVmID0gdXJsO1xuICAgICAgYS5kb3dubG9hZCA9ICduYXBhcmktanMucG5nJztcbiAgICAgIGEuY2xpY2soKTtcbiAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcbiAgICB9KTtcbiAgfVxuICAvKiogTmF0aXZlLWJpdC1kZXB0aCAoMTYvMzItYml0KSBtdWx0aS1iYW5kIFRJRkYgZXhwb3J0IHZpYSB0aGUgc2VydmVyIGAvZXhwb3J0L3RpZmZgIGVuZHBvaW50IOKAlFxuICAgKiAgdGhlIGRpc3BsYXllZCBQTkcgaXMgYW4gOC1iaXQgZmlndXJlLCB0aGlzIHByZXNlcnZlcyB0aGUgdHJ1ZSBwaXhlbCB2YWx1ZXMuIFZpc2libGUgY2hhbm5lbHNcbiAgICogIG9ubHkgKG9taXR0ZWQgd2hlbiBhbGwgYXJlIHZpc2libGUg4oaSIHNlcnZlciBkZWZhdWx0KS4gTWlycm9ycyB0aGUgT1NEIGJhY2tlbmQuICovXG4gIGFzeW5jIGV4cG9ydERhdGEoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW5mb0I2NCA9IHRoaXMudGlsZXMuZ2V0U2VsZWN0ZWRJbmZvQjY0KCk7XG4gICAgaWYgKCFpbmZvQjY0KSByZXR1cm47XG4gICAgY29uc3Qgc3RhdGVzID0gdGhpcy5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpO1xuICAgIGNvbnN0IHZpc2libGUgPSBzdGF0ZXMuZmlsdGVyKChjKSA9PiBjLnZpc2libGUpLm1hcCgoYykgPT4gYy5pbmRleCk7XG4gICAgY29uc3QgY2hQYXJhbSA9XG4gICAgICB2aXNpYmxlLmxlbmd0aCAmJiB2aXNpYmxlLmxlbmd0aCA8IHN0YXRlcy5sZW5ndGggPyBgJmNoYW5uZWxzPSR7dmlzaWJsZS5qb2luKCcsJyl9YCA6ICcnO1xuICAgIGNvbnN0IHogPSB0aGlzLmxvYWRlZD8ueiA/PyAwO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuYXBpfWV4cG9ydC90aWZmP2luZm89JHtpbmZvQjY0fSZ6PSR7en0ke2NoUGFyYW19YDtcbiAgICBjb25zdCBzdGVtID0gKHRoaXMubG9hZGVkPy5maWxlbmFtZSB8fCAnaW1hZ2UnKS5yZXBsYWNlKC9cXC5bXi5dKyQvLCAnJyk7XG4gICAgY29uc3QgaGVhZGVycyA9IGF3YWl0IHRoaXMudGlsZXNcbiAgICAgIC5nZXRBdXRoSGVhZGVycygpXG4gICAgICAuY2F0Y2goKCkgPT4gKHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKHVybCwgeyBoZWFkZXJzIH0pO1xuICAgICAgaWYgKHJlc3Auc3RhdHVzID09PSAyMDIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSAxNi1iaXQgZXhwb3J0OiBmaWxlIHN0aWxsIGNhY2hpbmcg4oCUIHRyeSBhZ2FpbiBzaG9ydGx5LicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIXJlc3Aub2spIHRocm93IG5ldyBFcnJvcihgc3RhdHVzICR7cmVzcC5zdGF0dXN9YCk7XG4gICAgICBzYXZlQXMoYXdhaXQgcmVzcC5ibG9iKCksIGAke3N0ZW19XzE2Yml0Lm9tZS50aWZgKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gMTYtYml0IFRJRkYgZXhwb3J0IGZhaWxlZCcsIGVycik7XG4gICAgfVxuICB9XG4gIHVuc3Vic2NyaWJlKCk6IHZvaWQge1xuICAgIHRoaXMucmVzZXQoKTtcbiAgfVxufVxuXG4vKipcbiAqIEFkZGl0aXZlbHkgY29tcG9zaXRlIGdyYXlzY2FsZSBjaGFubmVsIGltYWdlcywgZWFjaCB0aW50ZWQgd2l0aCBpdHMgZGlzcGxheSBjb2xvdXIg4oCUXG4gKiB0aGUgbmF2aWdhdG9yJ3MgcGljdHVyZSBvZiBhIG11bHRpY2hhbm5lbCBpbWFnZS5cbiAqL1xuZnVuY3Rpb24gdGludGVkQ29tcG9zaXRlKGltYWdlczogSW1hZ2VCaXRtYXBbXSwgY29sb3JzOiBzdHJpbmdbXSk6IEhUTUxDYW52YXNFbGVtZW50IHtcbiAgY29uc3QgdyA9IGltYWdlc1swXT8ud2lkdGggPz8gMTtcbiAgY29uc3QgaCA9IGltYWdlc1swXT8uaGVpZ2h0ID8/IDE7XG4gIGNvbnN0IG91dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICBvdXQud2lkdGggPSB3O1xuICBvdXQuaGVpZ2h0ID0gaDtcbiAgY29uc3QgY3R4ID0gb3V0LmdldENvbnRleHQoJzJkJykhO1xuICBjdHguZmlsbFN0eWxlID0gJyMwMDAnO1xuICBjdHguZmlsbFJlY3QoMCwgMCwgdywgaCk7XG4gIGNvbnN0IHRtcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICB0bXAud2lkdGggPSB3O1xuICB0bXAuaGVpZ2h0ID0gaDtcbiAgY29uc3QgdCA9IHRtcC5nZXRDb250ZXh0KCcyZCcpITtcbiAgaW1hZ2VzLmZvckVhY2goKGltZywgaSkgPT4ge1xuICAgIHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ3NvdXJjZS1vdmVyJztcbiAgICB0LmRyYXdJbWFnZShpbWcsIDAsIDAsIHcsIGgpO1xuICAgIHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ211bHRpcGx5JztcbiAgICB0LmZpbGxTdHlsZSA9IGNvbG9yc1tpXTtcbiAgICB0LmZpbGxSZWN0KDAsIDAsIHcsIGgpO1xuICAgIGN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnbGlnaHRlcic7XG4gICAgY3R4LmRyYXdJbWFnZSh0bXAsIDAsIDApO1xuICB9KTtcbiAgcmV0dXJuIG91dDtcbn1cbiJdfQ==
|