@jax-data-science/sci-image-visualizer 0.17.0 → 0.18.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/contracts/display-types.mjs +3 -2
- package/esm2022/lib/contracts/image.contract.mjs +1 -1
- package/esm2022/lib/contracts/ports/spatial-data.port.mjs +1 -1
- package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
- package/esm2022/lib/contracts/region-store.contract.mjs +1 -1
- package/esm2022/lib/contracts/spatial-dataset.contract.mjs +1 -1
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/geometry/cell-meshes.mjs +37 -0
- package/esm2022/lib/geometry/place.mjs +47 -0
- package/esm2022/lib/implementations/napari-js/napari-camera-depth.mjs +93 -0
- package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +2 -2
- package/esm2022/lib/implementations/napari-js/napari-scene.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +81 -15
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-cells.mjs +746 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +325 -18
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-transcripts.mjs +182 -24
- package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +95 -5
- package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +15 -1
- package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +30 -2
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +40 -1
- package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +111 -28
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +14 -2
- package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +180 -48
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +28 -8
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +2 -2
- package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +10 -1
- package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +30 -3
- package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +15 -3
- package/esm2022/lib/region-editor/region-editor.component.mjs +24 -4
- package/esm2022/lib/region-source/region-source-ops.mjs +7 -1
- package/esm2022/lib/region-source/region-tiles.mjs +1 -1
- package/esm2022/lib/region-source/worker-region-source.mjs +24 -1
- package/esm2022/lib/routing-visualizer.service.mjs +404 -7
- package/esm2022/lib/spatial/observations-in-selection.mjs +83 -0
- package/esm2022/lib/spatial/plane-cells.mjs +119 -0
- package/esm2022/lib/spatial/spatial-controls.facade.mjs +298 -5
- package/esm2022/lib/spatial/spatial-encoding.mjs +35 -3
- package/esm2022/lib/spatial/spatial-hover.mjs +34 -1
- package/esm2022/lib/spatial/spatial-planes.mjs +49 -0
- package/esm2022/lib/spatial/spatial-selection.mjs +2 -2
- package/esm2022/lib/spatial/spatial-tile-merge.mjs +38 -1
- package/esm2022/lib/spatial/transcripts-in-selection.mjs +208 -0
- package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +42 -65
- package/esm2022/lib/spatial-controls/spatial-color-by/spatial-color-by.component.mjs +187 -0
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +47 -12
- package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +38 -10
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +79 -57
- package/esm2022/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.mjs +101 -0
- package/esm2022/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.mjs +94 -0
- package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +9 -3
- package/esm2022/lib/store/region-source-scope.mjs +10 -1
- package/esm2022/lib/store/region-store.service.mjs +33 -2
- package/esm2022/lib/toolbar/toolbar.component.mjs +10 -3
- package/esm2022/lib/visualizer/spatial-region-set.mjs +95 -0
- package/esm2022/lib/visualizer.component.mjs +40 -4
- package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DHrHO2ay.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-YrNqv8wH.mjs} +4521 -759
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-YrNqv8wH.mjs.map +1 -0
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-CKEUwNta.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-Dph35S7m.mjs} +2 -2
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-CKEUwNta.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-Dph35S7m.mjs.map} +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +1 -1
- package/fesm2022/region-source.worker.js +84 -2
- package/lib/contracts/display-types.d.ts +90 -4
- package/lib/contracts/image.contract.d.ts +6 -0
- package/lib/contracts/ports/spatial-data.port.d.ts +7 -0
- package/lib/contracts/region-editor-api.contract.d.ts +9 -0
- package/lib/contracts/region-store.contract.d.ts +6 -0
- package/lib/contracts/spatial-dataset.contract.d.ts +7 -1
- package/lib/contracts/visualizer.contract.d.ts +43 -1
- package/lib/geometry/cell-meshes.d.ts +27 -0
- package/lib/geometry/place.d.ts +45 -0
- package/lib/implementations/napari-js/napari-camera-depth.d.ts +23 -0
- package/lib/implementations/napari-js/napari-loading-state.d.ts +1 -1
- package/lib/implementations/napari-js/napari-scene.d.ts +12 -0
- package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +19 -3
- package/lib/implementations/napari-js/napari-spatial-3d-cells.d.ts +141 -0
- package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +87 -0
- package/lib/implementations/napari-js/napari-spatial-3d-transcripts.d.ts +49 -8
- package/lib/implementations/napari-js/napari-spatial-hover.d.ts +22 -0
- package/lib/implementations/napari-js/napari-spatial-scene.d.ts +12 -0
- package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +15 -0
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +27 -1
- package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +38 -19
- package/lib/implementations/napari-js/napari-volume-scene.d.ts +2 -0
- package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +53 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +11 -2
- package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +7 -0
- package/lib/region-editor/class-tree/class-tree.component.d.ts +16 -1
- package/lib/region-editor/classes-panel/classes-panel.component.d.ts +10 -1
- package/lib/region-editor/region-editor.component.d.ts +4 -0
- package/lib/region-source/region-source-ops.d.ts +12 -0
- package/lib/region-source/region-tiles.d.ts +8 -0
- package/lib/region-source/worker-region-source.d.ts +18 -0
- package/lib/routing-visualizer.service.d.ts +140 -1
- package/lib/spatial/observations-in-selection.d.ts +43 -0
- package/lib/spatial/plane-cells.d.ts +37 -0
- package/lib/spatial/spatial-controls.facade.d.ts +59 -0
- package/lib/spatial/spatial-encoding.d.ts +14 -1
- package/lib/spatial/spatial-hover.d.ts +23 -0
- package/lib/spatial/spatial-planes.d.ts +22 -0
- package/lib/spatial/spatial-selection.d.ts +2 -1
- package/lib/spatial/spatial-tile-merge.d.ts +9 -0
- package/lib/spatial/transcripts-in-selection.d.ts +95 -0
- package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +19 -28
- package/lib/spatial-controls/spatial-color-by/spatial-color-by.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-controls.component.d.ts +17 -2
- package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +16 -6
- package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +26 -23
- package/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.d.ts +48 -0
- package/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.d.ts +43 -0
- package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +3 -1
- package/lib/store/region-source-scope.d.ts +4 -0
- package/lib/store/region-store.service.d.ts +21 -0
- package/lib/toolbar/toolbar.component.d.ts +6 -1
- package/lib/visualizer/spatial-region-set.d.ts +55 -0
- package/lib/visualizer.component.d.ts +14 -0
- package/package.json +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DHrHO2ay.mjs.map +0 -1
|
@@ -5,7 +5,9 @@ import { emptySelection, maskToIndices, mutedFromSelection, } from '../../spatia
|
|
|
5
5
|
import { framePositions } from '../../spatial/spatial-framing';
|
|
6
6
|
import { PIXEL_WORLD_QUANTUM, worldQuantumForExtent } from '../../spatial/world-grid';
|
|
7
7
|
import { observationsInSlice, volumeImageRef } from '../../spatial/spatial-volume-image';
|
|
8
|
+
import { observationsOnPlane, planeBand } from '../../spatial/spatial-planes';
|
|
8
9
|
import { cellTypeColumnFor } from '../../spatial/spatial-tiles';
|
|
10
|
+
import { cellsShown } from '../../spatial/lod';
|
|
9
11
|
import { observationGeneMask, observationGeneStyle } from '../../spatial/spatial-gene-filter';
|
|
10
12
|
import { colorExpressionField, fieldContrastWindow } from '../../spatial/spatial-expression';
|
|
11
13
|
import { computeExpressionFieldAsync } from '../../workers/spatial-math';
|
|
@@ -46,6 +48,15 @@ export class Spatial2dScene extends SpatialSceneBase {
|
|
|
46
48
|
* SPATIAL-19): a new field key supersedes — and aborts — it; a rebuild that leaves the key
|
|
47
49
|
* alone lets it finish. */
|
|
48
50
|
this.geneMapLoads = new Supersede();
|
|
51
|
+
/**
|
|
52
|
+
* The planes of the dataset's region set (its `sliceZ`), set while they slice an image of one
|
|
53
|
+
* plane, and which of them the slider shows: the observations and transcripts drawn are that
|
|
54
|
+
* plane's, as a stack's slice shows its own.
|
|
55
|
+
*/
|
|
56
|
+
this.planes = null;
|
|
57
|
+
this.plane = 0;
|
|
58
|
+
/** Mounted: its markers are in the scene and follow the plane (set before then, it is kept). */
|
|
59
|
+
this.mounted = false;
|
|
49
60
|
this.image = new Image2dScene(ctx, {
|
|
50
61
|
image: !noImage,
|
|
51
62
|
// Only fit to the image when this dataset actually has one. Otherwise there is nothing to
|
|
@@ -72,12 +83,41 @@ export class Spatial2dScene extends SpatialSceneBase {
|
|
|
72
83
|
return;
|
|
73
84
|
this.hover.install(ctx.host);
|
|
74
85
|
this.session.claimTiles(this)?.attach(ctx.viewer);
|
|
86
|
+
this.session.tiles?.setZBand(this.zBand());
|
|
87
|
+
this.session.tiles?.setPlane(this.planes ? this.plane : null);
|
|
75
88
|
this.subscribeSpatial();
|
|
89
|
+
this.mounted = true;
|
|
76
90
|
ctx.tools.scheduleReadback();
|
|
77
91
|
}
|
|
78
92
|
setZ(z) {
|
|
79
93
|
this.image.setZ(z);
|
|
80
94
|
}
|
|
95
|
+
setRegionPlanes(z) {
|
|
96
|
+
this.planes = z?.length ? z : null;
|
|
97
|
+
this.planeChanged();
|
|
98
|
+
}
|
|
99
|
+
setRegionPlane(k) {
|
|
100
|
+
if (k === this.plane)
|
|
101
|
+
return;
|
|
102
|
+
this.plane = k;
|
|
103
|
+
this.planeChanged();
|
|
104
|
+
}
|
|
105
|
+
/** The planes and the one shown, while planes slice the image. */
|
|
106
|
+
planeView() {
|
|
107
|
+
return this.planes ? { planes: this.planes, plane: this.plane } : null;
|
|
108
|
+
}
|
|
109
|
+
/** The z band of the plane shown, or null (every depth). */
|
|
110
|
+
zBand() {
|
|
111
|
+
return this.planes ? planeBand(this.planes, this.plane) : null;
|
|
112
|
+
}
|
|
113
|
+
/** Another plane (or none): its observations and transcripts are drawn. */
|
|
114
|
+
planeChanged() {
|
|
115
|
+
if (!this.mounted || this.ctx.signal.aborted)
|
|
116
|
+
return;
|
|
117
|
+
this.session.tiles?.setZBand(this.zBand());
|
|
118
|
+
this.session.tiles?.setPlane(this.planes ? this.plane : null);
|
|
119
|
+
this.redrawMarkers();
|
|
120
|
+
}
|
|
81
121
|
histogram(channel, bins) {
|
|
82
122
|
return this.image.histogram(channel, bins);
|
|
83
123
|
}
|
|
@@ -88,8 +128,11 @@ export class Spatial2dScene extends SpatialSceneBase {
|
|
|
88
128
|
this.image.setNavigatorVisible(visible);
|
|
89
129
|
}
|
|
90
130
|
dispose() {
|
|
131
|
+
this.mounted = false;
|
|
91
132
|
this.disposeSpatial();
|
|
92
133
|
this.geneMapLoads.cancel();
|
|
134
|
+
this.session.tiles?.setZBand(null);
|
|
135
|
+
this.session.tiles?.setPlane(null);
|
|
93
136
|
this.session.releaseTiles(this);
|
|
94
137
|
this.image.dispose();
|
|
95
138
|
}
|
|
@@ -131,13 +174,14 @@ export class Spatial2dScene extends SpatialSceneBase {
|
|
|
131
174
|
return this.drawn ? this.drawn[k] : k;
|
|
132
175
|
}
|
|
133
176
|
/**
|
|
134
|
-
* Whether the markers are drawn:
|
|
135
|
-
*
|
|
136
|
-
* observations themselves never disappear with them.
|
|
177
|
+
* Whether the markers are drawn: while the user wants them, at every zoom, and not while the
|
|
178
|
+
* cells are — the observations are shown as their markers or as their cells, one or the other.
|
|
137
179
|
*/
|
|
138
180
|
pointsVisible() {
|
|
139
|
-
const view = this.session.latest
|
|
140
|
-
|
|
181
|
+
const [dataset, view] = this.session.latest ?? [];
|
|
182
|
+
if (!(view?.showPoints ?? true))
|
|
183
|
+
return false;
|
|
184
|
+
return !(view && dataset && cellsShown(dataset, view));
|
|
141
185
|
}
|
|
142
186
|
/**
|
|
143
187
|
* Redraw the markers over a freshly rendered image. Two reasons, both invisible from the
|
|
@@ -206,7 +250,7 @@ export class Spatial2dScene extends SpatialSceneBase {
|
|
|
206
250
|
// pixel grid. Without the filter the specimen's whole depth piles onto one
|
|
207
251
|
// section and reads as a smear; without the affine the coordinates are read
|
|
208
252
|
// as pixels and land off the slice entirely.
|
|
209
|
-
const slab = slabAt(dataset, this.ctx.z());
|
|
253
|
+
const slab = slabAt(dataset, this.ctx.z(), this.planeView());
|
|
210
254
|
// The gene map goes UNDER the cells, so it is settled before they are added.
|
|
211
255
|
await this.ensureGeneMap(viewer, dataset, view, selection, slab);
|
|
212
256
|
if (!task())
|
|
@@ -475,8 +519,8 @@ export class Spatial2dScene extends SpatialSceneBase {
|
|
|
475
519
|
if (!slab && !dataset.imageRef)
|
|
476
520
|
return;
|
|
477
521
|
const size = this.ctx.imageSize();
|
|
478
|
-
const imageW = slab ?
|
|
479
|
-
const imageH = slab ?
|
|
522
|
+
const imageW = slab?.grid ? slab.grid.width : size.width;
|
|
523
|
+
const imageH = slab?.grid ? slab.grid.height : size.height;
|
|
480
524
|
if (!imageW || !imageH)
|
|
481
525
|
return;
|
|
482
526
|
const step = Math.max(1, Math.ceil(Math.max(imageW, imageH) / GENE_MAP_MAX_SIDE));
|
|
@@ -588,6 +632,14 @@ export class Spatial2dScene extends SpatialSceneBase {
|
|
|
588
632
|
// Everything NOT selected is muted; with nothing selected, nothing is muted
|
|
589
633
|
// and the whole tissue reads normally (the CosMx highlight-vs-mute rule).
|
|
590
634
|
const muted = mutedFromSelection(selection);
|
|
635
|
+
// One colour, the cells' too ("Single colour").
|
|
636
|
+
if (!colorBy && view.cellColorMode === 'single') {
|
|
637
|
+
return encodeCategorical(new Uint16Array(dataset.observations.count), {
|
|
638
|
+
colors: [view.cellSingleColor],
|
|
639
|
+
opacity: view.opacity,
|
|
640
|
+
muted,
|
|
641
|
+
});
|
|
642
|
+
}
|
|
591
643
|
if (!port || !colorBy) {
|
|
592
644
|
// Genuinely uniform: one broadcast tuple, so a flat 84k-observation view
|
|
593
645
|
// does not allocate a colour per point.
|
|
@@ -661,21 +713,35 @@ function observationPositions(obs, drawn) {
|
|
|
661
713
|
}
|
|
662
714
|
/**
|
|
663
715
|
* The plane `slice` of a volume-backed dataset: its pixel affine, the observations that fall in
|
|
664
|
-
* it, and the marker floor that grid needs.
|
|
716
|
+
* it, and the marker floor that grid needs. Over a real `imageRef`, the region set's plane shown
|
|
717
|
+
* when `planes` slice the image (a 3D assay imaged on one plane): the observations nearest that
|
|
718
|
+
* plane, in the image's own pixels.
|
|
665
719
|
*
|
|
666
|
-
* Null for
|
|
667
|
-
* every observation belongs to the one section) and for one with no volume at all —
|
|
668
|
-
* which draw exactly as before.
|
|
720
|
+
* Null for any other dataset with a real `imageRef` (its coordinates are already the image's
|
|
721
|
+
* pixels and every observation belongs to the one section) and for one with no volume at all —
|
|
722
|
+
* both of which draw exactly as before.
|
|
669
723
|
*/
|
|
670
|
-
function slabAt(dataset, slice) {
|
|
724
|
+
function slabAt(dataset, slice, planes) {
|
|
671
725
|
const volume = dataset.volume;
|
|
672
|
-
if (dataset.imageRef
|
|
726
|
+
if (dataset.imageRef) {
|
|
727
|
+
if (!planes)
|
|
728
|
+
return null;
|
|
729
|
+
return {
|
|
730
|
+
ref: dataset.imageRef,
|
|
731
|
+
indices: observationsOnPlane(dataset.observations, planes.planes, planes.plane),
|
|
732
|
+
slice: planes.plane,
|
|
733
|
+
minDiameter: 0,
|
|
734
|
+
grid: null,
|
|
735
|
+
};
|
|
736
|
+
}
|
|
737
|
+
if (!volume)
|
|
673
738
|
return null;
|
|
674
739
|
return {
|
|
675
740
|
ref: volumeImageRef(volume, dataset.micronsPerUnit),
|
|
676
741
|
indices: observationsInSlice(dataset.observations, volume, slice),
|
|
677
742
|
slice,
|
|
678
743
|
minDiameter: SPATIAL_SLICE_MIN_DIAMETER_PX * volume.voxelSize[0],
|
|
744
|
+
grid: { width: volume.width, height: volume.height },
|
|
679
745
|
};
|
|
680
746
|
}
|
|
681
747
|
/** Per-observation napari-js symbol codes: each observation's gene's icon (`codes` index
|
|
@@ -691,4 +757,4 @@ export function gatherSymbols(symbols, indices) {
|
|
|
691
757
|
return symbols;
|
|
692
758
|
return Uint8Array.from(indices, (i) => symbols[i]);
|
|
693
759
|
}
|
|
694
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXNwYXRpYWwtMmQtc2NlbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvbmFwYXJpLXNwYXRpYWwtMmQtc2NlbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUk1QyxPQUFPLEVBQ0wsV0FBVyxFQUtYLG1CQUFtQixHQUNwQixNQUFNLDBDQUEwQyxDQUFDO0FBRWxELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN2RyxPQUFPLEVBRUwsY0FBYyxFQUNkLGFBQWEsRUFDYixrQkFBa0IsR0FDbkIsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDL0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdEYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzlGLE9BQU8sRUFBbUIsb0JBQW9CLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUM5RyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTlDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNs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QyxDQUFDLENBQUM7QUFDekYsQ0FBQztBQUVELGlGQUFpRjtBQUNqRixNQUFNLFVBQVUsYUFBYSxDQUFDLE9BQTBCLEVBQUUsT0FBcUI7SUFDN0UsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU87UUFBRSxPQUFPLE9BQU8sQ0FBQztJQUN6QyxPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcG9pbnRTeW1ib2xDb2RlIH0gZnJvbSAnbmFwYXJpLWpzJztcbmltcG9ydCB0eXBlIHsgSW1hZ2VMYXllciwgUG9pbnRzTGF5ZXIsIFZpZXdlciB9IGZyb20gJ25hcGFyaS1qcyc7XG5cbmltcG9ydCB7IElIaXN0b2dyYW0gfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY2hhbm5lbC1oaXN0b2dyYW0tYXBpLmNvbnRyYWN0JztcbmltcG9ydCB7XG4gIE5PX0NBVEVHT1JZLFxuICBTcGF0aWFsQ29sdW1uLFxuICBTcGF0aWFsRGF0YXNldCxcbiAgU3BhdGlhbEltYWdlUmVmLFxuICBTcGF0aWFsT2JzZXJ2YXRpb25zLFxuICBpc0NhdGVnb3JpY2FsQ29sdW1uLFxufSBmcm9tICcuLi8uLi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0JztcbmltcG9ydCB7IFNwYXRpYWxWaWV3U3RhdGUsIFRyYW5zY3JpcHRHbHlwaE5hbWUgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgeyBjYXRlZ29yeUNvbG9yc0ZvciwgZW5jb2RlQ2F0ZWdvcmljYWwsIG1hcmtlckRpYW1ldGVycyB9IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1lbmNvZGluZyc7XG5pbXBvcnQge1xuICBTcGF0aWFsU2VsZWN0aW9uTWFzayxcbiAgZW1wdHlTZWxlY3Rpb24sXG4gIG1hc2tUb0luZGljZXMsXG4gIG11dGVkRnJvbVNlbGVjdGlvbixcbn0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLXNlbGVjdGlvbic7XG5pbXBvcnQgeyBmcmFtZVBvc2l0aW9ucyB9IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1mcmFtaW5nJztcbmltcG9ydCB7IFBJWEVMX1dPUkxEX1FVQU5UVU0sIHdvcmxkUXVhbnR1bUZvckV4dGVudCB9IGZyb20gJy4uLy4uL3NwYXRpYWwvd29ybGQtZ3JpZCc7XG5pbXBvcnQgeyBvYnNlcnZhdGlvbnNJblNsaWNlLCB2b2x1bWVJbWFnZVJlZiB9IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC12b2x1bWUtaW1hZ2UnO1xuaW1wb3J0IHsgY2VsbFR5cGVDb2x1bW5Gb3IgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtdGlsZXMnO1xuaW1wb3J0IHsgb2JzZXJ2YXRpb25HZW5lTWFzaywgb2JzZXJ2YXRpb25HZW5lU3R5bGUgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtZ2VuZS1maWx0ZXInO1xuaW1wb3J0IHsgRXhwcmVzc2lvbkZpZWxkLCBjb2xvckV4cHJlc3Npb25GaWVsZCwgZmllbGRDb250cmFzdFdpbmRvdyB9IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1leHByZXNzaW9uJztcbmltcG9ydCB7IGNvbXB1dGVFeHByZXNzaW9uRmllbGRBc3luYyB9IGZyb20gJy4uLy4uL3dvcmtlcnMvc3BhdGlhbC1tYXRoJztcbmltcG9ydCB7IFN1cGVyc2VkZSB9IGZyb20gJy4uLy4uL3V0aWwvc3VwZXJzZWRlJztcbmltcG9ydCB7IGlzQWJvcnRFcnJvciB9IGZyb20gJy4uL3RpbGUtc2VydmVyJztcbmltcG9ydCB7IE5hcGFyaVNwYXRpYWxUaWxlTGF5ZXJzIH0gZnJvbSAnLi9uYXBhcmktc3BhdGlhbC10aWxlcyc7XG5pbXBvcnQgeyBHTFlQSF9TWU1CT0xTIH0gZnJvbSAnLi9zcGF0aWFsLXRpbGVzL3RyYW5zY3JpcHQtbGF5ZXJzJztcbmltcG9ydCB7IEltYWdlMmRTY2VuZSB9IGZyb20gJy4vbmFwYXJpLWltYWdlLTJkLXNjZW5lJztcbmltcG9ydCB7XG4gIEdFTkVfTUFQX01BWF9TSURFLFxuICBHRU5FX01BUF9TSUdNQSxcbiAgU1BBVElBTF9GQUxMQkFDS19SQURJVVMsXG4gIFNQQVRJQUxfTUFSS0VSX01JTl9TQ1JFRU5fUFgsXG4gIFNQQVRJQUxfTkVVVFJBTF9DT0xPUixcbiAgU1BBVElBTF9ORVVUUkFMX0hFWCxcbiAgU1BBVElBTF9TTElDRV9NSU5fRElBTUVURVJfUFgsXG4gIFBvaW50Q29sb3JzLFxuICBlbmNvZGVTcGF0aWFsQ29udGludW91cyxcbiAgZ2F0aGVyQ29sb3JzLFxuICBoaWRlVW5zaG93bixcbn0gZnJvbSAnLi9uYXBhcmktc3BhdGlhbC1lbmNvZGluZyc7XG5pbXBvcnQgeyBTcGF0aWFsU2NlbmVCYXNlLCBTcGF0aWFsU2Vzc2lvbiwgU3BhdGlhbFRpbGVPd25lciB9IGZyb20gJy4vbmFwYXJpLXNwYXRpYWwtc2NlbmUnO1xuaW1wb3J0IHR5cGUgeyBOYXBhcmlTY2VuZSwgU2NlbmVDb250ZXh0IH0gZnJvbSAnLi9uYXBhcmktc2NlbmUnO1xuXG4vKiogVGhlIHBsYW5lIGEgdm9sdW1lLWJhY2tlZCBkYXRhc2V0IGlzIHNob3dpbmcgKHNlZSB7QGxpbmsgU3BhdGlhbDJkU2NlbmUuc2xhYn0pLiAqL1xuaW50ZXJmYWNlIFNsYWIge1xuICByZWY6IFNwYXRpYWxJbWFnZVJlZjtcbiAgaW5kaWNlczogVWludDMyQXJyYXk7XG4gIHNsaWNlOiBudW1iZXI7XG4gIG1pbkRpYW1ldGVyOiBudW1iZXI7XG59XG5cbi8qKlxuICogU1BBVElBTF9PTUlDUyAocmV2aWV3IEFwcGVuZGl4IEIsIGNsdXN0ZXIgSik6IHRoZSB0aXNzdWUgaW1hZ2UgKGFuIHtAbGluayBJbWFnZTJkU2NlbmV9KSB3aXRoIG9uZVxuICogbWFya2VyIHBlciBvYnNlcnZhdGlvbiwgY29sb3VyZWQgYnkgYW4gYW5ub3RhdGlvbiBjb2x1bW4gb3IgYSBnZW5lLCB0aGUgZ2VuZSBtYXAgdW5kZXIgdGhlXG4gKiBjZWxscywgYW5kIHRoZSBsZXZlbC1vZi1kZXRhaWwgdGlsZSBsYXllcnMgKG91dGxpbmVzLCB0cmFuc2NyaXB0cywgZGVuc2l0eSkgb3ZlciB0aGVtLiBUaGVcbiAqIG1hcmtlcnMgcmVidWlsZCB3aGVuZXZlciB0aGUgZGF0YXNldCBvciB0aGUgdmlldyBzdGF0ZSBjaGFuZ2VzLCBzbyBzd2l0Y2hpbmcgdGhlIGNvbG91ci1ieVxuICogY29sdW1uIGRvZXMgbm90IHJlbW91bnQgdGhlIHNjZW5lLlxuICpcbiAqIFNldHMgdXAgdGhlIGZ1bGwgMkQgaW50ZXJhY3Rpb24gc3RhY2sg4oCUIHJlZ2lvbiBvdmVybGF5LCBwaXhlbCB0b29scywgcmVhZGJhY2sgY3VycmVuY3kg4oCUIGV4YWN0bHlcbiAqIGFzIHRoZSBwbGFpbiBpbWFnZSB2aWV3IGRvZXMuIFRoYXQgaXMgTk9UIG9wdGlvbmFsIGhlcmU6IHRoaXMgbW9kZSdzIHNlbGVjdGlvbiBpcyBkcml2ZW4gYnlcbiAqIGRyYXduIFJPSXMsIHNvIHdpdGhvdXQgdGhlIG92ZXJsYXkgdGhlcmUgaXMgbm8gd2F5IHRvIG1ha2UgYSBzZWxlY3Rpb24gYXQgYWxsLlxuICovXG5leHBvcnQgY2xhc3MgU3BhdGlhbDJkU2NlbmUgZXh0ZW5kcyBTcGF0aWFsU2NlbmVCYXNlIGltcGxlbWVudHMgTmFwYXJpU2NlbmUsIFNwYXRpYWxUaWxlT3duZXIge1xuICByZWFkb25seSBpbWFnZTogSW1hZ2UyZFNjZW5lO1xuICAvKiogVGhlIG9ic2VydmF0aW9uIG1hcmtlcnMsIGFuZCB3aGljaCBkYXRhc2V0L3BsYW5lIHRoZXkgd2VyZSBidWlsdCBmb3Ig4oCUIHNvIGEgZGlzcGxheS1vbmx5XG4gICAqICBjaGFuZ2UgKHNpemUsIGNvbG91ciwgb3BhY2l0eSwgc2VsZWN0aW9uKSBjYW4gdXBkYXRlIHRoZW0gaW4gcGxhY2UuICovXG4gIHByaXZhdGUgcG9pbnRzOiBQb2ludHNMYXllciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxheWVyS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSBvYnNlcnZhdGlvbiBlYWNoIG1hcmtlciBpcywgaW4gZHJhdyBvcmRlcjsgbnVsbCB3aGVuIGV2ZXJ5IG9ic2VydmF0aW9uIGlzIGRyYXduLiAqL1xuICBwcml2YXRlIGRyYXduOiBVaW50MzJBcnJheSB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGdlbmUgbWFwJ3MgbGF5ZXIgYW5kIHRoZSBpbnB1dHMgaXQgd2FzIGNvbG91cmVkIGZvciAoaXRzIGZpZWxkIGlzIGNhY2hlZCBpbiB0aGUgc2Vzc2lvbixcbiAgICogIG9uIGEgY2xvY2sgb2YgaXRzIG93bikuICovXG4gIGdlbmVNYXBMYXllcjogSW1hZ2VMYXllciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGdlbmVNYXBLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGRhdGFzZXQgdGhlIGNhbWVyYSBoYXMgYmVlbiBmcmFtZWQgb24g4oCUIHNlZSB7QGxpbmsgZnJhbWVPbmNlfS4gKi9cbiAgcHJpdmF0ZSBmcmFtZWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGdlbmUtbWFwIGVzdGltYXRlIGluIGZsaWdodCAob2ZmIHRoZSBtYWluIHRocmVhZCBwYXN0IHRoZSB3b3JrZXIgdGhyZXNob2xkLFxuICAgKiAgU1BBVElBTC0xOSk6IGEgbmV3IGZpZWxkIGtleSBzdXBlcnNlZGVzIOKAlCBhbmQgYWJvcnRzIOKAlCBpdDsgYSByZWJ1aWxkIHRoYXQgbGVhdmVzIHRoZSBrZXlcbiAgICogIGFsb25lIGxldHMgaXQgZmluaXNoLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGdlbmVNYXBMb2FkcyA9IG5ldyBTdXBlcnNlZGUoKTtcblxuICAvKiogYG5vSW1hZ2VgOiBhbiBpbWFnZS1sZXNzIGRhdGFzZXQgb3BlbmVkIGJlZm9yZSBhbnkgaW1hZ2Ug4oCUIHRoZSBvYnNlcnZhdGlvbnMgYWxvbmUuICovXG4gIGNvbnN0cnVjdG9yKGN0eDogU2NlbmVDb250ZXh0LCBzZXNzaW9uOiBTcGF0aWFsU2Vzc2lvbiwgbm9JbWFnZSA9IGZhbHNlKSB7XG4gICAgc3VwZXIoY3R4LCBzZXNzaW9uLCBmYWxzZSk7XG4gICAgdGhpcy5pbWFnZSA9IG5ldyBJbWFnZTJkU2NlbmUoY3R4LCB7XG4gICAgICBpbWFnZTogIW5vSW1hZ2UsXG4gICAgICAvLyBPbmx5IGZpdCB0byB0aGUgaW1hZ2Ugd2hlbiB0aGlzIGRhdGFzZXQgYWN0dWFsbHkgaGFzIG9uZS4gT3RoZXJ3aXNlIHRoZXJlIGlzIG5vdGhpbmcgdG9cbiAgICAgIC8vIGZpdCwgdGhlIGltYWdlIHNpemUgc3RpbGwgaG9sZHMgdGhlIExBU1QgaW1hZ2UncyBkaW1lbnNpb25zLCBhbmQgdGhpcyBmaXRzIHRvIHRob3NlIOKAlCBhbmRcbiAgICAgIC8vIGJlY2F1c2UgaXQgZGVmZXJzIHRvIGEgZnJhbWUsIGl0IGxhbmRzIEFGVEVSIHRoZSBwb2ludHMgYXJlIGFkZGVkIGFuZCBvdmVyd3JpdGVzIHRoZVxuICAgICAgLy8gZnJhbWluZyB0aGV5IHNldC4gVGhhdCBpcyB3aGF0IGxlZnQgYW4gaW1hZ2UtbGVzcyBkYXRhc2V0IGFzIGEgdGVuLXBpeGVsIHNwZWNrLlxuICAgICAgZml0OiAoKSA9PiAhIXNlc3Npb24ubGF0ZXN0Py5bMF0/LmltYWdlUmVmLFxuICAgICAgb25TbGljZTogKHJlcmVuZGVyZWQpID0+IHtcbiAgICAgICAgdGhpcy5yZWRyYXdNYXJrZXJzKCk7XG4gICAgICAgIC8vIFRoZSBzdGl0Y2hlZCByZS1yZW5kZXIgY2xlYXJlZCB0aGUgY2VsbHMsIHRyYW5zY3JpcHRzIGFuZCBkZW5zaXR5IHRvbzogcmUtcGxhbiB0aGVtIG5vd1xuICAgICAgICAvLyByYXRoZXIgdGhhbiBhdCB0aGUgbmV4dCBjYW1lcmEgbW92ZSAoZWFjaCBncm91cCByZWRyYXdzIG9ubHkgd2hhdCBsZWZ0IHRoZSBzY2VuZSkuXG4gICAgICAgIGlmIChyZXJlbmRlcmVkKSB0aGlzLnNlc3Npb24udGlsZXM/LnJlZnJlc2goKTtcbiAgICAgIH0sXG4gICAgICBvbk5hdmlnYXRvckludGVyYWN0OiAoKSA9PiB0aGlzLmhvdmVyLmhpZGUoKSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIG1vdW50KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzO1xuICAgIGF3YWl0IHRoaXMuaW1hZ2UubW91bnQoKTtcbiAgICAvLyBEaXNwb3NlZCB3aGlsZSB0aGUgaW1hZ2UgbG9hZGVkOiBjbGFpbWluZyB0aGUgdGlsZXMgbm93IHdvdWxkIHRha2UgdGhlbSBmcm9tIHRoZSBuZXh0IHNjZW5lLFxuICAgIC8vIGFuZCB0aGUgc3BhdGlhbCBzdWJzY3JpcHRpb24gd291bGQgb3V0bGl2ZSB0aGlzIG9uZS5cbiAgICBpZiAoY3R4LnNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gICAgdGhpcy5ob3Zlci5pbnN0YWxsKGN0eC5ob3N0KTtcbiAgICB0aGlzLnNlc3Npb24uY2xhaW1UaWxlcyh0aGlzKT8uYXR0YWNoKGN0eC52aWV3ZXIpO1xuICAgIHRoaXMuc3Vic2NyaWJlU3BhdGlhbCgpO1xuICAgIGN0eC50b29scy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gIH1cblxuICBzZXRaKHo6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuaW1hZ2Uuc2V0Wih6KTtcbiAgfVxuXG4gIGhpc3RvZ3JhbShjaGFubmVsOiBudW1iZXIsIGJpbnM6IG51bWJlcik6IElIaXN0b2dyYW0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5pbWFnZS5oaXN0b2dyYW0oY2hhbm5lbCwgYmlucyk7XG4gIH1cblxuICBzZXRJbWFnZVNtb290aGluZyhlbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5pbWFnZS5zZXRJbWFnZVNtb290aGluZyhlbmFibGVkKTtcbiAgfVxuXG4gIHNldE5hdmlnYXRvclZpc2libGUodmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuaW1hZ2Uuc2V0TmF2aWdhdG9yVmlzaWJsZSh2aXNpYmxlKTtcbiAgfVxuXG4gIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwb3NlU3BhdGlhbCgpO1xuICAgIHRoaXMuZ2VuZU1hcExvYWRzLmNhbmNlbCgpO1xuICAgIHRoaXMuc2Vzc2lvbi5yZWxlYXNlVGlsZXModGhpcyk7XG4gICAgdGhpcy5pbWFnZS5kaXNwb3NlKCk7XG4gIH1cblxuICBjYW52YXNTaXplKCk6IFtudW1iZXIsIG51bWJlcl0ge1xuICAgIHJldHVybiBbdGhpcy5jdHguY2FudmFzLmNsaWVudFdpZHRoID8/IDAsIHRoaXMuY3R4LmNhbnZhcy5jbGllbnRIZWlnaHQgPz8gMF07XG4gIH1cblxuICBwb2x5Z29uc1Nob3duQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wb2ludHMpIHRoaXMucG9pbnRzLnZpc2libGUgPSB0aGlzLnBvaW50c1Zpc2libGUoKTtcbiAgICB0aGlzLmN0eC52aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFmdGVyQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuc2Vzc2lvbi50aWxlcz8ucmVmcmVzaCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGhvdmVyVGlsZXMoKTogTmFwYXJpU3BhdGlhbFRpbGVMYXllcnMgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uLnRpbGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBvYnNlcnZhdGlvbiB1bmRlciBhIGNsaWVudCBwb3NpdGlvbjogbmFwYXJpLWpzJ3MgcGljayBvbiB0aGUgbWFya2VyIGxheWVyIGl0c2VsZiAoYSBncmlkXG4gICAqIG92ZXIgaXRzIHBvc2l0aW9ucywgcmVidWlsdCBvbmx5IHdoZW4gdGhleSBjaGFuZ2UpLCBzbyB0aGUgdG9vbHRpcCBjYW5ub3QgbmFtZSBhIGNlbGwgdGhhdCBpc1xuICAgKiBub3QgZHJhd24sIHRoZW4gdGhlIGRyYXduIGluZGV4IG1hcHBlZCBiYWNrIHRvIHRoZSBvYnNlcnZhdGlvbi5cbiAgICpcbiAgICogQSBtYXJrZXIgaXMgaGl0IGFueXdoZXJlIG9uIGl0cyBkcmF3biBkaXNjLCBvciB3aXRoaW4gYHNsYWNrUHhgIHNjcmVlbiBwaXhlbHMgb2YgaXRzIGNlbnRyZVxuICAgKiB3aGVuIGl0IGlzIHNtYWxsZXIgdGhhbiB0aGF0IChhIDEuNSBweCBkb3Qgc3RpbGwgaGFzIHRvIGJlIGhvdmVyYWJsZSksIGFuZCBvZiBzZXZlcmFsIGhpdHMgdGhlXG4gICAqIE5FQVJFU1QgY2VudHJlIHdpbnMgKGFuIGV4YWN0IHRpZSBnb2VzIHRvIHRoZSBvbmUgZHJhd24gb24gdG9wKS4gTm90IG5hcGFyaSdzIGAndG9wbW9zdCdgOiB0aGVcbiAgICogc2xhY2sgaXMgd2lkZXIgdGhhbiBtb3N0IG1hcmtlcnMsIGFuZCBvdmVyIGEgZGVuc2UgZmllbGQgb2Ygc21hbGwgb25lcyBcInRoZSBsYXN0IGRyYXduIHdpdGhpblxuICAgKiAxMCBweFwiIG5hbWVzIGEgbmVpZ2hib3VyIHJhdGhlciB0aGFuIHRoZSBjZWxsIHVuZGVyIHRoZSBjdXJzb3IuXG4gICAqL1xuICBwcm90ZWN0ZWQgcGlja09ic2VydmF0aW9uKGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyLCBzbGFja1B4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHBvaW50cyA9IHRoaXMucG9pbnRzO1xuICAgIGlmICghcG9pbnRzKSByZXR1cm4gLTE7XG4gICAgY29uc3Qgdmlld2VyID0gdGhpcy5jdHgudmlld2VyO1xuICAgIGNvbnN0IFt3eCwgd3ldID0gdmlld2VyLmNhbnZhc1RvV29ybGQoY2xpZW50WCwgY2xpZW50WSk7XG4gICAgY29uc3Qgem9vbSA9IHZpZXdlci5jYW1lcmEuem9vbTtcbiAgICBjb25zdCBrID0gcG9pbnRzLnBpY2sod3gsIHd5LCB7IHRvbGVyYW5jZTogc2xhY2tQeCAvICh6b29tID4gMCA/IHpvb20gOiAxKSwgdGllQnJlYWs6ICduZWFyZXN0JyB9KTtcbiAgICBpZiAoayA8IDApIHJldHVybiAtMTtcbiAgICByZXR1cm4gdGhpcy5kcmF3biA/IHRoaXMuZHJhd25ba10gOiBrO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG1hcmtlcnMgYXJlIGRyYXduOiB3aGVuZXZlciB0aGUgdXNlciB3YW50cyB0aGVtLCBhdCBldmVyeSB6b29tLiBDZWxsIG91dGxpbmVzIGNvbWVcbiAgICogYW5kIGdvIHdpdGggdGhlIHpvb20gKHRoZWlyIGxldmVsIG9mIGRldGFpbCBmb2xsb3dzIGl0KSBhbmQgYXJlIGRyYXduIG92ZXIgdGhlIG1hcmtlcnM7IHRoZVxuICAgKiBvYnNlcnZhdGlvbnMgdGhlbXNlbHZlcyBuZXZlciBkaXNhcHBlYXIgd2l0aCB0aGVtLlxuICAgKi9cbiAgcHJpdmF0ZSBwb2ludHNWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHZpZXcgPSB0aGlzLnNlc3Npb24ubGF0ZXN0Py5bMV07XG4gICAgcmV0dXJuIHZpZXc/LnNob3dQb2ludHMgPz8gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWRyYXcgdGhlIG1hcmtlcnMgb3ZlciBhIGZyZXNobHkgcmVuZGVyZWQgaW1hZ2UuIFR3byByZWFzb25zLCBib3RoIGludmlzaWJsZSBmcm9tIHRoZVxuICAgKiBzcGF0aWFsIHN0b3JlIOKAlCB3aGljaCBpcyB3aHkgYSBzY3J1YiBvciBhIHJlLXJlbmRlciBuZXZlciByZWFjaGVkIHRoZSBtYXJrZXJzIG9uIGl0cyBvd246XG4gICAqICAtIHRoZSBpbWFnZSByZW5kZXIgQ0xFQVJTIHRoZSBsYXllciBsaXN0LCB0YWtpbmcgdGhlIG1hcmtlcnMgd2l0aCBpdDtcbiAgICogIC0gb3ZlciBhIHZvbHVtZS1iYWNrZWQgZGF0YXNldCB0aGUgZGlzcGxheWVkIHBsYW5lIGRlY2lkZXMgd2hpY2ggb2JzZXJ2YXRpb25zIGJlbG9uZyBvblxuICAgKiAgICBzY3JlZW4gYXQgYWxsLCBzbyB0aGUgY2VsbHMgaGF2ZSB0byBtb3ZlIHdpdGggdGhlIHNlY3Rpb24gcmF0aGVyIHRoYW4gaGFuZyBvdmVyIGFub3RoZXIuXG4gICAqL1xuICBwcml2YXRlIHJlZHJhd01hcmtlcnMoKTogdm9pZCB7XG4gICAgY29uc3QgbGF0ZXN0ID0gdGhpcy5zZXNzaW9uLmxhdGVzdDtcbiAgICBpZiAoIWxhdGVzdD8uWzBdKSByZXR1cm47XG4gICAgdm9pZCB0aGlzLnJlYnVpbGQoLi4ubGF0ZXN0KTtcbiAgfVxuXG4gIC8qKiAoUmUpYnVpbGQgdGhlIG9ic2VydmF0aW9uIG1hcmtlciBsYXllciBmb3IgdGhlIGN1cnJlbnQgZGF0YXNldCArIHZpZXcgc3RhdGUuICovXG4gIHByb3RlY3RlZCBhc3luYyByZWJ1aWxkKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCxcbiAgICB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2sgPSBlbXB0eVNlbGVjdGlvbigpLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2aWV3ZXIgPSB0aGlzLmN0eC52aWV3ZXI7XG4gICAgY29uc3QgdGFzayA9IHRoaXMucmVidWlsZHMubmV4dCgpO1xuXG4gICAgLy8gUmVzb2x2ZSBjb2xvdXJzIEJFRk9SRSB0b3VjaGluZyB0aGUgc2NlbmU6IGEgZ2VuZSBmZXRjaCBjYW4gZmFpbCBvciBiZVxuICAgIC8vIHN1cGVyc2VkZWQsIGFuZCBkcm9wcGluZyB0aGUgZXhpc3RpbmcgbGF5ZXIgZmlyc3Qgd291bGQgYmxhbmsgdGhlIHZpZXcuXG4gICAgbGV0IGZhY2VDb2xvcjogUG9pbnRDb2xvcnM7XG4gICAgbGV0IHN5bWJvbHM6IFVpbnQ4QXJyYXkgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgc2hvd246IFVpbnQ4QXJyYXkgfCBudWxsID0gbnVsbDtcbiAgICBjb25zdCBlbmRMb2FkaW5nID0gdGhpcy5jdHguYmFkZ2UuYmVnaW4oJ09ic2VydmF0aW9ucycpO1xuICAgIHRyeSB7XG4gICAgICAvLyBXaGljaCBvYnNlcnZhdGlvbnMgdGhlIGdlbmUgZmlsdGVyIGtlZXBzLCBzZXR0bGVkIGFwYXJ0IGZyb20gdGhlaXIgY29sb3VyczogYSBjb2xvdXIgY2FuXG4gICAgICAvLyBmYWxsIGJhY2sgdG8gYSBmbGF0IG9uZSwgdGhlIGZpbHRlciBjYW5ub3QuIERyYXduIHdpdGhvdXQgaXQsIGV2ZXJ5IG9ic2VydmF0aW9uIHdvdWxkXG4gICAgICAvLyBzaG93IGFzIGlmIGl0IGV4cHJlc3NlZCB0aGUgcGlja2VkIGdlbmVzLiBTbyBhIGZhaWxlZCByZWFkIGtlZXBzIHRoZSBtYXJrZXJzIGFzIHRoZXlcbiAgICAgIC8vIHdlcmUgZHJhd24sIGFuZCB0aGUgcGFuZWwgc2F5cyB0aGUgZmlsdGVyIGNvdWxkIG5vdCBiZSBhcHBsaWVkLlxuICAgICAgdHJ5IHtcbiAgICAgICAgc2hvd24gPSBkYXRhc2V0ID8gYXdhaXQgdGhpcy5maWx0ZXJNYXNrKGRhdGFzZXQsIHZpZXcpIDogbnVsbDtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIGdlbmUgZmlsdGVyIGNvdWxkIG5vdCBiZSBhcHBsaWVkIOKAlCBrZWVwaW5nIHRoZSBvYnNlcnZhdGlvbnMgYXMgZHJhd24nLCBlcnIpO1xuICAgICAgICBpZiAodGFzaygpKSB0aGlzLnNlc3Npb24ucmVwb3J0R2VuZUZpbHRlcih0cnVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBkYXRhc2V0ID8gYXdhaXQgdGhpcy5tYXJrZXJTdHlsZShkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24pIDogbnVsbDtcbiAgICAgICAgZmFjZUNvbG9yID0gc3R5bGU/LmNvbG9ycyA/PyBTUEFUSUFMX05FVVRSQUxfQ09MT1I7XG4gICAgICAgIHN5bWJvbHMgPSBzdHlsZT8uc3ltYm9scyA/PyBudWxsO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gc3BhdGlhbCBjb2xvdXJpbmcgZmFpbGVkIOKAlCBmYWxsaW5nIGJhY2sgdG8gYSBmbGF0IGNvbG91cicsIGVycik7XG4gICAgICAgIGZhY2VDb2xvciA9IFNQQVRJQUxfTkVVVFJBTF9DT0xPUjtcbiAgICAgICAgc3ltYm9scyA9IG51bGw7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGVuZExvYWRpbmcoKTtcbiAgICB9XG4gICAgLy8gQSBuZXdlciByZWJ1aWxkIChvciBhIHRlYXJkb3duKSBzdGFydGVkIHdoaWxlIHRoZSB2ZWN0b3Igd2FzIGluIGZsaWdodC5cbiAgICBpZiAoIXRhc2soKSkgcmV0dXJuO1xuICAgIHRoaXMuc2Vzc2lvbi5yZXBvcnRHZW5lRmlsdGVyKGZhbHNlKTtcbiAgICAvLyBUaGUgZmlsdGVyIGFwcGxpZXMgdG8gd2hpY2hldmVyIGNvbG91cnMgd29uLCB0aGUgZmFsbGJhY2sncyBpbmNsdWRlZC5cbiAgICBpZiAoc2hvd24gJiYgZGF0YXNldCkgZmFjZUNvbG9yID0gaGlkZVVuc2hvd24oZmFjZUNvbG9yLCBzaG93bik7XG5cbiAgICBpZiAoIWRhdGFzZXQgfHwgZGF0YXNldC5vYnNlcnZhdGlvbnMuY291bnQgPT09IDApIHtcbiAgICAgIHRoaXMucmVtb3ZlTGF5ZXJzKHZpZXdlcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQSBkYXRhc2V0IHdob3NlIGltYWdlIElTIGl0cyB2b2x1bWUgc2hvd3MgT05FIFBMQU5FIGF0IGEgdGltZSwgc28gdGhlXG4gICAgLy8gbWFya2VycyBhcmUgdGhlIG9ic2VydmF0aW9ucyBpbiB0aGUgZGlzcGxheWVkIHBsYW5lLCBkcmF3biBpbiB0aGF0IHBsYW5lJ3NcbiAgICAvLyBwaXhlbCBncmlkLiBXaXRob3V0IHRoZSBmaWx0ZXIgdGhlIHNwZWNpbWVuJ3Mgd2hvbGUgZGVwdGggcGlsZXMgb250byBvbmVcbiAgICAvLyBzZWN0aW9uIGFuZCByZWFkcyBhcyBhIHNtZWFyOyB3aXRob3V0IHRoZSBhZmZpbmUgdGhlIGNvb3JkaW5hdGVzIGFyZSByZWFkXG4gICAgLy8gYXMgcGl4ZWxzIGFuZCBsYW5kIG9mZiB0aGUgc2xpY2UgZW50aXJlbHkuXG4gICAgY29uc3Qgc2xhYiA9IHNsYWJBdChkYXRhc2V0LCB0aGlzLmN0eC56KCkpO1xuICAgIC8vIFRoZSBnZW5lIG1hcCBnb2VzIFVOREVSIHRoZSBjZWxscywgc28gaXQgaXMgc2V0dGxlZCBiZWZvcmUgdGhleSBhcmUgYWRkZWQuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVHZW5lTWFwKHZpZXdlciwgZGF0YXNldCwgdmlldywgc2VsZWN0aW9uLCBzbGFiKTtcbiAgICBpZiAoIXRhc2soKSkgcmV0dXJuO1xuICAgIHRoaXMuZHJhd01hcmtlcnModmlld2VyLCBkYXRhc2V0LCB2aWV3LCBmYWNlQ29sb3IsIHNsYWIsIHN5bWJvbHMpO1xuICB9XG5cbiAgLyoqIE5vdGhpbmcgdG8gZHJhdzogZHJvcCB0aGUgbWFya2VycyBhbmQgdGhlIGdlbmUgbWFwLiAqL1xuICBwcml2YXRlIHJlbW92ZUxheWVycyh2aWV3ZXI6IFZpZXdlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLnBvaW50cykge1xuICAgICAgdmlld2VyLmxheWVycy5yZW1vdmUodGhpcy5wb2ludHMpO1xuICAgICAgdGhpcy5wb2ludHMgPSBudWxsO1xuICAgICAgdGhpcy5sYXllcktleSA9IG51bGw7XG4gICAgICB0aGlzLmRyYXduID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuZ2VuZU1hcExheWVyKSB7XG4gICAgICB2aWV3ZXIubGF5ZXJzLnJlbW92ZSh0aGlzLmdlbmVNYXBMYXllcik7XG4gICAgICB0aGlzLmdlbmVNYXBMYXllciA9IG51bGw7XG4gICAgICB0aGlzLmdlbmVNYXBLZXkgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3IHRoZSBvYnNlcnZhdGlvbiBtYXJrZXJzIG92ZXIgdGhlIGltYWdlIChhbmQgdGhlIGdlbmUgbWFwKTogcmVzdHlsZWQgaW4gcGxhY2UgZm9yIGFcbiAgICogZGlzcGxheS1vbmx5IGNoYW5nZSwgZWxzZSBhIG5ldyBsYXllci5cbiAgICovXG4gIHByaXZhdGUgZHJhd01hcmtlcnMoXG4gICAgdmlld2VyOiBWaWV3ZXIsXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsXG4gICAgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICBmYWNlQ29sb3I6IFBvaW50Q29sb3JzLFxuICAgIHNsYWI6IFNsYWIgfCBudWxsLFxuICAgIHN5bWJvbHM6IFVpbnQ4QXJyYXkgfCBudWxsID0gbnVsbCxcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgb2JzID0gZGF0YXNldC5vYnNlcnZhdGlvbnM7XG4gICAgY29uc3QgcmVmID0gc2xhYj8ucmVmID8/IGRhdGFzZXQuaW1hZ2VSZWY7XG4gICAgY29uc3Qgc2l6ZSA9IG1hcmtlclNpemVzKG9icywgdmlldywgc2xhYik7XG5cbiAgICAvLyBuYXBhcmkncyBpbWFnZSB2aWV3IENMRUFSUyB0aGUgd2hvbGUgbGF5ZXIgbGlzdCBvbiBldmVyeSByZW5kZXIsIHNvIHRoZVxuICAgIC8vIG1hcmtlcnMgZ28gd2l0aCBpdCB3aGVuZXZlciB0aGUgaW1hZ2UgaXMgcmUtcmVuZGVyZWQg4oCUIGEgc2NydWIsIGEgY29udHJhc3RcbiAgICAvLyBjaGFuZ2UuIFRoZSBjYWNoZWQgaGFuZGxlIGlzIHRoZW4gZGV0YWNoZWQsIGFuZCBtdXRhdGluZyBpdCBkcmF3cyBub3RoaW5nOlxuICAgIC8vIHRyZWF0IGEgbGF5ZXIgdGhhdCBpcyBubyBsb25nZXIgaW4gdGhlIHNjZW5lIGFzIGFic2VudCBzbyBpdCBnZXRzIHJlLWFkZGVkLlxuICAgIGlmICh0aGlzLnBvaW50cyAmJiAhdmlld2VyLmxheWVycy5pdGVtcy5pbmNsdWRlcyh0aGlzLnBvaW50cykpIHtcbiAgICAgIHRoaXMucG9pbnRzID0gbnVsbDtcbiAgICAgIHRoaXMubGF5ZXJLZXkgPSBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHNob3dJbWFnZSA9ICghIXJlZiB8fCAhIWRhdGFzZXQudm9sdW1lKSAmJiB2aWV3LnNob3dJbWFnZSAhPT0gZmFsc2U7XG4gICAgLy8gQSBzaXplL2NvbG91ci9vcGFjaXR5L3NlbGVjdGlvbiBjaGFuZ2UgaXMgRElTUExBWS1vbmx5OiBtdXRhdGUgdGhlIGxheWVyXG4gICAgLy8gcmF0aGVyIHRoYW4gZHJvcHBpbmcgYW5kIHJlLWFkZGluZyBpdC4gQm90aCBzZXR0ZXJzIGJ1bXAgdGhlIGxheWVyJ3NcbiAgICAvLyBkYXRhVmVyc2lvbiwgd2hpY2ggaXMgd2hhdCBtYWtlcyBuYXBhcmktanMgcmVidWlsZCB0aGUgaW5zdGFuY2UgYnVmZmVyIGFuZFxuICAgIC8vIHJlZHJhdyDigJQgYW5kIGl0IGF2b2lkcyByZWJ1aWxkaW5nIDg0ayBwb3NpdGlvbnMgdG8gY2hhbmdlIG9uZSBudW1iZXIuXG4gICAgLy8gVGhlIHNsaWNlIGlzIHBhcnQgb2YgdGhlIGtleTogYSBzY3J1YiBjaGFuZ2VzIFdISUNIIG9ic2VydmF0aW9ucyBhcmUgZHJhd24sXG4gICAgLy8gd2hpY2ggaXMgZ2VvbWV0cnksIG5vdCBkaXNwbGF5LlxuICAgIGNvbnN0IGtleSA9IGAke2RhdGFzZXQuaWR9OiR7b2JzLmNvdW50fToke3NsYWI/LnNsaWNlID8/ICcnfWA7XG4gICAgaWYgKHRoaXMucG9pbnRzICYmIGtleSA9PT0gdGhpcy5sYXllcktleSkge1xuICAgICAgdGhpcy5wb2ludHMuc2l6ZSA9IHNpemU7XG4gICAgICB0aGlzLnBvaW50cy52aXNpYmxlID0gdGhpcy5wb2ludHNWaXNpYmxlKCk7XG4gICAgICB0aGlzLnBvaW50cy5mYWNlQ29sb3IgPSBnYXRoZXJDb2xvcnMoZmFjZUNvbG9yLCBzbGFiPy5pbmRpY2VzKTtcbiAgICAgIHRoaXMucG9pbnRzLnN5bWJvbHMgPSBnYXRoZXJTeW1ib2xzKHN5bWJvbHMsIHNsYWI/LmluZGljZXMpO1xuICAgICAgdGhpcy5oaWRlRm9yZWlnbkltYWdlKHZpZXdlciwgc2hvd0ltYWdlKTtcbiAgICAgIHRoaXMuY3R4LnRvb2xzLnJlZ2lvbk92ZXJsYXk/LnNldFJlZ2lvbnNWaXNpYmxlKHZpZXcuc2hvd0Fubm90YXRpb25zICE9PSBmYWxzZSk7XG4gICAgICB2aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBvaW50cykge1xuICAgICAgdmlld2VyLmxheWVycy5yZW1vdmUodGhpcy5wb2ludHMpO1xuICAgICAgdGhpcy5wb2ludHMgPSBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGRyYXduID0gc2xhYj8uaW5kaWNlcztcbiAgICBjb25zdCBwb3NpdGlvbnMgPSBvYnNlcnZhdGlvblBvc2l0aW9ucyhvYnMsIGRyYXduKTtcbiAgICB0aGlzLmxheWVyS2V5ID0ga2V5O1xuICAgIHRoaXMuZHJhd24gPSBkcmF3biA/PyBudWxsO1xuICAgIHRoaXMucG9pbnRzID0gdmlld2VyLmFkZFBvaW50cyhwb3NpdGlvbnMsIHtcbiAgICAgIG5hbWU6ICdvYnNlcnZhdGlvbnMnLFxuICAgICAgc2l6ZSxcbiAgICAgIGZhY2VDb2xvcjogZ2F0aGVyQ29sb3JzKGZhY2VDb2xvciwgZHJhd24pLFxuICAgICAgLy8gRWFjaCBvYnNlcnZhdGlvbidzIGdlbmUncyBpY29uIHdoaWxlIHRoZXkgYXJlIGNvbG91cmVkIGJ5IGdlbmU7IHRoZSBsYXllcidzIGRpc2MgZWxzZS5cbiAgICAgIHN5bWJvbHM6IGdhdGhlclN5bWJvbHMoc3ltYm9scywgZHJhd24pLFxuICAgICAgLy8gTm8gYm9yZGVyOiBhdCBWaXNpdW0gc3BvdCBkZW5zaXR5IGFuIG91dGxpbmUgcGVyIG1hcmtlciByZWFkcyBhcyBub2lzZSxcbiAgICAgIC8vIGFuZCBpdCBjb3N0cyBhIHNlY29uZCBjb2xvdXIgYXJyYXkuXG4gICAgICBib3JkZXJXaWR0aDogMCxcbiAgICAgIC8vIFRoZSBkYXRhc2V0J3MgZGF0YS0+d29ybGQgYWZmaW5lLiBTcGF0aWFsRGF0YSByZWNvcmRzIG9uZSBwZXIgY29vcmRpbmF0ZVxuICAgICAgLy8gc3lzdGVtIChWaXNpdW0gc3BvdCBjb29yZHMgYXJlIGluIHRoZSBGVUxMLXJlc29sdXRpb24gZnJhbWUgd2hpbGUgdGhlXG4gICAgICAvLyBzZXJ2ZWQgaW1hZ2UgbWF5IGJlIHRoZSBoaXJlcyBkb3duc2NhbGUpLCBzbyB3aXRob3V0IHRoaXMgdGhlIG1hcmtlcnNcbiAgICAgIC8vIGxhbmQgaW4gdGhlIHJpZ2h0IHNoYXBlIGF0IHRoZSB3cm9uZyBzY2FsZS4gRGVmYXVsdHMgdG8gaWRlbnRpdHkgd2hlblxuICAgICAgLy8gdGhlIGNvb3JkaW5hdGVzIGFyZSBhbHJlYWR5IGluIHRoZSBpbWFnZSdzIHBpeGVsIHNwYWNlLlxuICAgICAgc2NhbGU6IHJlZj8uc2NhbGUgPz8gWzEsIDFdLFxuICAgICAgdHJhbnNsYXRlOiByZWY/LnRyYW5zbGF0ZSA/PyBbMCwgMF0sXG4gICAgICB2aXNpYmxlOiB0aGlzLnBvaW50c1Zpc2libGUoKSxcbiAgICAgIC8vIE5ldmVyIHVuZGVyIGEgY291cGxlIG9mIHNjcmVlbiBwaXhlbHMsIHNvIHRoZSBvYnNlcnZhdGlvbnMgc3RheSB2aXNpYmxlIHpvb21lZCBvdXQuXG4gICAgICBtaW5TY3JlZW5TaXplOiBTUEFUSUFMX01BUktFUl9NSU5fU0NSRUVOX1BYLFxuICAgIH0pO1xuICAgIC8vIE91dGxpbmVzLCBkZW5zaXR5IGFuZCB0cmFuc2NyaXB0cyBnbyBiYWNrIG92ZXIgdGhlIG1hcmtlcnMganVzdCBhZGRlZC5cbiAgICB0aGlzLnNlc3Npb24udGlsZXM/LmFmdGVyT2JzZXJ2YXRpb25zKCk7XG4gICAgdGhpcy5mcmFtZU9uY2Uodmlld2VyLCBkYXRhc2V0LmlkLCBwb3NpdGlvbnMsICEhcmVmKTtcbiAgICB0aGlzLmhpZGVGb3JlaWduSW1hZ2Uodmlld2VyLCBzaG93SW1hZ2UpO1xuICAgIHRoaXMuY3R4LnRvb2xzLnJlZ2lvbk92ZXJsYXk/LnNldFJlZ2lvbnNWaXNpYmxlKHZpZXcuc2hvd0Fubm90YXRpb25zICE9PSBmYWxzZSk7XG4gICAgdGhpcy5zZXRSZWdpb25HcmlkRm9yKGRhdGFzZXQsIHBvc2l0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogVGVsbCB0aGUgcmVnaW9uIG92ZXJsYXkgaG93IGZpbmVseSBhIGRyYXduIHZlcnRleCBtYXkgYmUgcGxhY2VkLlxuICAgKlxuICAgKiBSZWdpb24gZ2VvbWV0cnkgaXMgc3RvcmVkIGluIHdob2xlIHdvcmxkIHVuaXRzLCB3aGljaCBpcyByaWdodCB3aGVuIHRoZSB3b3JsZCBJU1xuICAgKiBwaXhlbHMg4oCUIGEgcmVnaW9uIHNob3VsZCBhbGlnbiB0byB0aGVtLiBJdCBpcyB3cm9uZyBmb3IgYSBkYXRhc2V0IHRoYXQgcmVnaXN0ZXJzIG9udG9cbiAgICogbm8gaW1hZ2U6IHNlcUZJU0gncyBvYnNlcnZhdGlvbnMgc3BhbiBhYm91dCA1IHggNyB1bml0cyBpbiB0b3RhbCwgc28gd2hvbGUtdW5pdFxuICAgKiB2ZXJ0aWNlcyBsZWF2ZSByb3VnaGx5IHNpeCBieSBlaWdodCBwbGFjZWFibGUgcG9zaXRpb25zIGFjcm9zcyB0aGUgZW50aXJlIHNhbXBsZSBhbmRcbiAgICogYW4gUk9JIGNhbm5vdCBiZSBkcmF3biBhdCBhbnkgem9vbS4gTm90aGluZyBlcnJvcnM7IHRoZSB0b29sIGp1c3QgY2Fubm90IGV4cHJlc3MgdGhlXG4gICAqIHNoYXBlLlxuICAgKlxuICAgKiBLZXllZCBvbiB3aGV0aGVyIHRoZSBkYXRhc2V0IGJyaW5ncyBQSVhFTFMgcmF0aGVyIHRoYW4gb24gdGhlIGV4dGVudCwgYmVjYXVzZSB0aGVcbiAgICogZXh0ZW50IGNhbm5vdCB0ZWxsIHRoZSB0d28gYXBhcnQg4oCUIDIsMDAwIHVuaXRzIGlzIGEgc21hbGwgc2xpZGUgb3IgYSBsYXJnZSBzZWN0aW9uXG4gICAqIGRlcGVuZGluZyBvbmx5IG9uIHdoYXQgdGhlIHVuaXRzIGFyZSwgYW5kIG9ubHkgdGhlIGRhdGFzZXQga25vd3MuXG4gICAqL1xuICBwcml2YXRlIHNldFJlZ2lvbkdyaWRGb3IoZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHBvc2l0aW9uczogRmxvYXQzMkFycmF5KTogdm9pZCB7XG4gICAgY29uc3Qgb3ZlcmxheSA9IHRoaXMuY3R4LnRvb2xzLnJlZ2lvbk92ZXJsYXk7XG4gICAgaWYgKCFvdmVybGF5Py5zZXRXb3JsZFF1YW50dW0pIHJldHVybjtcbiAgICBpZiAoZGF0YXNldC5pbWFnZVJlZiB8fCBkYXRhc2V0LnZvbHVtZSkge1xuICAgICAgb3ZlcmxheS5zZXRXb3JsZFF1YW50dW0oUElYRUxfV09STERfUVVBTlRVTSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBtaW5YID0gSW5maW5pdHk7XG4gICAgbGV0IG1heFggPSAtSW5maW5pdHk7XG4gICAgbGV0IG1pblkgPSBJbmZpbml0eTtcbiAgICBsZXQgbWF4WSA9IC1JbmZpbml0eTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgY29uc3QgeCA9IHBvc2l0aW9uc1tpXTtcbiAgICAgIGNvbnN0IHkgPSBwb3NpdGlvbnNbaSArIDFdO1xuICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoeCkgfHwgIU51bWJlci5pc0Zpbml0ZSh5KSkgY29udGludWU7XG4gICAgICBpZiAoeCA8IG1pblgpIG1pblggPSB4O1xuICAgICAgaWYgKHggPiBtYXhYKSBtYXhYID0geDtcbiAgICAgIGlmICh5IDwgbWluWSkgbWluWSA9IHk7XG4gICAgICBpZiAoeSA+IG1heFkpIG1heFkgPSB5O1xuICAgIH1cbiAgICBvdmVybGF5LnNldFdvcmxkUXVhbnR1bSh3b3JsZFF1YW50dW1Gb3JFeHRlbnQobWF4WCAtIG1pblgsIG1heFkgLSBtaW5ZKSk7XG4gIH1cblxuICAvKipcbiAgICogSGlkZSB0aGUgaW1hZ2UgbGF5ZXIgZm9yIGEgZGF0YXNldCB0aGF0IGJyaW5ncyBubyBpbWFnZSBvZiBpdHMgb3duLlxuICAgKlxuICAgKiBUaGUgaG9zdCdzIHZpZXdlciBrZWVwcyB3aGF0ZXZlciBpbWFnZSB3YXMgbGFzdCBsb2FkZWQsIGFuZCBmb3IgYSBkYXRhc2V0IHRoYXRcbiAgICogcmVnaXN0ZXJzIG9udG8gbm9uZSB0aGF0IHBpY3R1cmUgYmVsb25ncyB0byBzb21ldGhpbmcgZWxzZSBlbnRpcmVseSDigJQgdGhlIGV4YW1wbGUnc1xuICAgKiBkZWZhdWx0IHNsaWRlLCBzYXkuIEl0IGlzIG5vdCBtZXJlbHkgaXJyZWxldmFudDogdGhlIHR3byBsaXZlIGluIGRpZmZlcmVudCBjb29yZGluYXRlXG4gICAqIHNwYWNlcyAoaW1hZ2UgcGl4ZWxzIGFnYWluc3QgdGhlIGVtYmVkZGluZydzIG93biB1bml0cyksIHNvIHRoZSBsZWZ0b3ZlciBpcyBtYWduaWZpZWRcbiAgICogcm91Z2hseSBhIGh1bmRyZWRmb2xkLiBBdCB0aGUgZml0dGVkIHpvb20gdGhlIGNhbWVyYSBzaXRzIGluc2lkZSBpdHMgY29ybmVyLCB3aGVyZSBpdFxuICAgKiByZWFkcyBhcyBibGFuayBiYWNrZ3JvdW5kLCBhbmQgaXQgYXBwZWFycyBvbmx5IG9uY2UgeW91IHpvb20gb3V0IGZhciBlbm91Z2ggdG8gZmluZFxuICAgKiBpdCDigJQgd2hpY2ggaXMgZXhhY3RseSBob3cgaXQgZ2V0cyBub3RpY2VkLlxuICAgKlxuICAgKiBIaWRkZW4gcmF0aGVyIHRoYW4gcmVtb3ZlZCwgYW5kIGhpZGRlbiBIRVJFIHJhdGhlciB0aGFuIGJ5IGNsZWFyaW5nIHRoZSBob3N0J3MgaW1hZ2VcbiAgICogc3RhdGU6IHRoYXQgc3RhdGUgZHJpdmVzIHRoZSB3aG9sZSByZW5kZXIgcGlwZWxpbmUsIGluY2x1ZGluZyBhIFBsb3RseSBiYWNrZW5kIHdob3NlXG4gICAqIGZpZWxkcyBhcmUgZGVjbGFyZWQgd2l0aCBkZWZpbml0ZS1hc3NpZ25tZW50IGFzc2VydGlvbnMsIHNvIGVtcHR5aW5nIGl0IHRocm93cyBmcm9tXG4gICAqIHdoaWNoZXZlciBmaWVsZCB0aGUgbmV4dCBwYXRoIGhhcHBlbnMgdG8gcmVhZC4gVGhpcyB0b3VjaGVzIG9uZSBsYXllcidzIHZpc2liaWxpdHlcbiAgICogYW5kIG5vdGhpbmcgZWxzZS5cbiAgICovXG4gIGhpZGVGb3JlaWduSW1hZ2Uodmlld2VyOiBQaWNrPFZpZXdlciwgJ2xheWVycycgfCAncmVxdWVzdFJlbmRlcic+LCBkYXRhc2V0SGFzUGl4ZWxzOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gTm8gaW1hZ2Ugb2YgaXRzIG93biDihpIgbm90aGluZyBmb3IgYW4gb3ZlcnZpZXcgdG8gc2hvdyBlaXRoZXIuXG4gICAgdGhpcy5pbWFnZS5zaG93TmF2aWdhdG9yRm9yKGRhdGFzZXRIYXNQaXhlbHMpO1xuICAgIGNvbnN0IHRpbGVzID0gdGhpcy5zZXNzaW9uLnRpbGVzO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2Ygdmlld2VyLmxheWVycy5pdGVtcykge1xuICAgICAgaWYgKGxheWVyLmtpbmQgIT09ICdpbWFnZScpIGNvbnRpbnVlO1xuICAgICAgLy8gVGhlIHRyYW5zY3JpcHQtZGVuc2l0eSByYXN0ZXIgYW5kIHRoZSBnZW5lIG1hcCBhcmUgaW1hZ2UgbGF5ZXJzIHRvbywgYnV0IHRoZXkgYXJlXG4gICAgICAvLyBkYXRhLCBub3QgdGhlIHRpc3N1ZTogdGhlIEltYWdlcyB0b2dnbGUgbXVzdCBub3QgdGFrZSB0aGVtIGRvd24gd2l0aCB0aGUgc2xpZGUuXG4gICAgICBpZiAodGlsZXM/Lm93bnMobGF5ZXIpIHx8IGxheWVyID09PSB0aGlzLmdlbmVNYXBMYXllcikgY29udGludWU7XG4gICAgICAvLyBSZS1zaG93biB3aGVuIGEgZGF0YXNldCB0aGF0IG93bnMgYW4gaW1hZ2UgY29tZXMgYmFjaywgc28gc3dpdGNoaW5nIGJldHdlZW5cbiAgICAgIC8vIGRhdGFzZXRzIGRvZXMgbm90IGxlYXZlIHRoZSB0aXNzdWUgcGVybWFuZW50bHkgaGlkZGVuLlxuICAgICAgbGF5ZXIudmlzaWJsZSA9IGRhdGFzZXRIYXNQaXhlbHM7XG4gICAgfVxuICAgIC8vIFNob3dpbmcgdGhlIHRpc3N1ZSBtdXN0IG5vdCBzaG93IGl0cyBjaGFubmVscyB0aGUgdXNlciBvciB0aGUgZGVmYXVsdHMgc3dpdGNoZWQgb2ZmIChhXG4gICAgLy8gMjItY2hhbm5lbCBwbGF0ZSBzdGFydHMgd2l0aCBmb3VyKTogdGhlIGNoYW5uZWwgc3RhdGVzIGRlY2lkZSB3aGljaCBvZiBpdHMgbGF5ZXJzIGRyYXcuXG4gICAgaWYgKGRhdGFzZXRIYXNQaXhlbHMpIHRoaXMuaW1hZ2UucmVhcHBseURpc3BsYXlTdGF0ZSgpO1xuICAgIHZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogRnJhbWUgdGhlIGNhbWVyYSBvbiB0aGUgb2JzZXJ2YXRpb25zLCBmb3IgYSBkYXRhc2V0IHRoYXQgYnJpbmdzIG5vIGltYWdlLlxuICAgKlxuICAgKiBUaGUgMkQgY2FtZXJhIGlzIG5vcm1hbGx5IGZpdHRlZCB0byB0aGUgSU1BR0UsIGJlY2F1c2UgdGhlIG9ic2VydmF0aW9ucyBhcmUgaW4gdGhhdFxuICAgKiBpbWFnZSdzIHBpeGVsIHNwYWNlIGFuZCBmcmFtaW5nIHRoZSBpbWFnZSBmcmFtZXMgdGhlbSB0b28uIEEgZGF0YXNldCB3aXRoIG5vXG4gICAqIHJlZmVyZW5jZSBpbWFnZSBoYXMgY29vcmRpbmF0ZXMgaW4gaXRzIG93biB1bml0cyBpbnN0ZWFkIOKAlCBzZXFGSVNIJ3Mgc3BhbiBhYm91dFxuICAgKiA1eDcg4oCUIHNvIHRoZSBpbWFnZSBmcmFtaW5nIGxlZnQgb3ZlciBmcm9tIHdoYXRldmVyIHdhcyBvbiBzY3JlZW4gYmVmb3JlIHB1dHMgdGhlXG4gICAqIHdob2xlIGNsb3VkIG9mZnNjcmVlbjogbWVhc3VyZWQgYXQgOS43IHggMTMuNCBQSVhFTFMsIGNlbnRyZWQgMjU2cHggZnJvbSB3aGVyZSB0aGVcbiAgICogY2FtZXJhIHdhcyBsb29raW5nLiBUaGUgcG9pbnRzIGFyZSBhbGwgdGhlcmUgYW5kIGRyYXduOyB0aGV5IGFyZSBhIHNwZWNrLiBXaGljaFxuICAgKiBsb29rcyBleGFjdGx5IGxpa2UgdGhlIGRhdGFzZXQgaGF2aW5nIGZhaWxlZCB0byBsb2FkLlxuICAgKlxuICAgKiBPbmNlIHBlciBkYXRhc2V0LCBhcyBuYXBhcmktanMncyBgZml0M2Q6ICdvbmNlJ2AgZG9lcyBmb3IgdGhlIGNsb3VkOiByZS1jb2xvdXJpbmcsXG4gICAqIHNsaWNpbmcgb3IgcGlja2luZyBhIGdlbmUgcmUtYWRkcyB0aGlzIGxheWVyLCBhbmQgcmUtZnJhbWluZyBvbiB0aG9zZSB3b3VsZCBtb3ZlXG4gICAqIHRoZSBjYW1lcmEgdW5kZXIgdGhlIHVzZXIg4oCUIHRoZSBjYW1lcmEgdG9vbHMgYW5kIHRoZSBjYW52YXMgZHJhZyBhcmUgbWVhbnQgdG8gYmVcbiAgICogdGhlIG9ubHkgdGhpbmdzIHRoYXQgZG8uXG4gICAqL1xuICBwcml2YXRlIGZyYW1lT25jZSh2aWV3ZXI6IFZpZXdlciwgZGF0YXNldElkOiBzdHJpbmcsIHBvc2l0aW9uczogRmxvYXQzMkFycmF5LCByZWdpc3RlcmVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gR2F0ZWQgb24gd2hldGhlciBUSElTIGRhdGFzZXQgcmVnaXN0ZXJzIG9udG8gYW4gaW1hZ2UsIG5vdCBvbiB0aGUgaW1hZ2Ugc2l6ZTogdGhhdCBrZWVwc1xuICAgIC8vIHRoZSBsYXN0IHBsb3R0ZWQgaW1hZ2UncyBkaW1lbnNpb25zIGFmdGVyIHRoZSBob3N0IGNsZWFycyBpdCwgc28gYSBzdGFsZSA1MTJ4MzgzIHJlYWQgYXNcbiAgICAvLyBcInRoZXJlIGlzIGFuIGltYWdlXCIgYW5kIHNraXBwZWQgdGhlIGZyYW1pbmcgZW50aXJlbHkuXG4gICAgaWYgKHJlZ2lzdGVyZWQpIHJldHVybjtcbiAgICAvLyBPbmNlIHBlciBkYXRhc2V0IChzZWUgYWJvdmUpLlxuICAgIGlmICh0aGlzLmZyYW1lZCA9PT0gZGF0YXNldElkKSByZXR1cm47XG5cbiAgICBjb25zdCB7IGNhbnZhcyB9ID0gdGhpcy5jdHg7XG4gICAgY29uc3QgZml0ID0gZnJhbWVQb3NpdGlvbnMocG9zaXRpb25zLCBjYW52YXMuY2xpZW50V2lkdGggPz8gMCwgY2FudmFzLmNsaWVudEhlaWdodCA/PyAwKTtcbiAgICAvLyBOdWxsIG1lYW5zIHRoZXJlIGlzIG5vdGhpbmcgdG8gZnJhbWUgb247IGxlYXZlIHRoZSBjYW1lcmEgd2hlcmUgaXQgaXMgcmF0aGVyXG4gICAgLy8gdGhhbiBtb3ZpbmcgdGhlIHZpZXcgZm9yIGEgZGF0YXNldCB3ZSBjYW5ub3QgZml0LlxuICAgIGlmICghZml0KSByZXR1cm47XG4gICAgdmlld2VyLmNhbWVyYS5zZXQoZml0LmNlbnRlciwgZml0Lnpvb20gPz8gdmlld2VyLmNhbWVyYS56b29tKTtcbiAgICB0aGlzLmZyYW1lZCA9IGRhdGFzZXRJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgKipnZW5lIG1hcCoqOiB0aGUgYWN0aXZlIGdlbmUncyBleHByZXNzaW9uIGFzIGEgY29udGludW91cyBmaWVsZCBkcmF3biB1bmRlclxuICAgKiB0aGUgY2VsbHMuXG4gICAqXG4gICAqIEEgc2NhdHRlciBjb2xvdXJlZCBieSBhIGdlbmUgc2F5cyB3aGljaCBjZWxscyBleHByZXNzIGl0OyBpdCBjYW5ub3Qgc2F5IHdoZXJlLFxuICAgKiBiZWNhdXNlIHRoZSBleWUgd2lsbCBub3QgaW50ZWdyYXRlIHRob3VzYW5kcyBvZiBkb3RzIGludG8gYSB0ZXJyaXRvcnkuIFRoZSBmaWVsZFxuICAgKiBpcyBhIGtlcm5lbC13ZWlnaHRlZCBNRUFOIHBlciBjZWxsIChzZWUgYHNwYXRpYWwtZXhwcmVzc2lvbi50c2ApLCBzbyBhIGRlbnNlXG4gICAqIHJlZ2lvbiBkb2VzIG5vdCBnbG93IG1lcmVseSBmb3IgYmVpbmcgZGVuc2UsIGFuZCBpdCBpcyB0cmFuc3BhcmVudCB3aGVyZXZlciBub1xuICAgKiBjZWxsIHdhcyBtZWFzdXJlZCDigJQgYW4gdW5zYW1wbGVkIGdhcCBtdXN0IG5vdCByZWFkIGFzIFwibm90IGV4cHJlc3NlZFwiLlxuICAgKlxuICAgKiBJdCBzaGFyZXMgdGhlIHBvaW50cycgTFVULCBwZXJjZW50aWxlIHdpbmRvdyBhbmQgbG9nIGZsYWcsIHNvIHRoZSBsYXllciB1bmRlclxuICAgKiB0aGUgY2VsbHMgYW5kIHRoZSBjZWxscyB0aGVtc2VsdmVzIGNhbm5vdCBkaXNhZ3JlZSBhYm91dCB3aGF0IGEgY29sb3VyIG1lYW5zLlxuICAgKlxuICAgKiBFc3RpbWF0ZWQgb24gdGhlIERJU1BMQVlFRCBpbWFnZSdzIHBpeGVsIGdyaWQsIGNvYXJzZW5lZCBzbyB0aGUgbG9uZyBzaWRlIGlzIGF0XG4gICAqIG1vc3QgYEdFTkVfTUFQX01BWF9TSURFYDogYSBzbW9vdGggZmllbGQgZ2FpbnMgbm90aGluZyBmcm9tIGEgc2xpZGUncyBmdWxsXG4gICAqIHJlc29sdXRpb24uIEZvciBhIHZvbHVtZS1iYWNrZWQgZGF0YXNldCB0aGF0IGdyaWQgaXMgdGhlIGN1cnJlbnQgc2xpY2UsIGFuZCBvbmx5XG4gICAqIHRoYXQgcGxhbmUncyBvYnNlcnZhdGlvbnMgYXJlIGluY2x1ZGVkIOKAlCB0aGUgc2FtZSBydWxlIHRoZSBtYXJrZXJzIGZvbGxvdy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlR2VuZU1hcChcbiAgICB2aWV3ZXI6IFZpZXdlcixcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCxcbiAgICB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gICAgc2xhYjogU2xhYiB8IG51bGwsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGdlbmUgPSB2aWV3LmdlbmVNYXAgJiYgdmlldy5jb2xvckJ5Py5raW5kID09PSAnZmVhdHVyZScgPyB2aWV3LmNvbG9yQnkubmFtZSA6IG51bGw7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc2Vzc2lvbi5wb3J0O1xuICAgIGNvbnN0IGNhY2hlID0gdGhpcy5zZXNzaW9uLmdlbmVNYXA7XG4gICAgY29uc3Qgc21vb3RoaW5nID0gdmlldy5nZW5lTWFwU21vb3RoaW5nID4gMCA/IHZpZXcuZ2VuZU1hcFNtb290aGluZyA6IDE7XG4gICAgY29uc3QgY2xpcCA9IHZpZXcucGVyY2VudGlsZUNsaXAgPz8gWzAuMDEsIDAuOTldO1xuXG4gICAgLy8gVHdvIGNsb2NrczogdGhlIEZJRUxEIGRlcGVuZHMgb24gdGhlIGdlbmUsIHRoZSBwbGFuZSBhbmQgdGhlIGJhbmR3aWR0aCwgd2hpbGVcbiAgICAvLyB0aGUgY29sb3VycyBkZXBlbmQgb24gdGhlIHdpbmRvdywgdGhlIGxvZyBmbGFnIGFuZCB0aGUgb3BhY2l0eS4gUmVjb2xvdXJpbmcgYVxuICAgIC8vIGNhY2hlZCBmaWVsZCBpcyBhIGZyYWN0aW9uIG9mIGVzdGltYXRpbmcgb25lLlxuICAgIGNvbnN0IGZpZWxkS2V5ID0gZ2VuZVxuICAgICAgPyBbZGF0YXNldC5pZCwgZ2VuZSwgc2xhYj8uc2xpY2UgPz8gJycsIHNtb290aGluZywgdGhpcy5zZXNzaW9uLnNlbGVjdGlvblJldihzZWxlY3Rpb24pXS5qb2luKCd8JylcbiAgICAgIDogbnVsbDtcbiAgICBjb25zdCBrZXkgPSBmaWVsZEtleVxuICAgICAgPyBbXG4gICAgICAgICAgZmllbGRLZXksXG4gICAgICAgICAgY2xpcC5qb2luKCcsJyksXG4gICAgICAgICAgdmlldy5sb2dTY2FsZSA/ICdsb2cnIDogJ2xpbicsXG4gICAgICAgICAgdmlldy5nZW5lTWFwT3BhY2l0eSxcbiAgICAgICAgICB0aGlzLmN0eC5kaXNwbGF5LmNvbnRpbnVvdXNDb2xvcm1hcEtleSh2aWV3KSxcbiAgICAgICAgXS5qb2luKCd8JylcbiAgICAgIDogbnVsbDtcbiAgICAvLyBBIHN0aXRjaGVkIHNsaWNlIHJlLXJlbmRlciBjbGVhcnMgdGhlIHdob2xlIGxheWVyIGxpc3QsIHRoZSBtYXAgd2l0aCBpdCwgYW5kIHRoZSBrZXkgb2YgYVxuICAgIC8vIHJlZ2lzdGVyZWQgaW1hZ2UncyBtYXAgZG9lcyBub3QgbmFtZSB0aGUgc2xpY2U6IGEgbWFwIG5vIGxvbmdlciBpbiB0aGUgc2NlbmUgaXMgYWJzZW50LFxuICAgIC8vIGFzIHRoZSBtYXJrZXJzJyBpcyAoc2VlIGByZWJ1aWxkYCksIHNvIGl0IGlzIGRyYXduIGFnYWluIGZyb20gdGhlIGNhY2hlZCBmaWVsZC5cbiAgICBpZiAodGhpcy5nZW5lTWFwTGF5ZXIgJiYgIXZpZXdlci5sYXllcnMuaXRlbXMuaW5jbHVkZXModGhpcy5nZW5lTWFwTGF5ZXIpKSB7XG4gICAgICB0aGlzLmdlbmVNYXBMYXllciA9IG51bGw7XG4gICAgICB0aGlzLmdlbmVNYXBLZXkgPSBudWxsO1xuICAgIH1cbiAgICBpZiAoa2V5ID09PSB0aGlzLmdlbmVNYXBLZXkpIHJldHVybjtcblxuICAgIGlmICh0aGlzLmdlbmVNYXBMYXllcikge1xuICAgICAgdmlld2VyLmxheWVycy5yZW1vdmUodGhpcy5nZW5lTWFwTGF5ZXIpO1xuICAgICAgdGhpcy5nZW5lTWFwTGF5ZXIgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmdlbmVNYXBLZXkgPSBrZXk7XG4gICAgaWYgKCFrZXkgfHwgIWdlbmUgfHwgIXBvcnQpIHtcbiAgICAgIGNhY2hlLmZpZWxkID0gbnVsbDtcbiAgICAgIGNhY2hlLmtleSA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGhlIHJhc3RlciBjb3ZlcnMgdGhlIGRpc3BsYXllZCBpbWFnZTsgd2l0aG91dCBvbmUgdGhlcmUgaXMgbm90aGluZyB0b1xuICAgIC8vIG92ZXJsYXkgYW5kIHRoZSBjbG91ZCBpcyB0aGUgM0QgbW9kZSdzIGJ1c2luZXNzLCBub3QgdGhpcyBvbmUncy4gR2F0ZWQgb24gdGhlXG4gICAgLy8gREFUQVNFVCBicmluZ2luZyBwaXhlbHMsIG5vdCBvbiB0aGUgaW1hZ2Ugc2l6ZTogdGhhdCBrZWVwcyB0aGUgbGFzdCBwbG90dGVkIGltYWdlJ3NcbiAgICAvLyBzaXplIGFmdGVyIHRoZSBob3N0IGNsZWFycyBpdCwgd2hpY2ggd291bGQgc2l6ZSB0aGUgbWFwIG92ZXIgdGhlIHdyb25nIGV4dGVudC5cbiAgICBpZiAoIXNsYWIgJiYgIWRhdGFzZXQuaW1hZ2VSZWYpIHJldHVybjtcbiAgICBjb25zdCBzaXplID0gdGhpcy5jdHguaW1hZ2VTaXplKCk7XG4gICAgY29uc3QgaW1hZ2VXID0gc2xhYiA/IGRhdGFzZXQudm9sdW1lIS53aWR0aCA6IHNpemUud2lkdGg7XG4gICAgY29uc3QgaW1hZ2VIID0gc2xhYiA/IGRhdGFzZXQudm9sdW1lIS5oZWlnaHQgOiBzaXplLmhlaWdodDtcbiAgICBpZiAoIWltYWdlVyB8fCAhaW1hZ2VIKSByZXR1cm47XG4gICAgY29uc3Qgc3RlcCA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChNYXRoLm1heChpbWFnZVcsIGltYWdlSCkgLyBHRU5FX01BUF9NQVhfU0lERSkpO1xuXG4gICAgaWYgKGZpZWxkS2V5ICE9PSBjYWNoZS5rZXkpIHtcbiAgICAgIGNvbnN0IGxvYWQgPSB0aGlzLmdlbmVNYXBMb2Fkcy5uZXh0KCk7XG4gICAgICBsZXQgdmFsdWVzOiBGbG9hdDMyQXJyYXk7XG4gICAgICB0cnkge1xuICAgICAgICB2YWx1ZXMgPSBhd2FpdCBwb3J0LmdldEZlYXR1cmVWZWN0b3IoZ2VuZSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBbbmFwYXJpLWpzXSBnZW5lIG1hcDogXCIke2dlbmV9XCIgdW5hdmFpbGFibGVgLCBlcnIpO1xuICAgICAgICB0aGlzLmdlbmVNYXBLZXkgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIWxvYWQoKSB8fCB0aGlzLmdlbmVNYXBLZXkgIT09IGtleSkgcmV0dXJuO1xuICAgICAgY29uc3QgaW5TZWxlY3Rpb24gPSBzZWxlY3Rpb24uY291bnQgPiAwID8gbWFza1RvSW5kaWNlcyhzZWxlY3Rpb24ubWFzaykgOiB1bmRlZmluZWQ7XG4gICAgICBsZXQgZXN0aW1hdGVkOiBFeHByZXNzaW9uRmllbGQgfCBudWxsO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZXN0aW1hdGVkID0gYXdhaXQgY29tcHV0ZUV4cHJlc3Npb25GaWVsZEFzeW5jKFxuICAgICAgICAgIGRhdGFzZXQub2JzZXJ2YXRpb25zLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlZjogc2xhYj8ucmVmID8/IGRhdGFzZXQuaW1hZ2VSZWYsXG4gICAgICAgICAgICB3aWR0aDogTWF0aC5jZWlsKGltYWdlVyAvIHN0ZXApLFxuICAgICAgICAgICAgaGVpZ2h0OiBNYXRoLmNlaWwoaW1hZ2VIIC8gc3RlcCksXG4gICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgc2lnbWE6IEdFTkVfTUFQX1NJR01BICogc21vb3RoaW5nLFxuICAgICAgICAgICAgdmFsdWVzLFxuICAgICAgICAgICAgLy8gQSBwbGFuZSB3aW5zIG92ZXIgYSBzZWxlY3Rpb246IHRoZSAyRCB2aWV3IGlzIHNob3dpbmcgb25lIHNlY3Rpb24sIHNvIGFcbiAgICAgICAgICAgIC8vIGZpZWxkIHNwYW5uaW5nIHRoZSBzcGVjaW1lbidzIGRlcHRoIHdvdWxkIG5vdCBiZSB0aGUgdGhpbmcgb24gc2NyZWVuLlxuICAgICAgICAgICAgaW5kaWNlczogc2xhYj8uaW5kaWNlcyA/PyBpblNlbGVjdGlvbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgc2lnbmFsOiBsb2FkLnNpZ25hbCB9LFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChpc0Fib3J0RXJyb3IoZXJyKSkgcmV0dXJuOyAvLyBzdXBlcnNlZGVkIGJ5IGEgbmV3ZXIgbWFwLCBvciB0aGUgc2NlbmUgd2VudCBhd2F5XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIGlmICghbG9hZCgpIHx8IHRoaXMuZ2VuZU1hcEtleSAhPT0ga2V5KSByZXR1cm47XG4gICAgICBjYWNoZS5maWVsZCA9IGVzdGltYXRlZDtcbiAgICAgIGNhY2hlLmtleSA9IGZpZWxkS2V5O1xuICAgIH1cbiAgICBjb25zdCBmaWVsZCA9IGNhY2hlLmZpZWxkO1xuICAgIGlmICghZmllbGQpIHJldHVybjtcblxuICAgIGNvbnN0IGx1dCA9IHRoaXMuY3R4LmRpc3BsYXkuc3BhdGlhbEx1dCh2aWV3KTtcbiAgICAvLyBPdmVyIHRoZSBtZWFzdXJlZCBwaXhlbHMgb25seTogdW5tZWFzdXJlZCBvbmVzIGFyZSAwIGFuZCB3b3VsZCBkcmFnIHRoZSBsb3cgZW5kIGRvd24uXG4gICAgY29uc3QgW2xvLCBoaV0gPSBmaWVsZENvbnRyYXN0V2luZG93KGZpZWxkLCBjbGlwWzBdLCBjbGlwWzFdKTtcbiAgICBjb25zdCByZ2JhID0gY29sb3JFeHByZXNzaW9uRmllbGQoZmllbGQsIGx1dCwgW2xvLCBoaV0sIHtcbiAgICAgIGxvZzogdmlldy5sb2dTY2FsZSxcbiAgICAgIC8vIFRoZSBNQVAncyBvd24gb3BhY2l0eTogcmVhZGluZyBhIGZpZWxkIHVuZGVyIHRoZSBjZWxscyBtZWFucyB0dXJuaW5nIHRoZVxuICAgICAgLy8gY2VsbHMgZG93biwgd2hpY2ggbXVzdCBub3QgdGFrZSB0aGUgZmllbGQgd2l0aCB0aGVtLlxuICAgICAgb3BhY2l0eTogdmlldy5nZW5lTWFwT3BhY2l0eSxcbiAgICB9KTtcbiAgICB0aGlzLmdlbmVNYXBMYXllciA9IHZpZXdlci5hZGRJbWFnZShcbiAgICAgIHsga2luZDogJ3R5cGVkJywgd2lkdGg6IGZpZWxkLndpZHRoLCBoZWlnaHQ6IGZpZWxkLmhlaWdodCwgY2hhbm5lbHM6IDQsIGR0eXBlOiAndWludDgnLCBkYXRhOiByZ2JhIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6IGBnZW5lIG1hcCDCtyAke2dlbmV9YCxcbiAgICAgICAgc2NhbGU6IFtzdGVwLCBzdGVwXSxcbiAgICAgICAgdHJhbnNsYXRlOiBbMCwgMF0sXG4gICAgICAgIGJsZW5kaW5nOiAndHJhbnNsdWNlbnQnLFxuICAgICAgfSxcbiAgICApO1xuICAgIC8vIGBhZGRJbWFnZWAgYXBwZW5kcywgc28gdGhlIG1hcCBqdXN0IGxhbmRlZCBvdmVyIHRoZSBjZWxscyAoZHJhd24gYnkgdGhpcyByZWJ1aWxkJ3NcbiAgICAvLyBwcmV2aW91cyBwYXNzLCBvciBieSBhIG5ld2VyIHJlYnVpbGQgd2hpbGUgdGhlIGZpZWxkIHdhcyBjb21wdXRpbmcpOiBtb3ZlIGl0IHRvIGp1c3QgdW5kZXJcbiAgICAvLyB0aGVtLiBBIG1vdmUga2VlcHMgdGhlIG1hcmtlcnMnIEdQVSBidWZmZXJzLCB3aGVyZSBkcm9wcGluZyBhbmQgcmUtYWRkaW5nIHRoZSBtYXJrZXJzXG4gICAgLy8gcmUtdXBsb2FkZWQgZXZlcnkgb25lIG9mIHRoZW0gKE5BUEFSSS1CT1VOREFSWS0xMSkuIFdpdGhvdXQgbWFya2VycyBvbiBzY3JlZW4gdGhlcmUgaXNcbiAgICAvLyBub3RoaW5nIHRvIGdvIHVuZGVyOyB0aGUgcmVidWlsZCBhZGRzIHRoZW0gb3ZlciB0aGUgbWFwLlxuICAgIGNvbnN0IHVuZGVyID0gdGhpcy5wb2ludHMgPyB2aWV3ZXIubGF5ZXJzLml0ZW1zLmluZGV4T2YodGhpcy5wb2ludHMpIDogLTE7XG4gICAgaWYgKHVuZGVyID49IDApIHZpZXdlci5sYXllcnMubW92ZSh0aGlzLmdlbmVNYXBMYXllciwgdW5kZXIpO1xuICAgIHZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogUGVyLW9ic2VydmF0aW9uIGNvbG91cnMgZm9yIHRoZSBjdXJyZW50IHZpZXcgc3RhdGUsIG9yIGEgc2luZ2xlIGZsYXQgY29sb3VyIHdoZW4gbm90aGluZyBpc1xuICAgKiBzZWxlY3RlZCB0byBjb2xvdXIgYnkuIENhdGVnb3JpY2FsIGNvbHVtbnMgdXNlIHRoZSBjb2x1bW4ncyBvd24gcGFsZXR0ZTsgY29udGludW91cyBjb2x1bW5zXG4gICAqIGFuZCBnZW5lIHZlY3RvcnMgZ28gdGhyb3VnaCB0aGUgYWN0aXZlIGNvbG9ybWFwIHdpdGggYSBwZXJjZW50aWxlLWNsaXBwZWQgd2luZG93LlxuICAgKi9cbiAgLyoqIFRoZSBvYnNlcnZhdGlvbnMgdGhlIHZpZXcncyBnZW5lIGZpbHRlciBrZWVwcyAoMSA9IGRyYXduKSwgb3IgbnVsbCB3aGVuIGl0IGhhcyBub25lLlxuICAgKiAgUmVqZWN0cyB3aGVuIGFuIGV4cHJlc3Npb24gcmVhZCBmYWlscy4gKi9cbiAgcHJpdmF0ZSBmaWx0ZXJNYXNrKGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlKTogUHJvbWlzZTxVaW50OEFycmF5IHwgbnVsbD4ge1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnNlc3Npb24ucG9ydDtcbiAgICBpZiAoIXBvcnQpIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gICAgcmV0dXJuIG9ic2VydmF0aW9uR2VuZU1hc2sodmlldywgZGF0YXNldC5vYnNlcnZhdGlvbnMuY291bnQsIChnKSA9PiBwb3J0LmdldEZlYXR1cmVWZWN0b3IoZykpO1xuICB9XG5cbiAgLyoqIFRoZSBtYXJrZXJzJyBjb2xvdXJzIChhbmQgaWNvbnMsIGJ5IGdlbmUpIGJlZm9yZSB0aGUgZ2VuZSBmaWx0ZXIgaGlkZXMgYW55IG9mIHRoZW0uICovXG4gIHByaXZhdGUgYXN5bmMgbWFya2VyU3R5bGUoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsXG4gICAgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrLFxuICApOiBQcm9taXNlPHsgY29sb3JzOiBQb2ludENvbG9yczsgc3ltYm9sczogVWludDhBcnJheSB8IG51bGwgfT4ge1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnNlc3Npb24ucG9ydDtcbiAgICBjb25zdCBjb3VudCA9IGRhdGFzZXQub2JzZXJ2YXRpb25zLmNvdW50O1xuICAgIC8vIENvbG91cmVkIGJ5IGdlbmU6IGVhY2ggb2JzZXJ2YXRpb24gaW4gaXRzIGdlbmUncyBjb2xvdXIsIGRyYXduIGFzIGl0cyBnZW5lJ3MgaWNvbi4gVGhhdCBpc1xuICAgIC8vIGEgY29sb3VyLCBzbyBhIGZhaWxlZCByZWFkIGZhbGxzIGJhY2sgdG8gdGhlIHZpZXcncyBjb2xvdXIgc291cmNlLCBhcyBhbnkgY29sb3VyIGRvZXMuXG4gICAgY29uc3QgYnlHZW5lID0gcG9ydFxuICAgICAgPyBhd2FpdCBvYnNlcnZhdGlvbkdlbmVTdHlsZSh2aWV3LCBjb3VudCwgKGcpID0+IHBvcnQuZ2V0RmVhdHVyZVZlY3RvcihnKSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gY29sb3VyaW5nIGJ5IGdlbmUgZmFpbGVkIOKAlCBmYWxsaW5nIGJhY2sgdG8gdGhlIGNvbG91ciBzb3VyY2UnLCBlcnIpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9KVxuICAgICAgOiBudWxsO1xuICAgIGNvbnN0IGNvbG9ycyA9IGJ5R2VuZVxuICAgICAgPyBlbmNvZGVDYXRlZ29yaWNhbChieUdlbmUuY29kZXMsIHtcbiAgICAgICAgICBjb2xvcnM6IGJ5R2VuZS5jb2xvcnMsXG4gICAgICAgICAgb3BhY2l0eTogdmlldy5vcGFjaXR5LFxuICAgICAgICAgIG11dGVkOiBtdXRlZEZyb21TZWxlY3Rpb24oc2VsZWN0aW9uKSxcbiAgICAgICAgfSlcbiAgICAgIDogYXdhaXQgdGhpcy5zb3VyY2VDb2xvcnMoZGF0YXNldCwgdmlldywgc2VsZWN0aW9uKTtcbiAgICBjb25zdCBzeW1ib2xzID0gYnlHZW5lID8gZ2x5cGhTeW1ib2xzKGJ5R2VuZS5jb2RlcywgYnlHZW5lLmdseXBocykgOiBudWxsO1xuICAgIHJldHVybiB7IGNvbG9ycywgc3ltYm9scyB9O1xuICB9XG5cbiAgLyoqIHtAbGluayBmYWNlQ29sb3JzfSBiZWZvcmUgdGhlIGdlbmUgZmlsdGVyOiB3aGF0IHRoZSBjb2xvdXIgc291cmNlIGFuZCB0aGUgc2VsZWN0aW9uIG1ha2Ugb2YgdGhlbS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBzb3VyY2VDb2xvcnMoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsXG4gICAgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrLFxuICApOiBQcm9taXNlPFBvaW50Q29sb3JzPiB7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc2Vzc2lvbi5wb3J0O1xuICAgIGNvbnN0IGNvbG9yQnkgPSB2aWV3LmNvbG9yQnk7XG4gICAgLy8gRXZlcnl0aGluZyBOT1Qgc2VsZWN0ZWQgaXMgbXV0ZWQ7IHdpdGggbm90aGluZyBzZWxlY3RlZCwgbm90aGluZyBpcyBtdXRlZFxuICAgIC8vIGFuZCB0aGUgd2hvbGUgdGlzc3VlIHJlYWRzIG5vcm1hbGx5ICh0aGUgQ29zTXggaGlnaGxpZ2h0LXZzLW11dGUgcnVsZSkuXG4gICAgY29uc3QgbXV0ZWQgPSBtdXRlZEZyb21TZWxlY3Rpb24oc2VsZWN0aW9uKTtcblxuICAgIGlmICghcG9ydCB8fCAhY29sb3JCeSkge1xuICAgICAgLy8gR2VudWluZWx5IHVuaWZvcm06IG9uZSBicm9hZGNhc3QgdHVwbGUsIHNvIGEgZmxhdCA4NGstb2JzZXJ2YXRpb24gdmlld1xuICAgICAgLy8gZG9lcyBub3QgYWxsb2NhdGUgYSBjb2xvdXIgcGVyIHBvaW50LlxuICAgICAgaWYgKCFtdXRlZCAmJiB2aWV3Lm9wYWNpdHkgPj0gMSkgcmV0dXJuIFNQQVRJQUxfTkVVVFJBTF9DT0xPUjtcbiAgICAgIC8vIE5vdCB1bmlmb3JtIOKAlCB0aGUgb3BhY2l0eSBjb250cm9sIG9yIGEgc2VsZWN0aW9uIHZhcmllcyB0aGUgYWxwaGEsIHNvIGl0XG4gICAgICAvLyBoYXMgdG8gYmUgcGVyLXBvaW50LiBSZXR1cm5pbmcgdGhlIGNvbnN0YW50IHR1cGxlIGhlcmUgaXMgd2hhdCBtYWRlIHRoZVxuICAgICAgLy8gT3BhY2l0eSBzbGlkZXIgZG8gbm90aGluZyBpbiB0aGUgZGVmYXVsdCBzdGF0ZSwgd2hpY2ggaXMgdGhlIHN0YXRlIGFueW9uZVxuICAgICAgLy8gbGFuZHMgaW4gYmVmb3JlIHBpY2tpbmcgYSBjb2xvdXIgc291cmNlLlxuICAgICAgcmV0dXJuIGVuY29kZUNhdGVnb3JpY2FsKG5ldyBVaW50MTZBcnJheShkYXRhc2V0Lm9ic2VydmF0aW9ucy5jb3VudCksIHtcbiAgICAgICAgY29sb3JzOiBbU1BBVElBTF9ORVVUUkFMX0hFWF0sXG4gICAgICAgIG9wYWNpdHk6IHZpZXcub3BhY2l0eSxcbiAgICAgICAgbXV0ZWQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoY29sb3JCeS5raW5kID09PSAnY29sdW1uJykge1xuICAgICAgY29uc3QgY29sdW1uOiBTcGF0aWFsQ29sdW1uID0gYXdhaXQgcG9ydC5nZXRDb2x1bW4oY29sb3JCeS5uYW1lKTtcbiAgICAgIGlmIChpc0NhdGVnb3JpY2FsQ29sdW1uKGNvbHVtbikpIHtcbiAgICAgICAgY29uc3QgcmdiYSA9IGVuY29kZUNhdGVnb3JpY2FsKGNvbHVtbi5jb2Rlcywge1xuICAgICAgICAgIGNvbG9yczogY2F0ZWdvcnlDb2xvcnNGb3IoY29sb3JCeS5uYW1lLCBjb2x1bW4ubWV0YSwgdmlldy5ncm91cENvbG9ycyksXG4gICAgICAgICAgb3BhY2l0eTogdmlldy5vcGFjaXR5LFxuICAgICAgICAgIG11dGVkLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gR3JvdXBzIHN3aXRjaGVkIG9mZiBpbiB0aGUgQ2VsbHMgcGFuZWwgaGlkZSB0aGVpciBkb3RzIHRvbywgd2hlbiB0aGUgZG90cyBhcmVcbiAgICAgICAgLy8gY29sb3VyZWQgYnkgdGhhdCBzYW1lIGdyb3VwaW5nLlxuICAgICAgICBjb25zdCBncm91cENvbHVtbiA9IGNlbGxUeXBlQ29sdW1uRm9yKGRhdGFzZXQsIHZpZXcpO1xuICAgICAgICBpZiAodmlldy5oaWRkZW5Hcm91cHM/Lmxlbmd0aCAmJiBncm91cENvbHVtbiA9PT0gY29sb3JCeS5uYW1lKSB7XG4gICAgICAgICAgY29uc3Qgb2ZmID0gbmV3IFNldCh2aWV3LmhpZGRlbkdyb3Vwcyk7XG4gICAgICAgICAgY29uc3QgaGlkZSA9IGNvbHVtbi5tZXRhLmNhdGVnb3JpZXMubWFwKChjKSA9PiBvZmYuaGFzKGMpKTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbHVtbi5jb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgYyA9IGNvbHVtbi5jb2Rlc1tpXTtcbiAgICAgICAgICAgIGlmIChjICE9PSBOT19DQVRFR09SWSAmJiBoaWRlW2NdKSByZ2JhWzQgKiBpICsgM10gPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmdiYTtcbiAgICAgIH1cbiAgICAgIC8vIEEgY29udGludW91cyBjb2x1bW4gbWF5IGNhcnJ5IGl0cyBvd24gbG9nIGhpbnQgKGNvdW50cyk7IHRoZSB2aWV3J3NcbiAgICAgIC8vIHRvZ2dsZSB3aW5zIG9uY2UgdGhlIHVzZXIgaGFzIHNldCBpdC5cbiAgICAgIHJldHVybiB0aGlzLmVuY29kZUNvbnRpbnVvdXMoY29sdW1uLnZhbHVlcywgdmlldywgbXV0ZWQpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlcyA9IGF3YWl0IHBvcnQuZ2V0RmVhdHVyZVZlY3Rvcihjb2xvckJ5Lm5hbWUpO1xuICAgIHJldHVybiB0aGlzLmVuY29kZUNvbnRpbnVvdXModmFsdWVzLCB2aWV3LCBtdXRlZCk7XG4gIH1cblxuICAvKiogQ29udGludW91cyB2YWx1ZXMg4oaSIFJHQkEgdGhyb3VnaCB0aGUgYWN0aXZlIGNvbG9ybWFwIGFuZCBhIGNsaXBwZWQgd2luZG93LiAqL1xuICBlbmNvZGVDb250aW51b3VzKHZhbHVlczogRmxvYXQzMkFycmF5LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLCBtdXRlZDogVWludDhBcnJheSB8IG51bGwgPSBudWxsKTogRmxvYXQzMkFycmF5IHtcbiAgICByZXR1cm4gZW5jb2RlU3BhdGlhbENvbnRpbnVvdXMoXG4gICAgICB2YWx1ZXMsXG4gICAgICB2aWV3LFxuICAgICAgdGhpcy5jdHguZGlzcGxheS5zcGF0aWFsTHV0KHZpZXcpLFxuICAgICAgdGhpcy5zZXNzaW9uLmNvbnRyYXN0V2luZG93cyxcbiAgICAgIG11dGVkLFxuICAgICk7XG4gIH1cbn1cblxuLyoqIFRoZSBtYXJrZXJzJyBkaWFtZXRlcnM6IGVhY2ggb2JzZXJ2YXRpb24ncyBvd24gKG9yIHRoZSBmYWxsYmFjayksIGF0IGxlYXN0IHRoZSBzbGFiJ3MgZmxvb3IsXG4gKiAgdGltZXMgdGhlIHZpZXcncyBwb2ludCBzY2FsZTsgb25lIG51bWJlciB3aGVuIGV2ZXJ5IG1hcmtlciBpcyBkcmF3biBhdCB0aGUgc2FtZSBzaXplLiAqL1xuZnVuY3Rpb24gbWFya2VyU2l6ZXMob2JzOiBTcGF0aWFsT2JzZXJ2YXRpb25zLCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLCBzbGFiOiBTbGFiIHwgbnVsbCk6IG51bWJlciB8IEZsb2F0MzJBcnJheSB7XG4gIGNvbnN0IGJhc2UgPSBtYXJrZXJEaWFtZXRlcnMob2JzLCBTUEFUSUFMX0ZBTExCQUNLX1JBRElVUyk7XG4gIGNvbnN0IHNjYWxlID0gdmlldy5wb2ludFNjYWxlID4gMCA/IHZpZXcucG9pbnRTY2FsZSA6IDE7XG4gIGNvbnN0IGZsb29yID0gc2xhYj8ubWluRGlhbWV0ZXIgPz8gMDtcbiAgaWYgKHR5cGVvZiBiYXNlID09PSAnbnVtYmVyJyAmJiAhc2xhYikgcmV0dXJuIE1hdGgubWF4KGJhc2UsIGZsb29yKSAqIHNjYWxlO1xuICBjb25zdCBzaXplT2YgPSAoaTogbnVtYmVyKSA9PiBNYXRoLm1heCh0eXBlb2YgYmFzZSA9PT0gJ251bWJlcicgPyBiYXNlIDogYmFzZVtpXSwgZmxvb3IpICogc2NhbGU7XG4gIHJldHVybiBGbG9hdDMyQXJyYXkuZnJvbShzbGFiPy5pbmRpY2VzID8/IHsgbGVuZ3RoOiBvYnMuY291bnQgfSwgKF92LCBpKSA9PiBzaXplT2Yoc2xhYiA/IHNsYWIuaW5kaWNlc1tpXSA6IGkpKTtcbn1cblxuLyoqIEludGVybGVhdmVkIHgseSBvZiB0aGUgYGRyYXduYCBvYnNlcnZhdGlvbnMgKHVuZGVmaW5lZDogYWxsIG9mIHRoZW0pLiAqL1xuZnVuY3Rpb24gb2JzZXJ2YXRpb25Qb3NpdGlvbnMob2JzOiBTcGF0aWFsT2JzZXJ2YXRpb25zLCBkcmF3bjogVWludDMyQXJyYXkgfCB1bmRlZmluZWQpOiBGbG9hdDMyQXJyYXkge1xuICBjb25zdCBjb3VudCA9IGRyYXduID8gZHJhd24ubGVuZ3RoIDogb2JzLmNvdW50O1xuICBjb25zdCBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KGNvdW50ICogMik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgIGNvbnN0IG8gPSBkcmF3biA/IGRyYXduW2ldIDogaTtcbiAgICBwb3NpdGlvbnNbaSAqIDJdID0gb2JzLnhbb107XG4gICAgcG9zaXRpb25zW2kgKiAyICsgMV0gPSBvYnMueVtvXTtcbiAgfVxuICByZXR1cm4gcG9zaXRpb25zO1xufVxuXG4vKipcbiAqIFRoZSBwbGFuZSBgc2xpY2VgIG9mIGEgdm9sdW1lLWJhY2tlZCBkYXRhc2V0OiBpdHMgcGl4ZWwgYWZmaW5lLCB0aGUgb2JzZXJ2YXRpb25zIHRoYXQgZmFsbCBpblxuICogaXQsIGFuZCB0aGUgbWFya2VyIGZsb29yIHRoYXQgZ3JpZCBuZWVkcy5cbiAqXG4gKiBOdWxsIGZvciBhIGRhdGFzZXQgd2l0aCBhIHJlYWwgYGltYWdlUmVmYCAoaXRzIGNvb3JkaW5hdGVzIGFyZSBhbHJlYWR5IHRoZSBpbWFnZSdzIHBpeGVscyBhbmRcbiAqIGV2ZXJ5IG9ic2VydmF0aW9uIGJlbG9uZ3MgdG8gdGhlIG9uZSBzZWN0aW9uKSBhbmQgZm9yIG9uZSB3aXRoIG5vIHZvbHVtZSBhdCBhbGwg4oCUIGJvdGggb2ZcbiAqIHdoaWNoIGRyYXcgZXhhY3RseSBhcyBiZWZvcmUuXG4gKi9cbmZ1bmN0aW9uIHNsYWJBdChkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCwgc2xpY2U6IG51bWJlcik6IFNsYWIgfCBudWxsIHtcbiAgY29uc3Qgdm9sdW1lID0gZGF0YXNldC52b2x1bWU7XG4gIGlmIChkYXRhc2V0LmltYWdlUmVmIHx8ICF2b2x1bWUpIHJldHVybiBudWxsO1xuICByZXR1cm4ge1xuICAgIHJlZjogdm9sdW1lSW1hZ2VSZWYodm9sdW1lLCBkYXRhc2V0Lm1pY3JvbnNQZXJVbml0KSxcbiAgICBpbmRpY2VzOiBvYnNlcnZhdGlvbnNJblNsaWNlKGRhdGFzZXQub2JzZXJ2YXRpb25zLCB2b2x1bWUsIHNsaWNlKSxcbiAgICBzbGljZSxcbiAgICBtaW5EaWFtZXRlcjogU1BBVElBTF9TTElDRV9NSU5fRElBTUVURVJfUFggKiB2b2x1bWUudm94ZWxTaXplWzBdLFxuICB9O1xufVxuXG4vKiogUGVyLW9ic2VydmF0aW9uIG5hcGFyaS1qcyBzeW1ib2wgY29kZXM6IGVhY2ggb2JzZXJ2YXRpb24ncyBnZW5lJ3MgaWNvbiAoYGNvZGVzYCBpbmRleFxuICogIGBnbHlwaHNgKSwgYSBkaXNjIHdoZXJlIGl0IGhhcyBub25lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdseXBoU3ltYm9scyhjb2RlczogVWludDE2QXJyYXksIGdseXBoczogcmVhZG9ubHkgVHJhbnNjcmlwdEdseXBoTmFtZVtdKTogVWludDhBcnJheSB7XG4gIGNvbnN0IGJ5R2VuZSA9IGdseXBocy5tYXAoKGcpID0+IHBvaW50U3ltYm9sQ29kZShHTFlQSF9TWU1CT0xTW2ddKSk7XG4gIGNvbnN0IGRpc2MgPSBwb2ludFN5bWJvbENvZGUoJ2Rpc2MnKTtcbiAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShjb2RlcywgKGMpID0+IChjID09PSBOT19DQVRFR09SWSA/IGRpc2MgOiAoYnlHZW5lW2NdID8/IGRpc2MpKSk7XG59XG5cbi8qKiBUaGUgc3ltYm9scyBvZiB0aGUgZHJhd24gc3Vic2V0IChhbGwgb2YgdGhlbSB3aGVuIGBpbmRpY2VzYCBpcyB1bmRlZmluZWQpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdhdGhlclN5bWJvbHMoc3ltYm9sczogVWludDhBcnJheSB8IG51bGwsIGluZGljZXM/OiBVaW50MzJBcnJheSk6IFVpbnQ4QXJyYXkgfCBudWxsIHtcbiAgaWYgKCFzeW1ib2xzIHx8ICFpbmRpY2VzKSByZXR1cm4gc3ltYm9scztcbiAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShpbmRpY2VzLCAoaSkgPT4gc3ltYm9sc1tpXSk7XG59XG4iXX0=
|
|
760
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXNwYXRpYWwtMmQtc2NlbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvbmFwYXJpLXNwYXRpYWwtMmQtc2NlbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUk1QyxPQUFPLEVBQ0wsV0FBVyxFQUtYLG1CQUFtQixHQUNwQixNQUFNLDBDQUEwQyxDQUFDO0FBRWxELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN2RyxPQUFPLEVBRUwsY0FBYyxFQUNkLGFBQWEsRUFDYixrQkFBa0IsR0FDbkIsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDL0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdEYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxTQUFTLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDL0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDOUYsT0FBTyxFQUFtQixvQkFBb0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQzlHLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFB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O1FBQ0wsV0FBVyxFQUFFLDZCQUE2QixHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFO0tBQ3JELENBQUM7QUFDSixDQUFDO0FBRUQ7MkNBQzJDO0FBQzNDLE1BQU0sVUFBVSxZQUFZLENBQUMsS0FBa0IsRUFBRSxNQUFzQztJQUNyRixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRSxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckMsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RixDQUFDO0FBRUQsaUZBQWlGO0FBQ2pGLE1BQU0sVUFBVSxhQUFhLENBQUMsT0FBMEIsRUFBRSxPQUFxQjtJQUM3RSxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTztRQUFFLE9BQU8sT0FBTyxDQUFDO0lBQ3pDLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwb2ludFN5bWJvbENvZGUgfSBmcm9tICduYXBhcmktanMnO1xuaW1wb3J0IHR5cGUgeyBJbWFnZUxheWVyLCBQb2ludHNMYXllciwgVmlld2VyIH0gZnJvbSAnbmFwYXJpLWpzJztcblxuaW1wb3J0IHsgSUhpc3RvZ3JhbSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jaGFubmVsLWhpc3RvZ3JhbS1hcGkuY29udHJhY3QnO1xuaW1wb3J0IHtcbiAgTk9fQ0FURUdPUlksXG4gIFNwYXRpYWxDb2x1bW4sXG4gIFNwYXRpYWxEYXRhc2V0LFxuICBTcGF0aWFsSW1hZ2VSZWYsXG4gIFNwYXRpYWxPYnNlcnZhdGlvbnMsXG4gIGlzQ2F0ZWdvcmljYWxDb2x1bW4sXG59IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHsgU3BhdGlhbFZpZXdTdGF0ZSwgVHJhbnNjcmlwdEdseXBoTmFtZSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9kaXNwbGF5LXR5cGVzJztcbmltcG9ydCB7IGNhdGVnb3J5Q29sb3JzRm9yLCBlbmNvZGVDYXRlZ29yaWNhbCwgbWFya2VyRGlhbWV0ZXJzIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLWVuY29kaW5nJztcbmltcG9ydCB7XG4gIFNwYXRpYWxTZWxlY3Rpb25NYXNrLFxuICBlbXB0eVNlbGVjdGlvbixcbiAgbWFza1RvSW5kaWNlcyxcbiAgbXV0ZWRGcm9tU2VsZWN0aW9uLFxufSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtc2VsZWN0aW9uJztcbmltcG9ydCB7IGZyYW1lUG9zaXRpb25zIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLWZyYW1pbmcnO1xuaW1wb3J0IHsgUElYRUxfV09STERfUVVBTlRVTSwgd29ybGRRdWFudHVtRm9yRXh0ZW50IH0gZnJvbSAnLi4vLi4vc3BhdGlhbC93b3JsZC1ncmlkJztcbmltcG9ydCB7IG9ic2VydmF0aW9uc0luU2xpY2UsIHZvbHVtZUltYWdlUmVmIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLXZvbHVtZS1pbWFnZSc7XG5pbXBvcnQgeyBvYnNlcnZhdGlvbnNPblBsYW5lLCBwbGFuZUJhbmQgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtcGxhbmVzJztcbmltcG9ydCB7IGNlbGxUeXBlQ29sdW1uRm9yIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLXRpbGVzJztcbmltcG9ydCB7IGNlbGxzU2hvd24gfSBmcm9tICcuLi8uLi9zcGF0aWFsL2xvZCc7XG5pbXBvcnQgeyBvYnNlcnZhdGlvbkdlbmVNYXNrLCBvYnNlcnZhdGlvbkdlbmVTdHlsZSB9IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1nZW5lLWZpbHRlcic7XG5pbXBvcnQgeyBFeHByZXNzaW9uRmllbGQsIGNvbG9yRXhwcmVzc2lvbkZpZWxkLCBmaWVsZENvbnRyYXN0V2luZG93IH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLWV4cHJlc3Npb24nO1xuaW1wb3J0IHsgY29tcHV0ZUV4cHJlc3Npb25GaWVsZEFzeW5jIH0gZnJvbSAnLi4vLi4vd29ya2Vycy9zcGF0aWFsLW1hdGgnO1xuaW1wb3J0IHsgU3VwZXJzZWRlIH0gZnJvbSAnLi4vLi4vdXRpbC9zdXBlcnNlZGUnO1xuaW1wb3J0IHsgaXNBYm9ydEVycm9yIH0gZnJvbSAnLi4vdGlsZS1zZXJ2ZXInO1xuaW1wb3J0IHsgTmFwYXJpU3BhdGlhbFRpbGVMYXllcnMgfSBmcm9tICcuL25hcGFyaS1zcGF0aWFsLXRpbGVzJztcbmltcG9ydCB7IEdMWVBIX1NZTUJPTFMgfSBmcm9tICcuL3NwYXRpYWwtdGlsZXMvdHJhbnNjcmlwdC1sYXllcnMnO1xuaW1wb3J0IHsgSW1hZ2UyZFNjZW5lIH0gZnJvbSAnLi9uYXBhcmktaW1hZ2UtMmQtc2NlbmUnO1xuaW1wb3J0IHtcbiAgR0VORV9NQVBfTUFYX1NJREUsXG4gIEdFTkVfTUFQX1NJR01BLFxuICBTUEFUSUFMX0ZBTExCQUNLX1JBRElVUyxcbiAgU1BBVElBTF9NQVJLRVJfTUlOX1NDUkVFTl9QWCxcbiAgU1BBVElBTF9ORVVUUkFMX0NPTE9SLFxuICBTUEFUSUFMX05FVVRSQUxfSEVYLFxuICBTUEFUSUFMX1NMSUNFX01JTl9ESUFNRVRFUl9QWCxcbiAgUG9pbnRDb2xvcnMsXG4gIGVuY29kZVNwYXRpYWxDb250aW51b3VzLFxuICBnYXRoZXJDb2xvcnMsXG4gIGhpZGVVbnNob3duLFxufSBmcm9tICcuL25hcGFyaS1zcGF0aWFsLWVuY29kaW5nJztcbmltcG9ydCB7IFNwYXRpYWxTY2VuZUJhc2UsIFNwYXRpYWxTZXNzaW9uLCBTcGF0aWFsVGlsZU93bmVyIH0gZnJvbSAnLi9uYXBhcmktc3BhdGlhbC1zY2VuZSc7XG5pbXBvcnQgdHlwZSB7IE5hcGFyaVNjZW5lLCBTY2VuZUNvbnRleHQgfSBmcm9tICcuL25hcGFyaS1zY2VuZSc7XG5cbi8qKiBUaGUgcGxhbmUgYSB2b2x1bWUtYmFja2VkIGRhdGFzZXQgaXMgc2hvd2luZywgb3Igb25lIG9mIGl0cyByZWdpb24gc2V0J3MgcGxhbmVzIChzZWUgc2xhYkF0KS4gKi9cbmludGVyZmFjZSBTbGFiIHtcbiAgcmVmOiBTcGF0aWFsSW1hZ2VSZWY7XG4gIGluZGljZXM6IFVpbnQzMkFycmF5O1xuICBzbGljZTogbnVtYmVyO1xuICBtaW5EaWFtZXRlcjogbnVtYmVyO1xuICAvKiogVGhlIHBpeGVsIGdyaWQgdGhlIHBsYW5lIGlzIGRyYXduIGluLCB3aGVuIG5vdCB0aGUgaW1hZ2UncyAodGhlIHZvbHVtZSdzKS4gKi9cbiAgZ3JpZDogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbDtcbn1cblxuLyoqIEEgcmVnaW9uIHNldCdzIHBsYW5lcyBhbmQgdGhlIG9uZSBzaG93biAoc2VlIHtAbGluayBTcGF0aWFsMmRTY2VuZS5zZXRSZWdpb25QbGFuZX0pLiAqL1xuaW50ZXJmYWNlIFBsYW5lVmlldyB7XG4gIHBsYW5lczogcmVhZG9ubHkgbnVtYmVyW107XG4gIHBsYW5lOiBudW1iZXI7XG59XG5cbi8qKlxuICogU1BBVElBTF9PTUlDUyAocmV2aWV3IEFwcGVuZGl4IEIsIGNsdXN0ZXIgSik6IHRoZSB0aXNzdWUgaW1hZ2UgKGFuIHtAbGluayBJbWFnZTJkU2NlbmV9KSB3aXRoIG9uZVxuICogbWFya2VyIHBlciBvYnNlcnZhdGlvbiwgY29sb3VyZWQgYnkgYW4gYW5ub3RhdGlvbiBjb2x1bW4gb3IgYSBnZW5lLCB0aGUgZ2VuZSBtYXAgdW5kZXIgdGhlXG4gKiBjZWxscywgYW5kIHRoZSBsZXZlbC1vZi1kZXRhaWwgdGlsZSBsYXllcnMgKG91dGxpbmVzLCB0cmFuc2NyaXB0cywgZGVuc2l0eSkgb3ZlciB0aGVtLiBUaGVcbiAqIG1hcmtlcnMgcmVidWlsZCB3aGVuZXZlciB0aGUgZGF0YXNldCBvciB0aGUgdmlldyBzdGF0ZSBjaGFuZ2VzLCBzbyBzd2l0Y2hpbmcgdGhlIGNvbG91ci1ieVxuICogY29sdW1uIGRvZXMgbm90IHJlbW91bnQgdGhlIHNjZW5lLlxuICpcbiAqIFNldHMgdXAgdGhlIGZ1bGwgMkQgaW50ZXJhY3Rpb24gc3RhY2sg4oCUIHJlZ2lvbiBvdmVybGF5LCBwaXhlbCB0b29scywgcmVhZGJhY2sgY3VycmVuY3kg4oCUIGV4YWN0bHlcbiAqIGFzIHRoZSBwbGFpbiBpbWFnZSB2aWV3IGRvZXMuIFRoYXQgaXMgTk9UIG9wdGlvbmFsIGhlcmU6IHRoaXMgbW9kZSdzIHNlbGVjdGlvbiBpcyBkcml2ZW4gYnlcbiAqIGRyYXduIFJPSXMsIHNvIHdpdGhvdXQgdGhlIG92ZXJsYXkgdGhlcmUgaXMgbm8gd2F5IHRvIG1ha2UgYSBzZWxlY3Rpb24gYXQgYWxsLlxuICovXG5leHBvcnQgY2xhc3MgU3BhdGlhbDJkU2NlbmUgZXh0ZW5kcyBTcGF0aWFsU2NlbmVCYXNlIGltcGxlbWVudHMgTmFwYXJpU2NlbmUsIFNwYXRpYWxUaWxlT3duZXIge1xuICByZWFkb25seSBpbWFnZTogSW1hZ2UyZFNjZW5lO1xuICAvKiogVGhlIG9ic2VydmF0aW9uIG1hcmtlcnMsIGFuZCB3aGljaCBkYXRhc2V0L3BsYW5lIHRoZXkgd2VyZSBidWlsdCBmb3Ig4oCUIHNvIGEgZGlzcGxheS1vbmx5XG4gICAqICBjaGFuZ2UgKHNpemUsIGNvbG91ciwgb3BhY2l0eSwgc2VsZWN0aW9uKSBjYW4gdXBkYXRlIHRoZW0gaW4gcGxhY2UuICovXG4gIHByaXZhdGUgcG9pbnRzOiBQb2ludHNMYXllciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxheWVyS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSBvYnNlcnZhdGlvbiBlYWNoIG1hcmtlciBpcywgaW4gZHJhdyBvcmRlcjsgbnVsbCB3aGVuIGV2ZXJ5IG9ic2VydmF0aW9uIGlzIGRyYXduLiAqL1xuICBwcml2YXRlIGRyYXduOiBVaW50MzJBcnJheSB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGdlbmUgbWFwJ3MgbGF5ZXIgYW5kIHRoZSBpbnB1dHMgaXQgd2FzIGNvbG91cmVkIGZvciAoaXRzIGZpZWxkIGlzIGNhY2hlZCBpbiB0aGUgc2Vzc2lvbixcbiAgICogIG9uIGEgY2xvY2sgb2YgaXRzIG93bikuICovXG4gIGdlbmVNYXBMYXllcjogSW1hZ2VMYXllciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGdlbmVNYXBLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGRhdGFzZXQgdGhlIGNhbWVyYSBoYXMgYmVlbiBmcmFtZWQgb24g4oCUIHNlZSB7QGxpbmsgZnJhbWVPbmNlfS4gKi9cbiAgcHJpdmF0ZSBmcmFtZWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGdlbmUtbWFwIGVzdGltYXRlIGluIGZsaWdodCAob2ZmIHRoZSBtYWluIHRocmVhZCBwYXN0IHRoZSB3b3JrZXIgdGhyZXNob2xkLFxuICAgKiAgU1BBVElBTC0xOSk6IGEgbmV3IGZpZWxkIGtleSBzdXBlcnNlZGVzIOKAlCBhbmQgYWJvcnRzIOKAlCBpdDsgYSByZWJ1aWxkIHRoYXQgbGVhdmVzIHRoZSBrZXlcbiAgICogIGFsb25lIGxldHMgaXQgZmluaXNoLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGdlbmVNYXBMb2FkcyA9IG5ldyBTdXBlcnNlZGUoKTtcbiAgLyoqXG4gICAqIFRoZSBwbGFuZXMgb2YgdGhlIGRhdGFzZXQncyByZWdpb24gc2V0IChpdHMgYHNsaWNlWmApLCBzZXQgd2hpbGUgdGhleSBzbGljZSBhbiBpbWFnZSBvZiBvbmVcbiAgICogcGxhbmUsIGFuZCB3aGljaCBvZiB0aGVtIHRoZSBzbGlkZXIgc2hvd3M6IHRoZSBvYnNlcnZhdGlvbnMgYW5kIHRyYW5zY3JpcHRzIGRyYXduIGFyZSB0aGF0XG4gICAqIHBsYW5lJ3MsIGFzIGEgc3RhY2sncyBzbGljZSBzaG93cyBpdHMgb3duLlxuICAgKi9cbiAgcHJpdmF0ZSBwbGFuZXM6IHJlYWRvbmx5IG51bWJlcltdIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcGxhbmUgPSAwO1xuICAvKiogTW91bnRlZDogaXRzIG1hcmtlcnMgYXJlIGluIHRoZSBzY2VuZSBhbmQgZm9sbG93IHRoZSBwbGFuZSAoc2V0IGJlZm9yZSB0aGVuLCBpdCBpcyBrZXB0KS4gKi9cbiAgcHJpdmF0ZSBtb3VudGVkID0gZmFsc2U7XG5cbiAgLyoqIGBub0ltYWdlYDogYW4gaW1hZ2UtbGVzcyBkYXRhc2V0IG9wZW5lZCBiZWZvcmUgYW55IGltYWdlIOKAlCB0aGUgb2JzZXJ2YXRpb25zIGFsb25lLiAqL1xuICBjb25zdHJ1Y3RvcihjdHg6IFNjZW5lQ29udGV4dCwgc2Vzc2lvbjogU3BhdGlhbFNlc3Npb24sIG5vSW1hZ2UgPSBmYWxzZSkge1xuICAgIHN1cGVyKGN0eCwgc2Vzc2lvbiwgZmFsc2UpO1xuICAgIHRoaXMuaW1hZ2UgPSBuZXcgSW1hZ2UyZFNjZW5lKGN0eCwge1xuICAgICAgaW1hZ2U6ICFub0ltYWdlLFxuICAgICAgLy8gT25seSBmaXQgdG8gdGhlIGltYWdlIHdoZW4gdGhpcyBkYXRhc2V0IGFjdHVhbGx5IGhhcyBvbmUuIE90aGVyd2lzZSB0aGVyZSBpcyBub3RoaW5nIHRvXG4gICAgICAvLyBmaXQsIHRoZSBpbWFnZSBzaXplIHN0aWxsIGhvbGRzIHRoZSBMQVNUIGltYWdlJ3MgZGltZW5zaW9ucywgYW5kIHRoaXMgZml0cyB0byB0aG9zZSDigJQgYW5kXG4gICAgICAvLyBiZWNhdXNlIGl0IGRlZmVycyB0byBhIGZyYW1lLCBpdCBsYW5kcyBBRlRFUiB0aGUgcG9pbnRzIGFyZSBhZGRlZCBhbmQgb3ZlcndyaXRlcyB0aGVcbiAgICAgIC8vIGZyYW1pbmcgdGhleSBzZXQuIFRoYXQgaXMgd2hhdCBsZWZ0IGFuIGltYWdlLWxlc3MgZGF0YXNldCBhcyBhIHRlbi1waXhlbCBzcGVjay5cbiAgICAgIGZpdDogKCkgPT4gISFzZXNzaW9uLmxhdGVzdD8uWzBdPy5pbWFnZVJlZixcbiAgICAgIG9uU2xpY2U6IChyZXJlbmRlcmVkKSA9PiB7XG4gICAgICAgIHRoaXMucmVkcmF3TWFya2VycygpO1xuICAgICAgICAvLyBUaGUgc3RpdGNoZWQgcmUtcmVuZGVyIGNsZWFyZWQgdGhlIGNlbGxzLCB0cmFuc2NyaXB0cyBhbmQgZGVuc2l0eSB0b286IHJlLXBsYW4gdGhlbSBub3dcbiAgICAgICAgLy8gcmF0aGVyIHRoYW4gYXQgdGhlIG5leHQgY2FtZXJhIG1vdmUgKGVhY2ggZ3JvdXAgcmVkcmF3cyBvbmx5IHdoYXQgbGVmdCB0aGUgc2NlbmUpLlxuICAgICAgICBpZiAocmVyZW5kZXJlZCkgdGhpcy5zZXNzaW9uLnRpbGVzPy5yZWZyZXNoKCk7XG4gICAgICB9LFxuICAgICAgb25OYXZpZ2F0b3JJbnRlcmFjdDogKCkgPT4gdGhpcy5ob3Zlci5oaWRlKCksXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBtb3VudCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcztcbiAgICBhd2FpdCB0aGlzLmltYWdlLm1vdW50KCk7XG4gICAgLy8gRGlzcG9zZWQgd2hpbGUgdGhlIGltYWdlIGxvYWRlZDogY2xhaW1pbmcgdGhlIHRpbGVzIG5vdyB3b3VsZCB0YWtlIHRoZW0gZnJvbSB0aGUgbmV4dCBzY2VuZSxcbiAgICAvLyBhbmQgdGhlIHNwYXRpYWwgc3Vic2NyaXB0aW9uIHdvdWxkIG91dGxpdmUgdGhpcyBvbmUuXG4gICAgaWYgKGN0eC5zaWduYWwuYWJvcnRlZCkgcmV0dXJuO1xuICAgIHRoaXMuaG92ZXIuaW5zdGFsbChjdHguaG9zdCk7XG4gICAgdGhpcy5zZXNzaW9uLmNsYWltVGlsZXModGhpcyk/LmF0dGFjaChjdHgudmlld2VyKTtcbiAgICB0aGlzLnNlc3Npb24udGlsZXM/LnNldFpCYW5kKHRoaXMuekJhbmQoKSk7XG4gICAgdGhpcy5zZXNzaW9uLnRpbGVzPy5zZXRQbGFuZSh0aGlzLnBsYW5lcyA/IHRoaXMucGxhbmUgOiBudWxsKTtcbiAgICB0aGlzLnN1YnNjcmliZVNwYXRpYWwoKTtcbiAgICB0aGlzLm1vdW50ZWQgPSB0cnVlO1xuICAgIGN0eC50b29scy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gIH1cblxuICBzZXRaKHo6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuaW1hZ2Uuc2V0Wih6KTtcbiAgfVxuXG4gIHNldFJlZ2lvblBsYW5lcyh6OiByZWFkb25seSBudW1iZXJbXSB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnBsYW5lcyA9IHo/Lmxlbmd0aCA/IHogOiBudWxsO1xuICAgIHRoaXMucGxhbmVDaGFuZ2VkKCk7XG4gIH1cblxuICBzZXRSZWdpb25QbGFuZShrOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoayA9PT0gdGhpcy5wbGFuZSkgcmV0dXJuO1xuICAgIHRoaXMucGxhbmUgPSBrO1xuICAgIHRoaXMucGxhbmVDaGFuZ2VkKCk7XG4gIH1cblxuICAvKiogVGhlIHBsYW5lcyBhbmQgdGhlIG9uZSBzaG93biwgd2hpbGUgcGxhbmVzIHNsaWNlIHRoZSBpbWFnZS4gKi9cbiAgcHJpdmF0ZSBwbGFuZVZpZXcoKTogUGxhbmVWaWV3IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucGxhbmVzID8geyBwbGFuZXM6IHRoaXMucGxhbmVzLCBwbGFuZTogdGhpcy5wbGFuZSB9IDogbnVsbDtcbiAgfVxuXG4gIC8qKiBUaGUgeiBiYW5kIG9mIHRoZSBwbGFuZSBzaG93biwgb3IgbnVsbCAoZXZlcnkgZGVwdGgpLiAqL1xuICBwcml2YXRlIHpCYW5kKCk6IFtudW1iZXIsIG51bWJlcl0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5wbGFuZXMgPyBwbGFuZUJhbmQodGhpcy5wbGFuZXMsIHRoaXMucGxhbmUpIDogbnVsbDtcbiAgfVxuXG4gIC8qKiBBbm90aGVyIHBsYW5lIChvciBub25lKTogaXRzIG9ic2VydmF0aW9ucyBhbmQgdHJhbnNjcmlwdHMgYXJlIGRyYXduLiAqL1xuICBwcml2YXRlIHBsYW5lQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubW91bnRlZCB8fCB0aGlzLmN0eC5zaWduYWwuYWJvcnRlZCkgcmV0dXJuO1xuICAgIHRoaXMuc2Vzc2lvbi50aWxlcz8uc2V0WkJhbmQodGhpcy56QmFuZCgpKTtcbiAgICB0aGlzLnNlc3Npb24udGlsZXM/LnNldFBsYW5lKHRoaXMucGxhbmVzID8gdGhpcy5wbGFuZSA6IG51bGwpO1xuICAgIHRoaXMucmVkcmF3TWFya2VycygpO1xuICB9XG5cbiAgaGlzdG9ncmFtKGNoYW5uZWw6IG51bWJlciwgYmluczogbnVtYmVyKTogSUhpc3RvZ3JhbSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmltYWdlLmhpc3RvZ3JhbShjaGFubmVsLCBiaW5zKTtcbiAgfVxuXG4gIHNldEltYWdlU21vb3RoaW5nKGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmltYWdlLnNldEltYWdlU21vb3RoaW5nKGVuYWJsZWQpO1xuICB9XG5cbiAgc2V0TmF2aWdhdG9yVmlzaWJsZSh2aXNpYmxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5pbWFnZS5zZXROYXZpZ2F0b3JWaXNpYmxlKHZpc2libGUpO1xuICB9XG5cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLm1vdW50ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmRpc3Bvc2VTcGF0aWFsKCk7XG4gICAgdGhpcy5nZW5lTWFwTG9hZHMuY2FuY2VsKCk7XG4gICAgdGhpcy5zZXNzaW9uLnRpbGVzPy5zZXRaQmFuZChudWxsKTtcbiAgICB0aGlzLnNlc3Npb24udGlsZXM/LnNldFBsYW5lKG51bGwpO1xuICAgIHRoaXMuc2Vzc2lvbi5yZWxlYXNlVGlsZXModGhpcyk7XG4gICAgdGhpcy5pbWFnZS5kaXNwb3NlKCk7XG4gIH1cblxuICBjYW52YXNTaXplKCk6IFtudW1iZXIsIG51bWJlcl0ge1xuICAgIHJldHVybiBbdGhpcy5jdHguY2FudmFzLmNsaWVudFdpZHRoID8/IDAsIHRoaXMuY3R4LmNhbnZhcy5jbGllbnRIZWlnaHQgPz8gMF07XG4gIH1cblxuICBwb2x5Z29uc1Nob3duQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wb2ludHMpIHRoaXMucG9pbnRzLnZpc2libGUgPSB0aGlzLnBvaW50c1Zpc2libGUoKTtcbiAgICB0aGlzLmN0eC52aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFmdGVyQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuc2Vzc2lvbi50aWxlcz8ucmVmcmVzaCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGhvdmVyVGlsZXMoKTogTmFwYXJpU3BhdGlhbFRpbGVMYXllcnMgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uLnRpbGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBvYnNlcnZhdGlvbiB1bmRlciBhIGNsaWVudCBwb3NpdGlvbjogbmFwYXJpLWpzJ3MgcGljayBvbiB0aGUgbWFya2VyIGxheWVyIGl0c2VsZiAoYSBncmlkXG4gICAqIG92ZXIgaXRzIHBvc2l0aW9ucywgcmVidWlsdCBvbmx5IHdoZW4gdGhleSBjaGFuZ2UpLCBzbyB0aGUgdG9vbHRpcCBjYW5ub3QgbmFtZSBhIGNlbGwgdGhhdCBpc1xuICAgKiBub3QgZHJhd24sIHRoZW4gdGhlIGRyYXduIGluZGV4IG1hcHBlZCBiYWNrIHRvIHRoZSBvYnNlcnZhdGlvbi5cbiAgICpcbiAgICogQSBtYXJrZXIgaXMgaGl0IGFueXdoZXJlIG9uIGl0cyBkcmF3biBkaXNjLCBvciB3aXRoaW4gYHNsYWNrUHhgIHNjcmVlbiBwaXhlbHMgb2YgaXRzIGNlbnRyZVxuICAgKiB3aGVuIGl0IGlzIHNtYWxsZXIgdGhhbiB0aGF0IChhIDEuNSBweCBkb3Qgc3RpbGwgaGFzIHRvIGJlIGhvdmVyYWJsZSksIGFuZCBvZiBzZXZlcmFsIGhpdHMgdGhlXG4gICAqIE5FQVJFU1QgY2VudHJlIHdpbnMgKGFuIGV4YWN0IHRpZSBnb2VzIHRvIHRoZSBvbmUgZHJhd24gb24gdG9wKS4gTm90IG5hcGFyaSdzIGAndG9wbW9zdCdgOiB0aGVcbiAgICogc2xhY2sgaXMgd2lkZXIgdGhhbiBtb3N0IG1hcmtlcnMsIGFuZCBvdmVyIGEgZGVuc2UgZmllbGQgb2Ygc21hbGwgb25lcyBcInRoZSBsYXN0IGRyYXduIHdpdGhpblxuICAgKiAxMCBweFwiIG5hbWVzIGEgbmVpZ2hib3VyIHJhdGhlciB0aGFuIHRoZSBjZWxsIHVuZGVyIHRoZSBjdXJzb3IuXG4gICAqL1xuICBwcm90ZWN0ZWQgcGlja09ic2VydmF0aW9uKGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyLCBzbGFja1B4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHBvaW50cyA9IHRoaXMucG9pbnRzO1xuICAgIGlmICghcG9pbnRzKSByZXR1cm4gLTE7XG4gICAgY29uc3Qgdmlld2VyID0gdGhpcy5jdHgudmlld2VyO1xuICAgIGNvbnN0IFt3eCwgd3ldID0gdmlld2VyLmNhbnZhc1RvV29ybGQoY2xpZW50WCwgY2xpZW50WSk7XG4gICAgY29uc3Qgem9vbSA9IHZpZXdlci5jYW1lcmEuem9vbTtcbiAgICBjb25zdCBrID0gcG9pbnRzLnBpY2sod3gsIHd5LCB7IHRvbGVyYW5jZTogc2xhY2tQeCAvICh6b29tID4gMCA/IHpvb20gOiAxKSwgdGllQnJlYWs6ICduZWFyZXN0JyB9KTtcbiAgICBpZiAoayA8IDApIHJldHVybiAtMTtcbiAgICByZXR1cm4gdGhpcy5kcmF3biA/IHRoaXMuZHJhd25ba10gOiBrO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG1hcmtlcnMgYXJlIGRyYXduOiB3aGlsZSB0aGUgdXNlciB3YW50cyB0aGVtLCBhdCBldmVyeSB6b29tLCBhbmQgbm90IHdoaWxlIHRoZVxuICAgKiBjZWxscyBhcmUg4oCUIHRoZSBvYnNlcnZhdGlvbnMgYXJlIHNob3duIGFzIHRoZWlyIG1hcmtlcnMgb3IgYXMgdGhlaXIgY2VsbHMsIG9uZSBvciB0aGUgb3RoZXIuXG4gICAqL1xuICBwcml2YXRlIHBvaW50c1Zpc2libGUoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgW2RhdGFzZXQsIHZpZXddID0gdGhpcy5zZXNzaW9uLmxhdGVzdCA/PyBbXTtcbiAgICBpZiAoISh2aWV3Py5zaG93UG9pbnRzID8/IHRydWUpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICEodmlldyAmJiBkYXRhc2V0ICYmIGNlbGxzU2hvd24oZGF0YXNldCwgdmlldykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZHJhdyB0aGUgbWFya2VycyBvdmVyIGEgZnJlc2hseSByZW5kZXJlZCBpbWFnZS4gVHdvIHJlYXNvbnMsIGJvdGggaW52aXNpYmxlIGZyb20gdGhlXG4gICAqIHNwYXRpYWwgc3RvcmUg4oCUIHdoaWNoIGlzIHdoeSBhIHNjcnViIG9yIGEgcmUtcmVuZGVyIG5ldmVyIHJlYWNoZWQgdGhlIG1hcmtlcnMgb24gaXRzIG93bjpcbiAgICogIC0gdGhlIGltYWdlIHJlbmRlciBDTEVBUlMgdGhlIGxheWVyIGxpc3QsIHRha2luZyB0aGUgbWFya2VycyB3aXRoIGl0O1xuICAgKiAgLSBvdmVyIGEgdm9sdW1lLWJhY2tlZCBkYXRhc2V0IHRoZSBkaXNwbGF5ZWQgcGxhbmUgZGVjaWRlcyB3aGljaCBvYnNlcnZhdGlvbnMgYmVsb25nIG9uXG4gICAqICAgIHNjcmVlbiBhdCBhbGwsIHNvIHRoZSBjZWxscyBoYXZlIHRvIG1vdmUgd2l0aCB0aGUgc2VjdGlvbiByYXRoZXIgdGhhbiBoYW5nIG92ZXIgYW5vdGhlci5cbiAgICovXG4gIHByaXZhdGUgcmVkcmF3TWFya2VycygpOiB2b2lkIHtcbiAgICBjb25zdCBsYXRlc3QgPSB0aGlzLnNlc3Npb24ubGF0ZXN0O1xuICAgIGlmICghbGF0ZXN0Py5bMF0pIHJldHVybjtcbiAgICB2b2lkIHRoaXMucmVidWlsZCguLi5sYXRlc3QpO1xuICB9XG5cbiAgLyoqIChSZSlidWlsZCB0aGUgb2JzZXJ2YXRpb24gbWFya2VyIGxheWVyIGZvciB0aGUgY3VycmVudCBkYXRhc2V0ICsgdmlldyBzdGF0ZS4gKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHJlYnVpbGQoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQgfCBudWxsLFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayA9IGVtcHR5U2VsZWN0aW9uKCksXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZpZXdlciA9IHRoaXMuY3R4LnZpZXdlcjtcbiAgICBjb25zdCB0YXNrID0gdGhpcy5yZWJ1aWxkcy5uZXh0KCk7XG5cbiAgICAvLyBSZXNvbHZlIGNvbG91cnMgQkVGT1JFIHRvdWNoaW5nIHRoZSBzY2VuZTogYSBnZW5lIGZldGNoIGNhbiBmYWlsIG9yIGJlXG4gICAgLy8gc3VwZXJzZWRlZCwgYW5kIGRyb3BwaW5nIHRoZSBleGlzdGluZyBsYXllciBmaXJzdCB3b3VsZCBibGFuayB0aGUgdmlldy5cbiAgICBsZXQgZmFjZUNvbG9yOiBQb2ludENvbG9ycztcbiAgICBsZXQgc3ltYm9sczogVWludDhBcnJheSB8IG51bGwgPSBudWxsO1xuICAgIGxldCBzaG93bjogVWludDhBcnJheSB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IGVuZExvYWRpbmcgPSB0aGlzLmN0eC5iYWRnZS5iZWdpbignT2JzZXJ2YXRpb25zJyk7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFdoaWNoIG9ic2VydmF0aW9ucyB0aGUgZ2VuZSBmaWx0ZXIga2VlcHMsIHNldHRsZWQgYXBhcnQgZnJvbSB0aGVpciBjb2xvdXJzOiBhIGNvbG91ciBjYW5cbiAgICAgIC8vIGZhbGwgYmFjayB0byBhIGZsYXQgb25lLCB0aGUgZmlsdGVyIGNhbm5vdC4gRHJhd24gd2l0aG91dCBpdCwgZXZlcnkgb2JzZXJ2YXRpb24gd291bGRcbiAgICAgIC8vIHNob3cgYXMgaWYgaXQgZXhwcmVzc2VkIHRoZSBwaWNrZWQgZ2VuZXMuIFNvIGEgZmFpbGVkIHJlYWQga2VlcHMgdGhlIG1hcmtlcnMgYXMgdGhleVxuICAgICAgLy8gd2VyZSBkcmF3biwgYW5kIHRoZSBwYW5lbCBzYXlzIHRoZSBmaWx0ZXIgY291bGQgbm90IGJlIGFwcGxpZWQuXG4gICAgICB0cnkge1xuICAgICAgICBzaG93biA9IGRhdGFzZXQgPyBhd2FpdCB0aGlzLmZpbHRlck1hc2soZGF0YXNldCwgdmlldykgOiBudWxsO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gZ2VuZSBmaWx0ZXIgY291bGQgbm90IGJlIGFwcGxpZWQg4oCUIGtlZXBpbmcgdGhlIG9ic2VydmF0aW9ucyBhcyBkcmF3bicsIGVycik7XG4gICAgICAgIGlmICh0YXNrKCkpIHRoaXMuc2Vzc2lvbi5yZXBvcnRHZW5lRmlsdGVyKHRydWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzdHlsZSA9IGRhdGFzZXQgPyBhd2FpdCB0aGlzLm1hcmtlclN0eWxlKGRhdGFzZXQsIHZpZXcsIHNlbGVjdGlvbikgOiBudWxsO1xuICAgICAgICBmYWNlQ29sb3IgPSBzdHlsZT8uY29sb3JzID8/IFNQQVRJQUxfTkVVVFJBTF9DT0xPUjtcbiAgICAgICAgc3ltYm9scyA9IHN0eWxlPy5zeW1ib2xzID8/IG51bGw7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSBzcGF0aWFsIGNvbG91cmluZyBmYWlsZWQg4oCUIGZhbGxpbmcgYmFjayB0byBhIGZsYXQgY29sb3VyJywgZXJyKTtcbiAgICAgICAgZmFjZUNvbG9yID0gU1BBVElBTF9ORVVUUkFMX0NPTE9SO1xuICAgICAgICBzeW1ib2xzID0gbnVsbDtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgZW5kTG9hZGluZygpO1xuICAgIH1cbiAgICAvLyBBIG5ld2VyIHJlYnVpbGQgKG9yIGEgdGVhcmRvd24pIHN0YXJ0ZWQgd2hpbGUgdGhlIHZlY3RvciB3YXMgaW4gZmxpZ2h0LlxuICAgIGlmICghdGFzaygpKSByZXR1cm47XG4gICAgdGhpcy5zZXNzaW9uLnJlcG9ydEdlbmVGaWx0ZXIoZmFsc2UpO1xuICAgIC8vIFRoZSBmaWx0ZXIgYXBwbGllcyB0byB3aGljaGV2ZXIgY29sb3VycyB3b24sIHRoZSBmYWxsYmFjaydzIGluY2x1ZGVkLlxuICAgIGlmIChzaG93biAmJiBkYXRhc2V0KSBmYWNlQ29sb3IgPSBoaWRlVW5zaG93bihmYWNlQ29sb3IsIHNob3duKTtcblxuICAgIGlmICghZGF0YXNldCB8fCBkYXRhc2V0Lm9ic2VydmF0aW9ucy5jb3VudCA9PT0gMCkge1xuICAgICAgdGhpcy5yZW1vdmVMYXllcnModmlld2VyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBIGRhdGFzZXQgd2hvc2UgaW1hZ2UgSVMgaXRzIHZvbHVtZSBzaG93cyBPTkUgUExBTkUgYXQgYSB0aW1lLCBzbyB0aGVcbiAgICAvLyBtYXJrZXJzIGFyZSB0aGUgb2JzZXJ2YXRpb25zIGluIHRoZSBkaXNwbGF5ZWQgcGxhbmUsIGRyYXduIGluIHRoYXQgcGxhbmUnc1xuICAgIC8vIHBpeGVsIGdyaWQuIFdpdGhvdXQgdGhlIGZpbHRlciB0aGUgc3BlY2ltZW4ncyB3aG9sZSBkZXB0aCBwaWxlcyBvbnRvIG9uZVxuICAgIC8vIHNlY3Rpb24gYW5kIHJlYWRzIGFzIGEgc21lYXI7IHdpdGhvdXQgdGhlIGFmZmluZSB0aGUgY29vcmRpbmF0ZXMgYXJlIHJlYWRcbiAgICAvLyBhcyBwaXhlbHMgYW5kIGxhbmQgb2ZmIHRoZSBzbGljZSBlbnRpcmVseS5cbiAgICBjb25zdCBzbGFiID0gc2xhYkF0KGRhdGFzZXQsIHRoaXMuY3R4LnooKSwgdGhpcy5wbGFuZVZpZXcoKSk7XG4gICAgLy8gVGhlIGdlbmUgbWFwIGdvZXMgVU5ERVIgdGhlIGNlbGxzLCBzbyBpdCBpcyBzZXR0bGVkIGJlZm9yZSB0aGV5IGFyZSBhZGRlZC5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZUdlbmVNYXAodmlld2VyLCBkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24sIHNsYWIpO1xuICAgIGlmICghdGFzaygpKSByZXR1cm47XG4gICAgdGhpcy5kcmF3TWFya2Vycyh2aWV3ZXIsIGRhdGFzZXQsIHZpZXcsIGZhY2VDb2xvciwgc2xhYiwgc3ltYm9scyk7XG4gIH1cblxuICAvKiogTm90aGluZyB0byBkcmF3OiBkcm9wIHRoZSBtYXJrZXJzIGFuZCB0aGUgZ2VuZSBtYXAuICovXG4gIHByaXZhdGUgcmVtb3ZlTGF5ZXJzKHZpZXdlcjogVmlld2VyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucG9pbnRzKSB7XG4gICAgICB2aWV3ZXIubGF5ZXJzLnJlbW92ZSh0aGlzLnBvaW50cyk7XG4gICAgICB0aGlzLnBvaW50cyA9IG51bGw7XG4gICAgICB0aGlzLmxheWVyS2V5ID0gbnVsbDtcbiAgICAgIHRoaXMuZHJhd24gPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy5nZW5lTWFwTGF5ZXIpIHtcbiAgICAgIHZpZXdlci5sYXllcnMucmVtb3ZlKHRoaXMuZ2VuZU1hcExheWVyKTtcbiAgICAgIHRoaXMuZ2VuZU1hcExheWVyID0gbnVsbDtcbiAgICAgIHRoaXMuZ2VuZU1hcEtleSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERyYXcgdGhlIG9ic2VydmF0aW9uIG1hcmtlcnMgb3ZlciB0aGUgaW1hZ2UgKGFuZCB0aGUgZ2VuZSBtYXApOiByZXN0eWxlZCBpbiBwbGFjZSBmb3IgYVxuICAgKiBkaXNwbGF5LW9ubHkgY2hhbmdlLCBlbHNlIGEgbmV3IGxheWVyLlxuICAgKi9cbiAgcHJpdmF0ZSBkcmF3TWFya2VycyhcbiAgICB2aWV3ZXI6IFZpZXdlcixcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCxcbiAgICB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIGZhY2VDb2xvcjogUG9pbnRDb2xvcnMsXG4gICAgc2xhYjogU2xhYiB8IG51bGwsXG4gICAgc3ltYm9sczogVWludDhBcnJheSB8IG51bGwgPSBudWxsLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBvYnMgPSBkYXRhc2V0Lm9ic2VydmF0aW9ucztcbiAgICBjb25zdCByZWYgPSBzbGFiPy5yZWYgPz8gZGF0YXNldC5pbWFnZVJlZjtcbiAgICBjb25zdCBzaXplID0gbWFya2VyU2l6ZXMob2JzLCB2aWV3LCBzbGFiKTtcblxuICAgIC8vIG5hcGFyaSdzIGltYWdlIHZpZXcgQ0xFQVJTIHRoZSB3aG9sZSBsYXllciBsaXN0IG9uIGV2ZXJ5IHJlbmRlciwgc28gdGhlXG4gICAgLy8gbWFya2VycyBnbyB3aXRoIGl0IHdoZW5ldmVyIHRoZSBpbWFnZSBpcyByZS1yZW5kZXJlZCDigJQgYSBzY3J1YiwgYSBjb250cmFzdFxuICAgIC8vIGNoYW5nZS4gVGhlIGNhY2hlZCBoYW5kbGUgaXMgdGhlbiBkZXRhY2hlZCwgYW5kIG11dGF0aW5nIGl0IGRyYXdzIG5vdGhpbmc6XG4gICAgLy8gdHJlYXQgYSBsYXllciB0aGF0IGlzIG5vIGxvbmdlciBpbiB0aGUgc2NlbmUgYXMgYWJzZW50IHNvIGl0IGdldHMgcmUtYWRkZWQuXG4gICAgaWYgKHRoaXMucG9pbnRzICYmICF2aWV3ZXIubGF5ZXJzLml0ZW1zLmluY2x1ZGVzKHRoaXMucG9pbnRzKSkge1xuICAgICAgdGhpcy5wb2ludHMgPSBudWxsO1xuICAgICAgdGhpcy5sYXllcktleSA9IG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hvd0ltYWdlID0gKCEhcmVmIHx8ICEhZGF0YXNldC52b2x1bWUpICYmIHZpZXcuc2hvd0ltYWdlICE9PSBmYWxzZTtcbiAgICAvLyBBIHNpemUvY29sb3VyL29wYWNpdHkvc2VsZWN0aW9uIGNoYW5nZSBpcyBESVNQTEFZLW9ubHk6IG11dGF0ZSB0aGUgbGF5ZXJcbiAgICAvLyByYXRoZXIgdGhhbiBkcm9wcGluZyBhbmQgcmUtYWRkaW5nIGl0LiBCb3RoIHNldHRlcnMgYnVtcCB0aGUgbGF5ZXInc1xuICAgIC8vIGRhdGFWZXJzaW9uLCB3aGljaCBpcyB3aGF0IG1ha2VzIG5hcGFyaS1qcyByZWJ1aWxkIHRoZSBpbnN0YW5jZSBidWZmZXIgYW5kXG4gICAgLy8gcmVkcmF3IOKAlCBhbmQgaXQgYXZvaWRzIHJlYnVpbGRpbmcgODRrIHBvc2l0aW9ucyB0byBjaGFuZ2Ugb25lIG51bWJlci5cbiAgICAvLyBUaGUgc2xpY2UgaXMgcGFydCBvZiB0aGUga2V5OiBhIHNjcnViIGNoYW5nZXMgV0hJQ0ggb2JzZXJ2YXRpb25zIGFyZSBkcmF3bixcbiAgICAvLyB3aGljaCBpcyBnZW9tZXRyeSwgbm90IGRpc3BsYXkuXG4gICAgY29uc3Qga2V5ID0gYCR7ZGF0YXNldC5pZH06JHtvYnMuY291bnR9OiR7c2xhYj8uc2xpY2UgPz8gJyd9YDtcbiAgICBpZiAodGhpcy5wb2ludHMgJiYga2V5ID09PSB0aGlzLmxheWVyS2V5KSB7XG4gICAgICB0aGlzLnBvaW50cy5zaXplID0gc2l6ZTtcbiAgICAgIHRoaXMucG9pbnRzLnZpc2libGUgPSB0aGlzLnBvaW50c1Zpc2libGUoKTtcbiAgICAgIHRoaXMucG9pbnRzLmZhY2VDb2xvciA9IGdhdGhlckNvbG9ycyhmYWNlQ29sb3IsIHNsYWI/LmluZGljZXMpO1xuICAgICAgdGhpcy5wb2ludHMuc3ltYm9scyA9IGdhdGhlclN5bWJvbHMoc3ltYm9scywgc2xhYj8uaW5kaWNlcyk7XG4gICAgICB0aGlzLmhpZGVGb3JlaWduSW1hZ2Uodmlld2VyLCBzaG93SW1hZ2UpO1xuICAgICAgdGhpcy5jdHgudG9vbHMucmVnaW9uT3ZlcmxheT8uc2V0UmVnaW9uc1Zpc2libGUodmlldy5zaG93QW5ub3RhdGlvbnMgIT09IGZhbHNlKTtcbiAgICAgIHZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucG9pbnRzKSB7XG4gICAgICB2aWV3ZXIubGF5ZXJzLnJlbW92ZSh0aGlzLnBvaW50cyk7XG4gICAgICB0aGlzLnBvaW50cyA9IG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZHJhd24gPSBzbGFiPy5pbmRpY2VzO1xuICAgIGNvbnN0IHBvc2l0aW9ucyA9IG9ic2VydmF0aW9uUG9zaXRpb25zKG9icywgZHJhd24pO1xuICAgIHRoaXMubGF5ZXJLZXkgPSBrZXk7XG4gICAgdGhpcy5kcmF3biA9IGRyYXduID8/IG51bGw7XG4gICAgdGhpcy5wb2ludHMgPSB2aWV3ZXIuYWRkUG9pbnRzKHBvc2l0aW9ucywge1xuICAgICAgbmFtZTogJ29ic2VydmF0aW9ucycsXG4gICAgICBzaXplLFxuICAgICAgZmFjZUNvbG9yOiBnYXRoZXJDb2xvcnMoZmFjZUNvbG9yLCBkcmF3biksXG4gICAgICAvLyBFYWNoIG9ic2VydmF0aW9uJ3MgZ2VuZSdzIGljb24gd2hpbGUgdGhleSBhcmUgY29sb3VyZWQgYnkgZ2VuZTsgdGhlIGxheWVyJ3MgZGlzYyBlbHNlLlxuICAgICAgc3ltYm9sczogZ2F0aGVyU3ltYm9scyhzeW1ib2xzLCBkcmF3biksXG4gICAgICAvLyBObyBib3JkZXI6IGF0IFZpc2l1bSBzcG90IGRlbnNpdHkgYW4gb3V0bGluZSBwZXIgbWFya2VyIHJlYWRzIGFzIG5vaXNlLFxuICAgICAgLy8gYW5kIGl0IGNvc3RzIGEgc2Vjb25kIGNvbG91ciBhcnJheS5cbiAgICAgIGJvcmRlcldpZHRoOiAwLFxuICAgICAgLy8gVGhlIGRhdGFzZXQncyBkYXRhLT53b3JsZCBhZmZpbmUuIFNwYXRpYWxEYXRhIHJlY29yZHMgb25lIHBlciBjb29yZGluYXRlXG4gICAgICAvLyBzeXN0ZW0gKFZpc2l1bSBzcG90IGNvb3JkcyBhcmUgaW4gdGhlIEZVTEwtcmVzb2x1dGlvbiBmcmFtZSB3aGlsZSB0aGVcbiAgICAgIC8vIHNlcnZlZCBpbWFnZSBtYXkgYmUgdGhlIGhpcmVzIGRvd25zY2FsZSksIHNvIHdpdGhvdXQgdGhpcyB0aGUgbWFya2Vyc1xuICAgICAgLy8gbGFuZCBpbiB0aGUgcmlnaHQgc2hhcGUgYXQgdGhlIHdyb25nIHNjYWxlLiBEZWZhdWx0cyB0byBpZGVudGl0eSB3aGVuXG4gICAgICAvLyB0aGUgY29vcmRpbmF0ZXMgYXJlIGFscmVhZHkgaW4gdGhlIGltYWdlJ3MgcGl4ZWwgc3BhY2UuXG4gICAgICBzY2FsZTogcmVmPy5zY2FsZSA/PyBbMSwgMV0sXG4gICAgICB0cmFuc2xhdGU6IHJlZj8udHJhbnNsYXRlID8/IFswLCAwXSxcbiAgICAgIHZpc2libGU6IHRoaXMucG9pbnRzVmlzaWJsZSgpLFxuICAgICAgLy8gTmV2ZXIgdW5kZXIgYSBjb3VwbGUgb2Ygc2NyZWVuIHBpeGVscywgc28gdGhlIG9ic2VydmF0aW9ucyBzdGF5IHZpc2libGUgem9vbWVkIG91dC5cbiAgICAgIG1pblNjcmVlblNpemU6IFNQQVRJQUxfTUFSS0VSX01JTl9TQ1JFRU5fUFgsXG4gICAgfSk7XG4gICAgLy8gT3V0bGluZXMsIGRlbnNpdHkgYW5kIHRyYW5zY3JpcHRzIGdvIGJhY2sgb3ZlciB0aGUgbWFya2VycyBqdXN0IGFkZGVkLlxuICAgIHRoaXMuc2Vzc2lvbi50aWxlcz8uYWZ0ZXJPYnNlcnZhdGlvbnMoKTtcbiAgICB0aGlzLmZyYW1lT25jZSh2aWV3ZXIsIGRhdGFzZXQuaWQsIHBvc2l0aW9ucywgISFyZWYpO1xuICAgIHRoaXMuaGlkZUZvcmVpZ25JbWFnZSh2aWV3ZXIsIHNob3dJbWFnZSk7XG4gICAgdGhpcy5jdHgudG9vbHMucmVnaW9uT3ZlcmxheT8uc2V0UmVnaW9uc1Zpc2libGUodmlldy5zaG93QW5ub3RhdGlvbnMgIT09IGZhbHNlKTtcbiAgICB0aGlzLnNldFJlZ2lvbkdyaWRGb3IoZGF0YXNldCwgcG9zaXRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUZWxsIHRoZSByZWdpb24gb3ZlcmxheSBob3cgZmluZWx5IGEgZHJhd24gdmVydGV4IG1heSBiZSBwbGFjZWQuXG4gICAqXG4gICAqIFJlZ2lvbiBnZW9tZXRyeSBpcyBzdG9yZWQgaW4gd2hvbGUgd29ybGQgdW5pdHMsIHdoaWNoIGlzIHJpZ2h0IHdoZW4gdGhlIHdvcmxkIElTXG4gICAqIHBpeGVscyDigJQgYSByZWdpb24gc2hvdWxkIGFsaWduIHRvIHRoZW0uIEl0IGlzIHdyb25nIGZvciBhIGRhdGFzZXQgdGhhdCByZWdpc3RlcnMgb250b1xuICAgKiBubyBpbWFnZTogc2VxRklTSCdzIG9ic2VydmF0aW9ucyBzcGFuIGFib3V0IDUgeCA3IHVuaXRzIGluIHRvdGFsLCBzbyB3aG9sZS11bml0XG4gICAqIHZlcnRpY2VzIGxlYXZlIHJvdWdobHkgc2l4IGJ5IGVpZ2h0IHBsYWNlYWJsZSBwb3NpdGlvbnMgYWNyb3NzIHRoZSBlbnRpcmUgc2FtcGxlIGFuZFxuICAgKiBhbiBST0kgY2Fubm90IGJlIGRyYXduIGF0IGFueSB6b29tLiBOb3RoaW5nIGVycm9yczsgdGhlIHRvb2wganVzdCBjYW5ub3QgZXhwcmVzcyB0aGVcbiAgICogc2hhcGUuXG4gICAqXG4gICAqIEtleWVkIG9uIHdoZXRoZXIgdGhlIGRhdGFzZXQgYnJpbmdzIFBJWEVMUyByYXRoZXIgdGhhbiBvbiB0aGUgZXh0ZW50LCBiZWNhdXNlIHRoZVxuICAgKiBleHRlbnQgY2Fubm90IHRlbGwgdGhlIHR3byBhcGFydCDigJQgMiwwMDAgdW5pdHMgaXMgYSBzbWFsbCBzbGlkZSBvciBhIGxhcmdlIHNlY3Rpb25cbiAgICogZGVwZW5kaW5nIG9ubHkgb24gd2hhdCB0aGUgdW5pdHMgYXJlLCBhbmQgb25seSB0aGUgZGF0YXNldCBrbm93cy5cbiAgICovXG4gIHByaXZhdGUgc2V0UmVnaW9uR3JpZEZvcihkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCwgcG9zaXRpb25zOiBGbG9hdDMyQXJyYXkpOiB2b2lkIHtcbiAgICBjb25zdCBvdmVybGF5ID0gdGhpcy5jdHgudG9vbHMucmVnaW9uT3ZlcmxheTtcbiAgICBpZiAoIW92ZXJsYXk/LnNldFdvcmxkUXVhbnR1bSkgcmV0dXJuO1xuICAgIGlmIChkYXRhc2V0LmltYWdlUmVmIHx8IGRhdGFzZXQudm9sdW1lKSB7XG4gICAgICBvdmVybGF5LnNldFdvcmxkUXVhbnR1bShQSVhFTF9XT1JMRF9RVUFOVFVNKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IG1pblggPSBJbmZpbml0eTtcbiAgICBsZXQgbWF4WCA9IC1JbmZpbml0eTtcbiAgICBsZXQgbWluWSA9IEluZmluaXR5O1xuICAgIGxldCBtYXhZID0gLUluZmluaXR5O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICBjb25zdCB4ID0gcG9zaXRpb25zW2ldO1xuICAgICAgY29uc3QgeSA9IHBvc2l0aW9uc1tpICsgMV07XG4gICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh4KSB8fCAhTnVtYmVyLmlzRmluaXRlKHkpKSBjb250aW51ZTtcbiAgICAgIGlmICh4IDwgbWluWCkgbWluWCA9IHg7XG4gICAgICBpZiAoeCA+IG1heFgpIG1heFggPSB4O1xuICAgICAgaWYgKHkgPCBtaW5ZKSBtaW5ZID0geTtcbiAgICAgIGlmICh5ID4gbWF4WSkgbWF4WSA9IHk7XG4gICAgfVxuICAgIG92ZXJsYXkuc2V0V29ybGRRdWFudHVtKHdvcmxkUXVhbnR1bUZvckV4dGVudChtYXhYIC0gbWluWCwgbWF4WSAtIG1pblkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlIHRoZSBpbWFnZSBsYXllciBmb3IgYSBkYXRhc2V0IHRoYXQgYnJpbmdzIG5vIGltYWdlIG9mIGl0cyBvd24uXG4gICAqXG4gICAqIFRoZSBob3N0J3Mgdmlld2VyIGtlZXBzIHdoYXRldmVyIGltYWdlIHdhcyBsYXN0IGxvYWRlZCwgYW5kIGZvciBhIGRhdGFzZXQgdGhhdFxuICAgKiByZWdpc3RlcnMgb250byBub25lIHRoYXQgcGljdHVyZSBiZWxvbmdzIHRvIHNvbWV0aGluZyBlbHNlIGVudGlyZWx5IOKAlCB0aGUgZXhhbXBsZSdzXG4gICAqIGRlZmF1bHQgc2xpZGUsIHNheS4gSXQgaXMgbm90IG1lcmVseSBpcnJlbGV2YW50OiB0aGUgdHdvIGxpdmUgaW4gZGlmZmVyZW50IGNvb3JkaW5hdGVcbiAgICogc3BhY2VzIChpbWFnZSBwaXhlbHMgYWdhaW5zdCB0aGUgZW1iZWRkaW5nJ3Mgb3duIHVuaXRzKSwgc28gdGhlIGxlZnRvdmVyIGlzIG1hZ25pZmllZFxuICAgKiByb3VnaGx5IGEgaHVuZHJlZGZvbGQuIEF0IHRoZSBmaXR0ZWQgem9vbSB0aGUgY2FtZXJhIHNpdHMgaW5zaWRlIGl0cyBjb3JuZXIsIHdoZXJlIGl0XG4gICAqIHJlYWRzIGFzIGJsYW5rIGJhY2tncm91bmQsIGFuZCBpdCBhcHBlYXJzIG9ubHkgb25jZSB5b3Ugem9vbSBvdXQgZmFyIGVub3VnaCB0byBmaW5kXG4gICAqIGl0IOKAlCB3aGljaCBpcyBleGFjdGx5IGhvdyBpdCBnZXRzIG5vdGljZWQuXG4gICAqXG4gICAqIEhpZGRlbiByYXRoZXIgdGhhbiByZW1vdmVkLCBhbmQgaGlkZGVuIEhFUkUgcmF0aGVyIHRoYW4gYnkgY2xlYXJpbmcgdGhlIGhvc3QncyBpbWFnZVxuICAgKiBzdGF0ZTogdGhhdCBzdGF0ZSBkcml2ZXMgdGhlIHdob2xlIHJlbmRlciBwaXBlbGluZSwgaW5jbHVkaW5nIGEgUGxvdGx5IGJhY2tlbmQgd2hvc2VcbiAgICogZmllbGRzIGFyZSBkZWNsYXJlZCB3aXRoIGRlZmluaXRlLWFzc2lnbm1lbnQgYXNzZXJ0aW9ucywgc28gZW1wdHlpbmcgaXQgdGhyb3dzIGZyb21cbiAgICogd2hpY2hldmVyIGZpZWxkIHRoZSBuZXh0IHBhdGggaGFwcGVucyB0byByZWFkLiBUaGlzIHRvdWNoZXMgb25lIGxheWVyJ3MgdmlzaWJpbGl0eVxuICAgKiBhbmQgbm90aGluZyBlbHNlLlxuICAgKi9cbiAgaGlkZUZvcmVpZ25JbWFnZSh2aWV3ZXI6IFBpY2s8Vmlld2VyLCAnbGF5ZXJzJyB8ICdyZXF1ZXN0UmVuZGVyJz4sIGRhdGFzZXRIYXNQaXhlbHM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvLyBObyBpbWFnZSBvZiBpdHMgb3duIOKGkiBub3RoaW5nIGZvciBhbiBvdmVydmlldyB0byBzaG93IGVpdGhlci5cbiAgICB0aGlzLmltYWdlLnNob3dOYXZpZ2F0b3JGb3IoZGF0YXNldEhhc1BpeGVscyk7XG4gICAgY29uc3QgdGlsZXMgPSB0aGlzLnNlc3Npb24udGlsZXM7XG4gICAgZm9yIChjb25zdCBsYXllciBvZiB2aWV3ZXIubGF5ZXJzLml0ZW1zKSB7XG4gICAgICBpZiAobGF5ZXIua2luZCAhPT0gJ2ltYWdlJykgY29udGludWU7XG4gICAgICAvLyBUaGUgdHJhbnNjcmlwdC1kZW5zaXR5IHJhc3RlciBhbmQgdGhlIGdlbmUgbWFwIGFyZSBpbWFnZSBsYXllcnMgdG9vLCBidXQgdGhleSBhcmVcbiAgICAgIC8vIGRhdGEsIG5vdCB0aGUgdGlzc3VlOiB0aGUgSW1hZ2VzIHRvZ2dsZSBtdXN0IG5vdCB0YWtlIHRoZW0gZG93biB3aXRoIHRoZSBzbGlkZS5cbiAgICAgIGlmICh0aWxlcz8ub3ducyhsYXllcikgfHwgbGF5ZXIgPT09IHRoaXMuZ2VuZU1hcExheWVyKSBjb250aW51ZTtcbiAgICAgIC8vIFJlLXNob3duIHdoZW4gYSBkYXRhc2V0IHRoYXQgb3ducyBhbiBpbWFnZSBjb21lcyBiYWNrLCBzbyBzd2l0Y2hpbmcgYmV0d2VlblxuICAgICAgLy8gZGF0YXNldHMgZG9lcyBub3QgbGVhdmUgdGhlIHRpc3N1ZSBwZXJtYW5lbnRseSBoaWRkZW4uXG4gICAgICBsYXllci52aXNpYmxlID0gZGF0YXNldEhhc1BpeGVscztcbiAgICB9XG4gICAgLy8gU2hvd2luZyB0aGUgdGlzc3VlIG11c3Qgbm90IHNob3cgaXRzIGNoYW5uZWxzIHRoZSB1c2VyIG9yIHRoZSBkZWZhdWx0cyBzd2l0Y2hlZCBvZmYgKGFcbiAgICAvLyAyMi1jaGFubmVsIHBsYXRlIHN0YXJ0cyB3aXRoIGZvdXIpOiB0aGUgY2hhbm5lbCBzdGF0ZXMgZGVjaWRlIHdoaWNoIG9mIGl0cyBsYXllcnMgZHJhdy5cbiAgICBpZiAoZGF0YXNldEhhc1BpeGVscykgdGhpcy5pbWFnZS5yZWFwcGx5RGlzcGxheVN0YXRlKCk7XG4gICAgdmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGcmFtZSB0aGUgY2FtZXJhIG9uIHRoZSBvYnNlcnZhdGlvbnMsIGZvciBhIGRhdGFzZXQgdGhhdCBicmluZ3Mgbm8gaW1hZ2UuXG4gICAqXG4gICAqIFRoZSAyRCBjYW1lcmEgaXMgbm9ybWFsbHkgZml0dGVkIHRvIHRoZSBJTUFHRSwgYmVjYXVzZSB0aGUgb2JzZXJ2YXRpb25zIGFyZSBpbiB0aGF0XG4gICAqIGltYWdlJ3MgcGl4ZWwgc3BhY2UgYW5kIGZyYW1pbmcgdGhlIGltYWdlIGZyYW1lcyB0aGVtIHRvby4gQSBkYXRhc2V0IHdpdGggbm9cbiAgICogcmVmZXJlbmNlIGltYWdlIGhhcyBjb29yZGluYXRlcyBpbiBpdHMgb3duIHVuaXRzIGluc3RlYWQg4oCUIHNlcUZJU0gncyBzcGFuIGFib3V0XG4gICAqIDV4NyDigJQgc28gdGhlIGltYWdlIGZyYW1pbmcgbGVmdCBvdmVyIGZyb20gd2hhdGV2ZXIgd2FzIG9uIHNjcmVlbiBiZWZvcmUgcHV0cyB0aGVcbiAgICogd2hvbGUgY2xvdWQgb2Zmc2NyZWVuOiBtZWFzdXJlZCBhdCA5LjcgeCAxMy40IFBJWEVMUywgY2VudHJlZCAyNTZweCBmcm9tIHdoZXJlIHRoZVxuICAgKiBjYW1lcmEgd2FzIGxvb2tpbmcuIFRoZSBwb2ludHMgYXJlIGFsbCB0aGVyZSBhbmQgZHJhd247IHRoZXkgYXJlIGEgc3BlY2suIFdoaWNoXG4gICAqIGxvb2tzIGV4YWN0bHkgbGlrZSB0aGUgZGF0YXNldCBoYXZpbmcgZmFpbGVkIHRvIGxvYWQuXG4gICAqXG4gICAqIE9uY2UgcGVyIGRhdGFzZXQsIGFzIG5hcGFyaS1qcydzIGBmaXQzZDogJ29uY2UnYCBkb2VzIGZvciB0aGUgY2xvdWQ6IHJlLWNvbG91cmluZyxcbiAgICogc2xpY2luZyBvciBwaWNraW5nIGEgZ2VuZSByZS1hZGRzIHRoaXMgbGF5ZXIsIGFuZCByZS1mcmFtaW5nIG9uIHRob3NlIHdvdWxkIG1vdmVcbiAgICogdGhlIGNhbWVyYSB1bmRlciB0aGUgdXNlciDigJQgdGhlIGNhbWVyYSB0b29scyBhbmQgdGhlIGNhbnZhcyBkcmFnIGFyZSBtZWFudCB0byBiZVxuICAgKiB0aGUgb25seSB0aGluZ3MgdGhhdCBkby5cbiAgICovXG4gIHByaXZhdGUgZnJhbWVPbmNlKHZpZXdlcjogVmlld2VyLCBkYXRhc2V0SWQ6IHN0cmluZywgcG9zaXRpb25zOiBGbG9hdDMyQXJyYXksIHJlZ2lzdGVyZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvLyBHYXRlZCBvbiB3aGV0aGVyIFRISVMgZGF0YXNldCByZWdpc3RlcnMgb250byBhbiBpbWFnZSwgbm90IG9uIHRoZSBpbWFnZSBzaXplOiB0aGF0IGtlZXBzXG4gICAgLy8gdGhlIGxhc3QgcGxvdHRlZCBpbWFnZSdzIGRpbWVuc2lvbnMgYWZ0ZXIgdGhlIGhvc3QgY2xlYXJzIGl0LCBzbyBhIHN0YWxlIDUxMngzODMgcmVhZCBhc1xuICAgIC8vIFwidGhlcmUgaXMgYW4gaW1hZ2VcIiBhbmQgc2tpcHBlZCB0aGUgZnJhbWluZyBlbnRpcmVseS5cbiAgICBpZiAocmVnaXN0ZXJlZCkgcmV0dXJuO1xuICAgIC8vIE9uY2UgcGVyIGRhdGFzZXQgKHNlZSBhYm92ZSkuXG4gICAgaWYgKHRoaXMuZnJhbWVkID09PSBkYXRhc2V0SWQpIHJldHVybjtcblxuICAgIGNvbnN0IHsgY2FudmFzIH0gPSB0aGlzLmN0eDtcbiAgICBjb25zdCBmaXQgPSBmcmFtZVBvc2l0aW9ucyhwb3NpdGlvbnMsIGNhbnZhcy5jbGllbnRXaWR0aCA/PyAwLCBjYW52YXMuY2xpZW50SGVpZ2h0ID8/IDApO1xuICAgIC8vIE51bGwgbWVhbnMgdGhlcmUgaXMgbm90aGluZyB0byBmcmFtZSBvbjsgbGVhdmUgdGhlIGNhbWVyYSB3aGVyZSBpdCBpcyByYXRoZXJcbiAgICAvLyB0aGFuIG1vdmluZyB0aGUgdmlldyBmb3IgYSBkYXRhc2V0IHdlIGNhbm5vdCBmaXQuXG4gICAgaWYgKCFmaXQpIHJldHVybjtcbiAgICB2aWV3ZXIuY2FtZXJhLnNldChmaXQuY2VudGVyLCBmaXQuem9vbSA/PyB2aWV3ZXIuY2FtZXJhLnpvb20pO1xuICAgIHRoaXMuZnJhbWVkID0gZGF0YXNldElkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSAqKmdlbmUgbWFwKio6IHRoZSBhY3RpdmUgZ2VuZSdzIGV4cHJlc3Npb24gYXMgYSBjb250aW51b3VzIGZpZWxkIGRyYXduIHVuZGVyXG4gICAqIHRoZSBjZWxscy5cbiAgICpcbiAgICogQSBzY2F0dGVyIGNvbG91cmVkIGJ5IGEgZ2VuZSBzYXlzIHdoaWNoIGNlbGxzIGV4cHJlc3MgaXQ7IGl0IGNhbm5vdCBzYXkgd2hlcmUsXG4gICAqIGJlY2F1c2UgdGhlIGV5ZSB3aWxsIG5vdCBpbnRlZ3JhdGUgdGhvdXNhbmRzIG9mIGRvdHMgaW50byBhIHRlcnJpdG9yeS4gVGhlIGZpZWxkXG4gICAqIGlzIGEga2VybmVsLXdlaWdodGVkIE1FQU4gcGVyIGNlbGwgKHNlZSBgc3BhdGlhbC1leHByZXNzaW9uLnRzYCksIHNvIGEgZGVuc2VcbiAgICogcmVnaW9uIGRvZXMgbm90IGdsb3cgbWVyZWx5IGZvciBiZWluZyBkZW5zZSwgYW5kIGl0IGlzIHRyYW5zcGFyZW50IHdoZXJldmVyIG5vXG4gICAqIGNlbGwgd2FzIG1lYXN1cmVkIOKAlCBhbiB1bnNhbXBsZWQgZ2FwIG11c3Qgbm90IHJlYWQgYXMgXCJub3QgZXhwcmVzc2VkXCIuXG4gICAqXG4gICAqIEl0IHNoYXJlcyB0aGUgcG9pbnRzJyBMVVQsIHBlcmNlbnRpbGUgd2luZG93IGFuZCBsb2cgZmxhZywgc28gdGhlIGxheWVyIHVuZGVyXG4gICAqIHRoZSBjZWxscyBhbmQgdGhlIGNlbGxzIHRoZW1zZWx2ZXMgY2Fubm90IGRpc2FncmVlIGFib3V0IHdoYXQgYSBjb2xvdXIgbWVhbnMuXG4gICAqXG4gICAqIEVzdGltYXRlZCBvbiB0aGUgRElTUExBWUVEIGltYWdlJ3MgcGl4ZWwgZ3JpZCwgY29hcnNlbmVkIHNvIHRoZSBsb25nIHNpZGUgaXMgYXRcbiAgICogbW9zdCBgR0VORV9NQVBfTUFYX1NJREVgOiBhIHNtb290aCBmaWVsZCBnYWlucyBub3RoaW5nIGZyb20gYSBzbGlkZSdzIGZ1bGxcbiAgICogcmVzb2x1dGlvbi4gRm9yIGEgdm9sdW1lLWJhY2tlZCBkYXRhc2V0IHRoYXQgZ3JpZCBpcyB0aGUgY3VycmVudCBzbGljZSwgYW5kIG9ubHlcbiAgICogdGhhdCBwbGFuZSdzIG9ic2VydmF0aW9ucyBhcmUgaW5jbHVkZWQg4oCUIHRoZSBzYW1lIHJ1bGUgdGhlIG1hcmtlcnMgZm9sbG93LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVHZW5lTWFwKFxuICAgIHZpZXdlcjogVmlld2VyLFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayxcbiAgICBzbGFiOiBTbGFiIHwgbnVsbCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZ2VuZSA9IHZpZXcuZ2VuZU1hcCAmJiB2aWV3LmNvbG9yQnk/LmtpbmQgPT09ICdmZWF0dXJlJyA/IHZpZXcuY29sb3JCeS5uYW1lIDogbnVsbDtcbiAgICBjb25zdCBwb3J0ID0gdGhpcy5zZXNzaW9uLnBvcnQ7XG4gICAgY29uc3QgY2FjaGUgPSB0aGlzLnNlc3Npb24uZ2VuZU1hcDtcbiAgICBjb25zdCBzbW9vdGhpbmcgPSB2aWV3LmdlbmVNYXBTbW9vdGhpbmcgPiAwID8gdmlldy5nZW5lTWFwU21vb3RoaW5nIDogMTtcbiAgICBjb25zdCBjbGlwID0gdmlldy5wZXJjZW50aWxlQ2xpcCA/PyBbMC4wMSwgMC45OV07XG5cbiAgICAvLyBUd28gY2xvY2tzOiB0aGUgRklFTEQgZGVwZW5kcyBvbiB0aGUgZ2VuZSwgdGhlIHBsYW5lIGFuZCB0aGUgYmFuZHdpZHRoLCB3aGlsZVxuICAgIC8vIHRoZSBjb2xvdXJzIGRlcGVuZCBvbiB0aGUgd2luZG93LCB0aGUgbG9nIGZsYWcgYW5kIHRoZSBvcGFjaXR5LiBSZWNvbG91cmluZyBhXG4gICAgLy8gY2FjaGVkIGZpZWxkIGlzIGEgZnJhY3Rpb24gb2YgZXN0aW1hdGluZyBvbmUuXG4gICAgY29uc3QgZmllbGRLZXkgPSBnZW5lXG4gICAgICA/IFtkYXRhc2V0LmlkLCBnZW5lLCBzbGFiPy5zbGljZSA/PyAnJywgc21vb3RoaW5nLCB0aGlzLnNlc3Npb24uc2VsZWN0aW9uUmV2KHNlbGVjdGlvbildLmpvaW4oJ3wnKVxuICAgICAgOiBudWxsO1xuICAgIGNvbnN0IGtleSA9IGZpZWxkS2V5XG4gICAgICA/IFtcbiAgICAgICAgICBmaWVsZEtleSxcbiAgICAgICAgICBjbGlwLmpvaW4oJywnKSxcbiAgICAgICAgICB2aWV3LmxvZ1NjYWxlID8gJ2xvZycgOiAnbGluJyxcbiAgICAgICAgICB2aWV3LmdlbmVNYXBPcGFjaXR5LFxuICAgICAgICAgIHRoaXMuY3R4LmRpc3BsYXkuY29udGludW91c0NvbG9ybWFwS2V5KHZpZXcpLFxuICAgICAgICBdLmpvaW4oJ3wnKVxuICAgICAgOiBudWxsO1xuICAgIC8vIEEgc3RpdGNoZWQgc2xpY2UgcmUtcmVuZGVyIGNsZWFycyB0aGUgd2hvbGUgbGF5ZXIgbGlzdCwgdGhlIG1hcCB3aXRoIGl0LCBhbmQgdGhlIGtleSBvZiBhXG4gICAgLy8gcmVnaXN0ZXJlZCBpbWFnZSdzIG1hcCBkb2VzIG5vdCBuYW1lIHRoZSBzbGljZTogYSBtYXAgbm8gbG9uZ2VyIGluIHRoZSBzY2VuZSBpcyBhYnNlbnQsXG4gICAgLy8gYXMgdGhlIG1hcmtlcnMnIGlzIChzZWUgYHJlYnVpbGRgKSwgc28gaXQgaXMgZHJhd24gYWdhaW4gZnJvbSB0aGUgY2FjaGVkIGZpZWxkLlxuICAgIGlmICh0aGlzLmdlbmVNYXBMYXllciAmJiAhdmlld2VyLmxheWVycy5pdGVtcy5pbmNsdWRlcyh0aGlzLmdlbmVNYXBMYXllcikpIHtcbiAgICAgIHRoaXMuZ2VuZU1hcExheWVyID0gbnVsbDtcbiAgICAgIHRoaXMuZ2VuZU1hcEtleSA9IG51bGw7XG4gICAgfVxuICAgIGlmIChrZXkgPT09IHRoaXMuZ2VuZU1hcEtleSkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuZ2VuZU1hcExheWVyKSB7XG4gICAgICB2aWV3ZXIubGF5ZXJzLnJlbW92ZSh0aGlzLmdlbmVNYXBMYXllcik7XG4gICAgICB0aGlzLmdlbmVNYXBMYXllciA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuZ2VuZU1hcEtleSA9IGtleTtcbiAgICBpZiAoIWtleSB8fCAhZ2VuZSB8fCAhcG9ydCkge1xuICAgICAgY2FjaGUuZmllbGQgPSBudWxsO1xuICAgICAgY2FjaGUua2V5ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUaGUgcmFzdGVyIGNvdmVycyB0aGUgZGlzcGxheWVkIGltYWdlOyB3aXRob3V0IG9uZSB0aGVyZSBpcyBub3RoaW5nIHRvXG4gICAgLy8gb3ZlcmxheSBhbmQgdGhlIGNsb3VkIGlzIHRoZSAzRCBtb2RlJ3MgYnVzaW5lc3MsIG5vdCB0aGlzIG9uZSdzLiBHYXRlZCBvbiB0aGVcbiAgICAvLyBEQVRBU0VUIGJyaW5naW5nIHBpeGVscywgbm90IG9uIHRoZSBpbWFnZSBzaXplOiB0aGF0IGtlZXBzIHRoZSBsYXN0IHBsb3R0ZWQgaW1hZ2Unc1xuICAgIC8vIHNpemUgYWZ0ZXIgdGhlIGhvc3QgY2xlYXJzIGl0LCB3aGljaCB3b3VsZCBzaXplIHRoZSBtYXAgb3ZlciB0aGUgd3JvbmcgZXh0ZW50LlxuICAgIGlmICghc2xhYiAmJiAhZGF0YXNldC5pbWFnZVJlZikgcmV0dXJuO1xuICAgIGNvbnN0IHNpemUgPSB0aGlzLmN0eC5pbWFnZVNpemUoKTtcbiAgICBjb25zdCBpbWFnZVcgPSBzbGFiPy5ncmlkID8gc2xhYi5ncmlkLndpZHRoIDogc2l6ZS53aWR0aDtcbiAgICBjb25zdCBpbWFnZUggPSBzbGFiPy5ncmlkID8gc2xhYi5ncmlkLmhlaWdodCA6IHNpemUuaGVpZ2h0O1xuICAgIGlmICghaW1hZ2VXIHx8ICFpbWFnZUgpIHJldHVybjtcbiAgICBjb25zdCBzdGVwID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKE1hdGgubWF4KGltYWdlVywgaW1hZ2VIKSAvIEdFTkVfTUFQX01BWF9TSURFKSk7XG5cbiAgICBpZiAoZmllbGRLZXkgIT09IGNhY2hlLmtleSkge1xuICAgICAgY29uc3QgbG9hZCA9IHRoaXMuZ2VuZU1hcExvYWRzLm5leHQoKTtcbiAgICAgIGxldCB2YWx1ZXM6IEZsb2F0MzJBcnJheTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbHVlcyA9IGF3YWl0IHBvcnQuZ2V0RmVhdHVyZVZlY3RvcihnZW5lKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLndhcm4oYFtuYXBhcmktanNdIGdlbmUgbWFwOiBcIiR7Z2VuZX1cIiB1bmF2YWlsYWJsZWAsIGVycik7XG4gICAgICAgIHRoaXMuZ2VuZU1hcEtleSA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghbG9hZCgpIHx8IHRoaXMuZ2VuZU1hcEtleSAhPT0ga2V5KSByZXR1cm47XG4gICAgICBjb25zdCBpblNlbGVjdGlvbiA9IHNlbGVjdGlvbi5jb3VudCA+IDAgPyBtYXNrVG9JbmRpY2VzKHNlbGVjdGlvbi5tYXNrKSA6IHVuZGVmaW5lZDtcbiAgICAgIGxldCBlc3RpbWF0ZWQ6IEV4cHJlc3Npb25GaWVsZCB8IG51bGw7XG4gICAgICB0cnkge1xuICAgICAgICBlc3RpbWF0ZWQgPSBhd2FpdCBjb21wdXRlRXhwcmVzc2lvbkZpZWxkQXN5bmMoXG4gICAgICAgICAgZGF0YXNldC5vYnNlcnZhdGlvbnMsXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVmOiBzbGFiPy5yZWYgPz8gZGF0YXNldC5pbWFnZVJlZixcbiAgICAgICAgICAgIHdpZHRoOiBNYXRoLmNlaWwoaW1hZ2VXIC8gc3RlcCksXG4gICAgICAgICAgICBoZWlnaHQ6IE1hdGguY2VpbChpbWFnZUggLyBzdGVwKSxcbiAgICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgICBzaWdtYTogR0VORV9NQVBfU0lHTUEgKiBzbW9vdGhpbmcsXG4gICAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgICAvLyBBIHBsYW5lIHdpbnMgb3ZlciBhIHNlbGVjdGlvbjogdGhlIDJEIHZpZXcgaXMgc2hvd2luZyBvbmUgc2VjdGlvbiwgc28gYVxuICAgICAgICAgICAgLy8gZmllbGQgc3Bhbm5pbmcgdGhlIHNwZWNpbWVuJ3MgZGVwdGggd291bGQgbm90IGJlIHRoZSB0aGluZyBvbiBzY3JlZW4uXG4gICAgICAgICAgICBpbmRpY2VzOiBzbGFiPy5pbmRpY2VzID8/IGluU2VsZWN0aW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBzaWduYWw6IGxvYWQuc2lnbmFsIH0sXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGlzQWJvcnRFcnJvcihlcnIpKSByZXR1cm47IC8vIHN1cGVyc2VkZWQgYnkgYSBuZXdlciBtYXAsIG9yIHRoZSBzY2VuZSB3ZW50IGF3YXlcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgaWYgKCFsb2FkKCkgfHwgdGhpcy5nZW5lTWFwS2V5ICE9PSBrZXkpIHJldHVybjtcbiAgICAgIGNhY2hlLmZpZWxkID0gZXN0aW1hdGVkO1xuICAgICAgY2FjaGUua2V5ID0gZmllbGRLZXk7XG4gICAgfVxuICAgIGNvbnN0IGZpZWxkID0gY2FjaGUuZmllbGQ7XG4gICAgaWYgKCFmaWVsZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgbHV0ID0gdGhpcy5jdHguZGlzcGxheS5zcGF0aWFsTHV0KHZpZXcpO1xuICAgIC8vIE92ZXIgdGhlIG1lYXN1cmVkIHBpeGVscyBvbmx5OiB1bm1lYXN1cmVkIG9uZXMgYXJlIDAgYW5kIHdvdWxkIGRyYWcgdGhlIGxvdyBlbmQgZG93bi5cbiAgICBjb25zdCBbbG8sIGhpXSA9IGZpZWxkQ29udHJhc3RXaW5kb3coZmllbGQsIGNsaXBbMF0sIGNsaXBbMV0pO1xuICAgIGNvbnN0IHJnYmEgPSBjb2xvckV4cHJlc3Npb25GaWVsZChmaWVsZCwgbHV0LCBbbG8sIGhpXSwge1xuICAgICAgbG9nOiB2aWV3LmxvZ1NjYWxlLFxuICAgICAgLy8gVGhlIE1BUCdzIG93biBvcGFjaXR5OiByZWFkaW5nIGEgZmllbGQgdW5kZXIgdGhlIGNlbGxzIG1lYW5zIHR1cm5pbmcgdGhlXG4gICAgICAvLyBjZWxscyBkb3duLCB3aGljaCBtdXN0IG5vdCB0YWtlIHRoZSBmaWVsZCB3aXRoIHRoZW0uXG4gICAgICBvcGFjaXR5OiB2aWV3LmdlbmVNYXBPcGFjaXR5LFxuICAgIH0pO1xuICAgIHRoaXMuZ2VuZU1hcExheWVyID0gdmlld2VyLmFkZEltYWdlKFxuICAgICAgeyBraW5kOiAndHlwZWQnLCB3aWR0aDogZmllbGQud2lkdGgsIGhlaWdodDogZmllbGQuaGVpZ2h0LCBjaGFubmVsczogNCwgZHR5cGU6ICd1aW50OCcsIGRhdGE6IHJnYmEgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogYGdlbmUgbWFwIMK3ICR7Z2VuZX1gLFxuICAgICAgICBzY2FsZTogW3N0ZXAsIHN0ZXBdLFxuICAgICAgICB0cmFuc2xhdGU6IFswLCAwXSxcbiAgICAgICAgYmxlbmRpbmc6ICd0cmFuc2x1Y2VudCcsXG4gICAgICB9LFxuICAgICk7XG4gICAgLy8gYGFkZEltYWdlYCBhcHBlbmRzLCBzbyB0aGUgbWFwIGp1c3QgbGFuZGVkIG92ZXIgdGhlIGNlbGxzIChkcmF3biBieSB0aGlzIHJlYnVpbGQnc1xuICAgIC8vIHByZXZpb3VzIHBhc3MsIG9yIGJ5IGEgbmV3ZXIgcmVidWlsZCB3aGlsZSB0aGUgZmllbGQgd2FzIGNvbXB1dGluZyk6IG1vdmUgaXQgdG8ganVzdCB1bmRlclxuICAgIC8vIHRoZW0uIEEgbW92ZSBrZWVwcyB0aGUgbWFya2VycycgR1BVIGJ1ZmZlcnMsIHdoZXJlIGRyb3BwaW5nIGFuZCByZS1hZGRpbmcgdGhlIG1hcmtlcnNcbiAgICAvLyByZS11cGxvYWRlZCBldmVyeSBvbmUgb2YgdGhlbSAoTkFQQVJJLUJPVU5EQVJZLTExKS4gV2l0aG91dCBtYXJrZXJzIG9uIHNjcmVlbiB0aGVyZSBpc1xuICAgIC8vIG5vdGhpbmcgdG8gZ28gdW5kZXI7IHRoZSByZWJ1aWxkIGFkZHMgdGhlbSBvdmVyIHRoZSBtYXAuXG4gICAgY29uc3QgdW5kZXIgPSB0aGlzLnBvaW50cyA/IHZpZXdlci5sYXllcnMuaXRlbXMuaW5kZXhPZih0aGlzLnBvaW50cykgOiAtMTtcbiAgICBpZiAodW5kZXIgPj0gMCkgdmlld2VyLmxheWVycy5tb3ZlKHRoaXMuZ2VuZU1hcExheWVyLCB1bmRlcik7XG4gICAgdmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXItb2JzZXJ2YXRpb24gY29sb3VycyBmb3IgdGhlIGN1cnJlbnQgdmlldyBzdGF0ZSwgb3IgYSBzaW5nbGUgZmxhdCBjb2xvdXIgd2hlbiBub3RoaW5nIGlzXG4gICAqIHNlbGVjdGVkIHRvIGNvbG91ciBieS4gQ2F0ZWdvcmljYWwgY29sdW1ucyB1c2UgdGhlIGNvbHVtbidzIG93biBwYWxldHRlOyBjb250aW51b3VzIGNvbHVtbnNcbiAgICogYW5kIGdlbmUgdmVjdG9ycyBnbyB0aHJvdWdoIHRoZSBhY3RpdmUgY29sb3JtYXAgd2l0aCBhIHBlcmNlbnRpbGUtY2xpcHBlZCB3aW5kb3cuXG4gICAqL1xuICAvKiogVGhlIG9ic2VydmF0aW9ucyB0aGUgdmlldydzIGdlbmUgZmlsdGVyIGtlZXBzICgxID0gZHJhd24pLCBvciBudWxsIHdoZW4gaXQgaGFzIG5vbmUuXG4gICAqICBSZWplY3RzIHdoZW4gYW4gZXhwcmVzc2lvbiByZWFkIGZhaWxzLiAqL1xuICBwcml2YXRlIGZpbHRlck1hc2soZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUpOiBQcm9taXNlPFVpbnQ4QXJyYXkgfCBudWxsPiB7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc2Vzc2lvbi5wb3J0O1xuICAgIGlmICghcG9ydCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgICByZXR1cm4gb2JzZXJ2YXRpb25HZW5lTWFzayh2aWV3LCBkYXRhc2V0Lm9ic2VydmF0aW9ucy5jb3VudCwgKGcpID0+IHBvcnQuZ2V0RmVhdHVyZVZlY3RvcihnKSk7XG4gIH1cblxuICAvKiogVGhlIG1hcmtlcnMnIGNvbG91cnMgKGFuZCBpY29ucywgYnkgZ2VuZSkgYmVmb3JlIHRoZSBnZW5lIGZpbHRlciBoaWRlcyBhbnkgb2YgdGhlbS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBtYXJrZXJTdHlsZShcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCxcbiAgICB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gICk6IFByb21pc2U8eyBjb2xvcnM6IFBvaW50Q29sb3JzOyBzeW1ib2xzOiBVaW50OEFycmF5IHwgbnVsbCB9PiB7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc2Vzc2lvbi5wb3J0O1xuICAgIGNvbnN0IGNvdW50ID0gZGF0YXNldC5vYnNlcnZhdGlvbnMuY291bnQ7XG4gICAgLy8gQ29sb3VyZWQgYnkgZ2VuZTogZWFjaCBvYnNlcnZhdGlvbiBpbiBpdHMgZ2VuZSdzIGNvbG91ciwgZHJhd24gYXMgaXRzIGdlbmUncyBpY29uLiBUaGF0IGlzXG4gICAgLy8gYSBjb2xvdXIsIHNvIGEgZmFpbGVkIHJlYWQgZmFsbHMgYmFjayB0byB0aGUgdmlldydzIGNvbG91ciBzb3VyY2UsIGFzIGFueSBjb2xvdXIgZG9lcy5cbiAgICBjb25zdCBieUdlbmUgPSBwb3J0XG4gICAgICA/IGF3YWl0IG9ic2VydmF0aW9uR2VuZVN0eWxlKHZpZXcsIGNvdW50LCAoZykgPT4gcG9ydC5nZXRGZWF0dXJlVmVjdG9yKGcpKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSBjb2xvdXJpbmcgYnkgZ2VuZSBmYWlsZWQg4oCUIGZhbGxpbmcgYmFjayB0byB0aGUgY29sb3VyIHNvdXJjZScsIGVycik7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0pXG4gICAgICA6IG51bGw7XG4gICAgY29uc3QgY29sb3JzID0gYnlHZW5lXG4gICAgICA/IGVuY29kZUNhdGVnb3JpY2FsKGJ5R2VuZS5jb2Rlcywge1xuICAgICAgICAgIGNvbG9yczogYnlHZW5lLmNvbG9ycyxcbiAgICAgICAgICBvcGFjaXR5OiB2aWV3Lm9wYWNpdHksXG4gICAgICAgICAgbXV0ZWQ6IG11dGVkRnJvbVNlbGVjdGlvbihzZWxlY3Rpb24pLFxuICAgICAgICB9KVxuICAgICAgOiBhd2FpdCB0aGlzLnNvdXJjZUNvbG9ycyhkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24pO1xuICAgIGNvbnN0IHN5bWJvbHMgPSBieUdlbmUgPyBnbHlwaFN5bWJvbHMoYnlHZW5lLmNvZGVzLCBieUdlbmUuZ2x5cGhzKSA6IG51bGw7XG4gICAgcmV0dXJuIHsgY29sb3JzLCBzeW1ib2xzIH07XG4gIH1cblxuICAvKioge0BsaW5rIGZhY2VDb2xvcnN9IGJlZm9yZSB0aGUgZ2VuZSBmaWx0ZXI6IHdoYXQgdGhlIGNvbG91ciBzb3VyY2UgYW5kIHRoZSBzZWxlY3Rpb24gbWFrZSBvZiB0aGVtLiAqL1xuICBwcml2YXRlIGFzeW5jIHNvdXJjZUNvbG9ycyhcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCxcbiAgICB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gICk6IFByb21pc2U8UG9pbnRDb2xvcnM+IHtcbiAgICBjb25zdCBwb3J0ID0gdGhpcy5zZXNzaW9uLnBvcnQ7XG4gICAgY29uc3QgY29sb3JCeSA9IHZpZXcuY29sb3JCeTtcbiAgICAvLyBFdmVyeXRoaW5nIE5PVCBzZWxlY3RlZCBpcyBtdXRlZDsgd2l0aCBub3RoaW5nIHNlbGVjdGVkLCBub3RoaW5nIGlzIG11dGVkXG4gICAgLy8gYW5kIHRoZSB3aG9sZSB0aXNzdWUgcmVhZHMgbm9ybWFsbHkgKHRoZSBDb3NNeCBoaWdobGlnaHQtdnMtbXV0ZSBydWxlKS5cbiAgICBjb25zdCBtdXRlZCA9IG11dGVkRnJvbVNlbGVjdGlvbihzZWxlY3Rpb24pO1xuXG4gICAgLy8gT25lIGNvbG91ciwgdGhlIGNlbGxzJyB0b28gKFwiU2luZ2xlIGNvbG91clwiKS5cbiAgICBpZiAoIWNvbG9yQnkgJiYgdmlldy5jZWxsQ29sb3JNb2RlID09PSAnc2luZ2xlJykge1xuICAgICAgcmV0dXJuIGVuY29kZUNhdGVnb3JpY2FsKG5ldyBVaW50MTZBcnJheShkYXRhc2V0Lm9ic2VydmF0aW9ucy5jb3VudCksIHtcbiAgICAgICAgY29sb3JzOiBbdmlldy5jZWxsU2luZ2xlQ29sb3JdLFxuICAgICAgICBvcGFjaXR5OiB2aWV3Lm9wYWNpdHksXG4gICAgICAgIG11dGVkLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghcG9ydCB8fCAhY29sb3JCeSkge1xuICAgICAgLy8gR2VudWluZWx5IHVuaWZvcm06IG9uZSBicm9hZGNhc3QgdHVwbGUsIHNvIGEgZmxhdCA4NGstb2JzZXJ2YXRpb24gdmlld1xuICAgICAgLy8gZG9lcyBub3QgYWxsb2NhdGUgYSBjb2xvdXIgcGVyIHBvaW50LlxuICAgICAgaWYgKCFtdXRlZCAmJiB2aWV3Lm9wYWNpdHkgPj0gMSkgcmV0dXJuIFNQQVRJQUxfTkVVVFJBTF9DT0xPUjtcbiAgICAgIC8vIE5vdCB1bmlmb3JtIOKAlCB0aGUgb3BhY2l0eSBjb250cm9sIG9yIGEgc2VsZWN0aW9uIHZhcmllcyB0aGUgYWxwaGEsIHNvIGl0XG4gICAgICAvLyBoYXMgdG8gYmUgcGVyLXBvaW50LiBSZXR1cm5pbmcgdGhlIGNvbnN0YW50IHR1cGxlIGhlcmUgaXMgd2hhdCBtYWRlIHRoZVxuICAgICAgLy8gT3BhY2l0eSBzbGlkZXIgZG8gbm90aGluZyBpbiB0aGUgZGVmYXVsdCBzdGF0ZSwgd2hpY2ggaXMgdGhlIHN0YXRlIGFueW9uZVxuICAgICAgLy8gbGFuZHMgaW4gYmVmb3JlIHBpY2tpbmcgYSBjb2xvdXIgc291cmNlLlxuICAgICAgcmV0dXJuIGVuY29kZUNhdGVnb3JpY2FsKG5ldyBVaW50MTZBcnJheShkYXRhc2V0Lm9ic2VydmF0aW9ucy5jb3VudCksIHtcbiAgICAgICAgY29sb3JzOiBbU1BBVElBTF9ORVVUUkFMX0hFWF0sXG4gICAgICAgIG9wYWNpdHk6IHZpZXcub3BhY2l0eSxcbiAgICAgICAgbXV0ZWQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoY29sb3JCeS5raW5kID09PSAnY29sdW1uJykge1xuICAgICAgY29uc3QgY29sdW1uOiBTcGF0aWFsQ29sdW1uID0gYXdhaXQgcG9ydC5nZXRDb2x1bW4oY29sb3JCeS5uYW1lKTtcbiAgICAgIGlmIChpc0NhdGVnb3JpY2FsQ29sdW1uKGNvbHVtbikpIHtcbiAgICAgICAgY29uc3QgcmdiYSA9IGVuY29kZUNhdGVnb3JpY2FsKGNvbHVtbi5jb2Rlcywge1xuICAgICAgICAgIGNvbG9yczogY2F0ZWdvcnlDb2xvcnNGb3IoY29sb3JCeS5uYW1lLCBjb2x1bW4ubWV0YSwgdmlldy5ncm91cENvbG9ycyksXG4gICAgICAgICAgb3BhY2l0eTogdmlldy5vcGFjaXR5LFxuICAgICAgICAgIG11dGVkLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gR3JvdXBzIHN3aXRjaGVkIG9mZiBpbiB0aGUgQ2VsbHMgcGFuZWwgaGlkZSB0aGVpciBkb3RzIHRvbywgd2hlbiB0aGUgZG90cyBhcmVcbiAgICAgICAgLy8gY29sb3VyZWQgYnkgdGhhdCBzYW1lIGdyb3VwaW5nLlxuICAgICAgICBjb25zdCBncm91cENvbHVtbiA9IGNlbGxUeXBlQ29sdW1uRm9yKGRhdGFzZXQsIHZpZXcpO1xuICAgICAgICBpZiAodmlldy5oaWRkZW5Hcm91cHM/Lmxlbmd0aCAmJiBncm91cENvbHVtbiA9PT0gY29sb3JCeS5uYW1lKSB7XG4gICAgICAgICAgY29uc3Qgb2ZmID0gbmV3IFNldCh2aWV3LmhpZGRlbkdyb3Vwcyk7XG4gICAgICAgICAgY29uc3QgaGlkZSA9IGNvbHVtbi5tZXRhLmNhdGVnb3JpZXMubWFwKChjKSA9PiBvZmYuaGFzKGMpKTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbHVtbi5jb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgYyA9IGNvbHVtbi5jb2Rlc1tpXTtcbiAgICAgICAgICAgIGlmIChjICE9PSBOT19DQVRFR09SWSAmJiBoaWRlW2NdKSByZ2JhWzQgKiBpICsgM10gPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmdiYTtcbiAgICAgIH1cbiAgICAgIC8vIEEgY29udGludW91cyBjb2x1bW4gbWF5IGNhcnJ5IGl0cyBvd24gbG9nIGhpbnQgKGNvdW50cyk7IHRoZSB2aWV3J3NcbiAgICAgIC8vIHRvZ2dsZSB3aW5zIG9uY2UgdGhlIHVzZXIgaGFzIHNldCBpdC5cbiAgICAgIHJldHVybiB0aGlzLmVuY29kZUNvbnRpbnVvdXMoY29sdW1uLnZhbHVlcywgdmlldywgbXV0ZWQpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlcyA9IGF3YWl0IHBvcnQuZ2V0RmVhdHVyZVZlY3Rvcihjb2xvckJ5Lm5hbWUpO1xuICAgIHJldHVybiB0aGlzLmVuY29kZUNvbnRpbnVvdXModmFsdWVzLCB2aWV3LCBtdXRlZCk7XG4gIH1cblxuICAvKiogQ29udGludW91cyB2YWx1ZXMg4oaSIFJHQkEgdGhyb3VnaCB0aGUgYWN0aXZlIGNvbG9ybWFwIGFuZCBhIGNsaXBwZWQgd2luZG93LiAqL1xuICBlbmNvZGVDb250aW51b3VzKHZhbHVlczogRmxvYXQzMkFycmF5LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLCBtdXRlZDogVWludDhBcnJheSB8IG51bGwgPSBudWxsKTogRmxvYXQzMkFycmF5IHtcbiAgICByZXR1cm4gZW5jb2RlU3BhdGlhbENvbnRpbnVvdXMoXG4gICAgICB2YWx1ZXMsXG4gICAgICB2aWV3LFxuICAgICAgdGhpcy5jdHguZGlzcGxheS5zcGF0aWFsTHV0KHZpZXcpLFxuICAgICAgdGhpcy5zZXNzaW9uLmNvbnRyYXN0V2luZG93cyxcbiAgICAgIG11dGVkLFxuICAgICk7XG4gIH1cbn1cblxuLyoqIFRoZSBtYXJrZXJzJyBkaWFtZXRlcnM6IGVhY2ggb2JzZXJ2YXRpb24ncyBvd24gKG9yIHRoZSBmYWxsYmFjayksIGF0IGxlYXN0IHRoZSBzbGFiJ3MgZmxvb3IsXG4gKiAgdGltZXMgdGhlIHZpZXcncyBwb2ludCBzY2FsZTsgb25lIG51bWJlciB3aGVuIGV2ZXJ5IG1hcmtlciBpcyBkcmF3biBhdCB0aGUgc2FtZSBzaXplLiAqL1xuZnVuY3Rpb24gbWFya2VyU2l6ZXMob2JzOiBTcGF0aWFsT2JzZXJ2YXRpb25zLCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLCBzbGFiOiBTbGFiIHwgbnVsbCk6IG51bWJlciB8IEZsb2F0MzJBcnJheSB7XG4gIGNvbnN0IGJhc2UgPSBtYXJrZXJEaWFtZXRlcnMob2JzLCBTUEFUSUFMX0ZBTExCQUNLX1JBRElVUyk7XG4gIGNvbnN0IHNjYWxlID0gdmlldy5wb2ludFNjYWxlID4gMCA/IHZpZXcucG9pbnRTY2FsZSA6IDE7XG4gIGNvbnN0IGZsb29yID0gc2xhYj8ubWluRGlhbWV0ZXIgPz8gMDtcbiAgaWYgKHR5cGVvZiBiYXNlID09PSAnbnVtYmVyJyAmJiAhc2xhYikgcmV0dXJuIE1hdGgubWF4KGJhc2UsIGZsb29yKSAqIHNjYWxlO1xuICBjb25zdCBzaXplT2YgPSAoaTogbnVtYmVyKSA9PiBNYXRoLm1heCh0eXBlb2YgYmFzZSA9PT0gJ251bWJlcicgPyBiYXNlIDogYmFzZVtpXSwgZmxvb3IpICogc2NhbGU7XG4gIHJldHVybiBGbG9hdDMyQXJyYXkuZnJvbShzbGFiPy5pbmRpY2VzID8/IHsgbGVuZ3RoOiBvYnMuY291bnQgfSwgKF92LCBpKSA9PiBzaXplT2Yoc2xhYiA/IHNsYWIuaW5kaWNlc1tpXSA6IGkpKTtcbn1cblxuLyoqIEludGVybGVhdmVkIHgseSBvZiB0aGUgYGRyYXduYCBvYnNlcnZhdGlvbnMgKHVuZGVmaW5lZDogYWxsIG9mIHRoZW0pLiAqL1xuZnVuY3Rpb24gb2JzZXJ2YXRpb25Qb3NpdGlvbnMob2JzOiBTcGF0aWFsT2JzZXJ2YXRpb25zLCBkcmF3bjogVWludDMyQXJyYXkgfCB1bmRlZmluZWQpOiBGbG9hdDMyQXJyYXkge1xuICBjb25zdCBjb3VudCA9IGRyYXduID8gZHJhd24ubGVuZ3RoIDogb2JzLmNvdW50O1xuICBjb25zdCBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KGNvdW50ICogMik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgIGNvbnN0IG8gPSBkcmF3biA/IGRyYXduW2ldIDogaTtcbiAgICBwb3NpdGlvbnNbaSAqIDJdID0gb2JzLnhbb107XG4gICAgcG9zaXRpb25zW2kgKiAyICsgMV0gPSBvYnMueVtvXTtcbiAgfVxuICByZXR1cm4gcG9zaXRpb25zO1xufVxuXG4vKipcbiAqIFRoZSBwbGFuZSBgc2xpY2VgIG9mIGEgdm9sdW1lLWJhY2tlZCBkYXRhc2V0OiBpdHMgcGl4ZWwgYWZmaW5lLCB0aGUgb2JzZXJ2YXRpb25zIHRoYXQgZmFsbCBpblxuICogaXQsIGFuZCB0aGUgbWFya2VyIGZsb29yIHRoYXQgZ3JpZCBuZWVkcy4gT3ZlciBhIHJlYWwgYGltYWdlUmVmYCwgdGhlIHJlZ2lvbiBzZXQncyBwbGFuZSBzaG93blxuICogd2hlbiBgcGxhbmVzYCBzbGljZSB0aGUgaW1hZ2UgKGEgM0QgYXNzYXkgaW1hZ2VkIG9uIG9uZSBwbGFuZSk6IHRoZSBvYnNlcnZhdGlvbnMgbmVhcmVzdCB0aGF0XG4gKiBwbGFuZSwgaW4gdGhlIGltYWdlJ3Mgb3duIHBpeGVscy5cbiAqXG4gKiBOdWxsIGZvciBhbnkgb3RoZXIgZGF0YXNldCB3aXRoIGEgcmVhbCBgaW1hZ2VSZWZgIChpdHMgY29vcmRpbmF0ZXMgYXJlIGFscmVhZHkgdGhlIGltYWdlJ3NcbiAqIHBpeGVscyBhbmQgZXZlcnkgb2JzZXJ2YXRpb24gYmVsb25ncyB0byB0aGUgb25lIHNlY3Rpb24pIGFuZCBmb3Igb25lIHdpdGggbm8gdm9sdW1lIGF0IGFsbCDigJRcbiAqIGJvdGggb2Ygd2hpY2ggZHJhdyBleGFjdGx5IGFzIGJlZm9yZS5cbiAqL1xuZnVuY3Rpb24gc2xhYkF0KGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCBzbGljZTogbnVtYmVyLCBwbGFuZXM6IFBsYW5lVmlldyB8IG51bGwpOiBTbGFiIHwgbnVsbCB7XG4gIGNvbnN0IHZvbHVtZSA9IGRhdGFzZXQudm9sdW1lO1xuICBpZiAoZGF0YXNldC5pbWFnZVJlZikge1xuICAgIGlmICghcGxhbmVzKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgcmVmOiBkYXRhc2V0LmltYWdlUmVmLFxuICAgICAgaW5kaWNlczogb2JzZXJ2YXRpb25zT25QbGFuZShkYXRhc2V0Lm9ic2VydmF0aW9ucywgcGxhbmVzLnBsYW5lcywgcGxhbmVzLnBsYW5lKSxcbiAgICAgIHNsaWNlOiBwbGFuZXMucGxhbmUsXG4gICAgICBtaW5EaWFtZXRlcjogMCxcbiAgICAgIGdyaWQ6IG51bGwsXG4gICAgfTtcbiAgfVxuICBpZiAoIXZvbHVtZSkgcmV0dXJuIG51bGw7XG4gIHJldHVybiB7XG4gICAgcmVmOiB2b2x1bWVJbWFnZVJlZih2b2x1bWUsIGRhdGFzZXQubWljcm9uc1BlclVuaXQpLFxuICAgIGluZGljZXM6IG9ic2VydmF0aW9uc0luU2xpY2UoZGF0YXNldC5vYnNlcnZhdGlvbnMsIHZvbHVtZSwgc2xpY2UpLFxuICAgIHNsaWNlLFxuICAgIG1pbkRpYW1ldGVyOiBTUEFUSUFMX1NMSUNFX01JTl9ESUFNRVRFUl9QWCAqIHZvbHVtZS52b3hlbFNpemVbMF0sXG4gICAgZ3JpZDogeyB3aWR0aDogdm9sdW1lLndpZHRoLCBoZWlnaHQ6IHZvbHVtZS5oZWlnaHQgfSxcbiAgfTtcbn1cblxuLyoqIFBlci1vYnNlcnZhdGlvbiBuYXBhcmktanMgc3ltYm9sIGNvZGVzOiBlYWNoIG9ic2VydmF0aW9uJ3MgZ2VuZSdzIGljb24gKGBjb2Rlc2AgaW5kZXhcbiAqICBgZ2x5cGhzYCksIGEgZGlzYyB3aGVyZSBpdCBoYXMgbm9uZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnbHlwaFN5bWJvbHMoY29kZXM6IFVpbnQxNkFycmF5LCBnbHlwaHM6IHJlYWRvbmx5IFRyYW5zY3JpcHRHbHlwaE5hbWVbXSk6IFVpbnQ4QXJyYXkge1xuICBjb25zdCBieUdlbmUgPSBnbHlwaHMubWFwKChnKSA9PiBwb2ludFN5bWJvbENvZGUoR0xZUEhfU1lNQk9MU1tnXSkpO1xuICBjb25zdCBkaXNjID0gcG9pbnRTeW1ib2xDb2RlKCdkaXNjJyk7XG4gIHJldHVybiBVaW50OEFycmF5LmZyb20oY29kZXMsIChjKSA9PiAoYyA9PT0gTk9fQ0FURUdPUlkgPyBkaXNjIDogKGJ5R2VuZVtjXSA/PyBkaXNjKSkpO1xufVxuXG4vKiogVGhlIHN5bWJvbHMgb2YgdGhlIGRyYXduIHN1YnNldCAoYWxsIG9mIHRoZW0gd2hlbiBgaW5kaWNlc2AgaXMgdW5kZWZpbmVkKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnYXRoZXJTeW1ib2xzKHN5bWJvbHM6IFVpbnQ4QXJyYXkgfCBudWxsLCBpbmRpY2VzPzogVWludDMyQXJyYXkpOiBVaW50OEFycmF5IHwgbnVsbCB7XG4gIGlmICghc3ltYm9scyB8fCAhaW5kaWNlcykgcmV0dXJuIHN5bWJvbHM7XG4gIHJldHVybiBVaW50OEFycmF5LmZyb20oaW5kaWNlcywgKGkpID0+IHN5bWJvbHNbaV0pO1xufVxuIl19
|