@jax-data-science/sci-image-visualizer 0.15.0 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/contracts/display-types.mjs +2 -1
- package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-scene.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +10 -8
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +226 -39
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-transcripts.mjs +269 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +11 -4
- package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +6 -7
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +2 -1
- package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +33 -8
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +6 -2
- package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +10 -6
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +9 -5
- package/esm2022/lib/spatial/spatial-controls.facade.mjs +7 -4
- package/esm2022/lib/spatial/spatial-encoding.mjs +18 -1
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +6 -2
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +7 -3
- package/esm2022/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.mjs +7 -3
- package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +67 -19
- package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +61 -8
- package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +3 -3
- package/esm2022/lib/toolbar/toolbar.component.mjs +13 -4
- package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +7 -7
- package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-qUeMuBb0.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DHrHO2ay.mjs} +795 -165
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DHrHO2ay.mjs.map +1 -0
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-U1ODcfYD.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-CKEUwNta.mjs} +2 -2
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-U1ODcfYD.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-CKEUwNta.mjs.map} +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +1 -1
- package/lib/contracts/display-types.d.ts +9 -2
- package/lib/implementations/napari-js/napari-loading-state.d.ts +1 -1
- package/lib/implementations/napari-js/napari-scene.d.ts +2 -0
- package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +3 -3
- package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +82 -9
- package/lib/implementations/napari-js/napari-spatial-3d-transcripts.d.ts +62 -0
- package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +9 -2
- package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +5 -6
- package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +16 -3
- package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +1 -1
- package/lib/spatial/spatial-encoding.d.ts +10 -0
- package/lib/spatial-controls/spatial-controls.component.d.ts +2 -0
- package/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.d.ts +3 -1
- package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +25 -0
- package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +14 -3
- package/lib/toolbar/toolbar.component.d.ts +6 -0
- package/lib/toolbar/view-controls/view-controls.component.d.ts +3 -3
- package/package.json +2 -2
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-qUeMuBb0.mjs.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { pointSymbolCode } from 'napari-js';
|
|
2
2
|
import { NO_CATEGORY, isCategoricalColumn, } from '../../contracts/spatial-dataset.contract';
|
|
3
|
-
import { encodeCategorical, markerDiameters
|
|
3
|
+
import { categoryColorsFor, encodeCategorical, markerDiameters } from '../../spatial/spatial-encoding';
|
|
4
4
|
import { emptySelection, maskToIndices, mutedFromSelection, } from '../../spatial/spatial-selection';
|
|
5
5
|
import { framePositions } from '../../spatial/spatial-framing';
|
|
6
6
|
import { PIXEL_WORLD_QUANTUM, worldQuantumForExtent } from '../../spatial/world-grid';
|
|
@@ -13,7 +13,7 @@ import { Supersede } from '../../util/supersede';
|
|
|
13
13
|
import { isAbortError } from '../tile-server';
|
|
14
14
|
import { GLYPH_SYMBOLS } from './spatial-tiles/transcript-layers';
|
|
15
15
|
import { Image2dScene } from './napari-image-2d-scene';
|
|
16
|
-
import { GENE_MAP_MAX_SIDE, GENE_MAP_SIGMA, SPATIAL_FALLBACK_RADIUS, SPATIAL_NEUTRAL_COLOR, SPATIAL_NEUTRAL_HEX, SPATIAL_SLICE_MIN_DIAMETER_PX, encodeSpatialContinuous, gatherColors, hideUnshown, } from './napari-spatial-encoding';
|
|
16
|
+
import { GENE_MAP_MAX_SIDE, GENE_MAP_SIGMA, SPATIAL_FALLBACK_RADIUS, SPATIAL_MARKER_MIN_SCREEN_PX, SPATIAL_NEUTRAL_COLOR, SPATIAL_NEUTRAL_HEX, SPATIAL_SLICE_MIN_DIAMETER_PX, encodeSpatialContinuous, gatherColors, hideUnshown, } from './napari-spatial-encoding';
|
|
17
17
|
import { SpatialSceneBase } from './napari-spatial-scene';
|
|
18
18
|
/**
|
|
19
19
|
* SPATIAL_OMICS (review Appendix B, cluster J): the tissue image (an {@link Image2dScene}) with one
|
|
@@ -131,13 +131,13 @@ export class Spatial2dScene extends SpatialSceneBase {
|
|
|
131
131
|
return this.drawn ? this.drawn[k] : k;
|
|
132
132
|
}
|
|
133
133
|
/**
|
|
134
|
-
* Whether the markers are drawn:
|
|
135
|
-
*
|
|
136
|
-
*
|
|
134
|
+
* Whether the markers are drawn: whenever the user wants them, at every zoom. Cell outlines come
|
|
135
|
+
* and go with the zoom (their level of detail follows it) and are drawn over the markers; the
|
|
136
|
+
* observations themselves never disappear with them.
|
|
137
137
|
*/
|
|
138
138
|
pointsVisible() {
|
|
139
139
|
const view = this.session.latest?.[1];
|
|
140
|
-
return
|
|
140
|
+
return view?.showPoints ?? true;
|
|
141
141
|
}
|
|
142
142
|
/**
|
|
143
143
|
* Redraw the markers over a freshly rendered image. Two reasons, both invisible from the
|
|
@@ -286,6 +286,8 @@ export class Spatial2dScene extends SpatialSceneBase {
|
|
|
286
286
|
scale: ref?.scale ?? [1, 1],
|
|
287
287
|
translate: ref?.translate ?? [0, 0],
|
|
288
288
|
visible: this.pointsVisible(),
|
|
289
|
+
// Never under a couple of screen pixels, so the observations stay visible zoomed out.
|
|
290
|
+
minScreenSize: SPATIAL_MARKER_MIN_SCREEN_PX,
|
|
289
291
|
});
|
|
290
292
|
// Outlines, density and transcripts go back over the markers just added.
|
|
291
293
|
this.session.tiles?.afterObservations();
|
|
@@ -605,7 +607,7 @@ export class Spatial2dScene extends SpatialSceneBase {
|
|
|
605
607
|
const column = await port.getColumn(colorBy.name);
|
|
606
608
|
if (isCategoricalColumn(column)) {
|
|
607
609
|
const rgba = encodeCategorical(column.codes, {
|
|
608
|
-
colors:
|
|
610
|
+
colors: categoryColorsFor(colorBy.name, column.meta, view.groupColors),
|
|
609
611
|
opacity: view.opacity,
|
|
610
612
|
muted,
|
|
611
613
|
});
|
|
@@ -689,4 +691,4 @@ export function gatherSymbols(symbols, indices) {
|
|
|
689
691
|
return symbols;
|
|
690
692
|
return Uint8Array.from(indices, (i) => symbols[i]);
|
|
691
693
|
}
|
|
692
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXNwYXRpYWwtMmQtc2NlbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvbmFwYXJpLXNwYXRpYWwtMmQtc2NlbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUk1QyxPQUFPLEVBQ0wsV0FBVyxFQUtYLG1CQUFtQixHQUNwQixNQUFNLDBDQUEwQyxDQUFDO0FBRWxELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMzRyxPQUFPLEVBRUwsY0FBYyxFQUNkLGFBQWEsRUFDYixrQkFBa0IsR0FDbkIsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDL0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdEYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzlGLE9BQU8sRUFBbUIsb0JBQW9CLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUM5RyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTlDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixjQUFjLEVBQ2QsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUNyQixtQkFBbUIsRUFDbkIsNkJBQTZCLEVBRTdCLHVCQUF1QixFQUN2QixZQUFZLEVBQ1osV0FBVyxHQUNaLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLGdCQUFnQixFQUFvQyxNQUFNLHdCQUF3QixDQUFDO0FBVzVGOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLE9BQU8sY0FBZSxTQUFRLGdCQUFnQjtJQW1CbEQseUZBQXlGO0lBQ3pGLFlBQVksR0FBaUIsRUFBRSxPQUF1QixFQUFFLE9BQU8sR0FBRyxLQUFLO1FBQ3JFLEtBQUssQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBbkI3QjtrRkFDMEU7UUFDbEUsV0FBTSxHQUF1QixJQUFJLENBQUM7UUFDbEMsYUFBUSxHQUFrQixJQUFJLENBQUM7UUFDdkMsMkZBQTJGO1FBQ25GLFVBQUssR0FBdUIsSUFBSSxDQUFDO1FBQ3pDO3NDQUM4QjtRQUM5QixpQkFBWSxHQUFzQixJQUFJLENBQUM7UUFDL0IsZUFBVSxHQUFrQixJQUFJLENBQUM7UUFDekMseUVBQXlFO1FBQ2pFLFdBQU0sR0FBa0IsSUFBSSxDQUFDO1FBQ3JDOztvQ0FFNEI7UUFDWCxpQkFBWSxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7UUFLOUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLFlBQVksQ0FBQyxHQUFHLEVBQUU7WUFDakMsS0FBSyxFQUFFLENBQUMsT0FBTztZQUNmLDBGQUEwRjtZQUMxRiw0RkFBNEY7WUFDNUYsdUZBQXVGO1lBQ3ZGLGtGQUFrRjtZQUNsRixHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRO1lBQzFDLE9BQU8sRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFO2dCQUN0QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3JCLDBGQUEwRjtnQkFDMUYscUZBQXFGO2dCQUNyRixJQUFJLFVBQVU7b0JBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDaEQsQ0FBQztZQUNELG1CQUFtQixFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFO1NBQzdDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsS0FBSztRQUNULE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDckIsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pCLCtGQUErRjtRQUMvRix1REFBdUQ7UUFDdkQsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU87WUFBRSxPQUFPO1FBQy9CLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLEdBQUcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBSSxDQUFDLENBQVM7UUFDWixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRUQsU0FBUyxDQUFDLE9BQWUsRUFBRSxJQUFZO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxPQUFnQjtRQUNoQyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxPQUFnQjtRQUNsQyxJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsVUFBVTtRQUNSLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxXQUFXLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRUQsb0JBQW9CO1FBQ2xCLElBQUksSUFBSSxDQUFDLE1BQU07WUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDNUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVrQixXQUFXO1FBQzVCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFa0IsVUFBVTtRQUMzQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ08sZUFBZSxDQUFDLE9BQWUsRUFBRSxPQUFlLEVBQUUsT0FBZTtRQUN6RSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzNCLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUN2QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3hELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxPQUFPLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ25HLElBQUksQ0FBQyxHQUFHLENBQUM7WUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssYUFBYTtRQUNuQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsVUFBVSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDO0lBQzFFLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxhQUFhO1FBQ25CLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQ25DLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFBRSxPQUFPO1FBQ3pCLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxtRkFBbUY7SUFDekUsS0FBSyxDQUFDLE9BQU8sQ0FDckIsT0FBOEIsRUFDOUIsSUFBc0IsRUFDdEIsWUFBa0MsY0FBYyxFQUFFO1FBRWxELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFbEMseUVBQXlFO1FBQ3pFLDBFQUEwRTtRQUMxRSxJQUFJLFNBQXNCLENBQUM7UUFDM0IsSUFBSSxPQUFPLEdBQXNCLElBQUksQ0FBQztRQUN0QyxJQUFJLEtBQUssR0FBc0IsSUFBSSxDQUFDO1FBQ3BDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUM7WUFDSCwyRkFBMkY7WUFDM0Ysd0ZBQXdGO1lBQ3hGLHVGQUF1RjtZQUN2RixrRUFBa0U7WUFDbEUsSUFBSSxDQUFDO2dCQUNILEtBQUssR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNoRSxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixPQUFPLENBQUMsSUFBSSxDQUFDLGtGQUFrRixFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUN0RyxJQUFJLElBQUksRUFBRTtvQkFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNoRCxPQUFPO1lBQ1QsQ0FBQztZQUNELElBQUksQ0FBQztnQkFDSCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQ2hGLFNBQVMsR0FBRyxLQUFLLEVBQUUsTUFBTSxJQUFJLHFCQUFxQixDQUFDO2dCQUNuRCxPQUFPLEdBQUcsS0FBSyxFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUM7WUFDbkMsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsT0FBTyxDQUFDLElBQUksQ0FBQyxzRUFBc0UsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDMUYsU0FBUyxHQUFHLHFCQUFxQixDQUFDO2dCQUNsQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ2pCLENBQUM7UUFDSCxDQUFDO2dCQUFTLENBQUM7WUFDVCxVQUFVLEVBQUUsQ0FBQztRQUNmLENBQUM7UUFDRCwwRUFBMEU7UUFDMUUsSUFBSSxDQUFDLElBQUksRUFBRTtZQUFFLE9BQU87UUFDcEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyx3RUFBd0U7UUFDeEUsSUFBSSxLQUFLLElBQUksT0FBTztZQUFFLFNBQVMsR0FBRyxXQUFXLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRWhFLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDakQsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMxQixPQUFPO1FBQ1QsQ0FBQztRQUVELHdFQUF3RTtRQUN4RSw2RUFBNkU7UUFDN0UsMkVBQTJFO1FBQzNFLDRFQUE0RTtRQUM1RSw2Q0FBNkM7UUFDN0MsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDM0MsNkVBQTZFO1FBQzdFLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLElBQUksRUFBRTtZQUFFLE9BQU87UUFDcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRCwwREFBMEQ7SUFDbEQsWUFBWSxDQUFDLE1BQWM7UUFDakMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0QixNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDeEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDekIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDekIsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSyxXQUFXLENBQ2pCLE1BQWMsRUFDZCxPQUF1QixFQUN2QixJQUFzQixFQUN0QixTQUFzQixFQUN0QixJQUFpQixFQUNqQixVQUE2QixJQUFJO1FBRWpDLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUM7UUFDakMsTUFBTSxHQUFHLEdBQUcsSUFBSSxFQUFFLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQzFDLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRTFDLDBFQUEwRTtRQUMxRSw2RUFBNkU7UUFDN0UsNkVBQTZFO1FBQzdFLDhFQUE4RTtRQUM5RSxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDOUQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDbkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDdkIsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxDQUFDO1FBQzFFLDJFQUEyRTtRQUMzRSx1RUFBdUU7UUFDdkUsNkVBQTZFO1FBQzdFLHdFQUF3RTtRQUN4RSw4RUFBOEU7UUFDOUUsa0NBQWtDO1FBQ2xDLE1BQU0sR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsS0FBSyxJQUFJLElBQUksRUFBRSxLQUFLLElBQUksRUFBRSxFQUFFLENBQUM7UUFDOUQsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLEdBQUcsS0FBSyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMzQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztZQUMvRCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxhQUFhLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztZQUM1RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsZUFBZSxLQUFLLEtBQUssQ0FBQyxDQUFDO1lBQ2hGLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNyQixDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxFQUFFLE9BQU8sQ0FBQztRQUM1QixNQUFNLFNBQVMsR0FBRyxvQkFBb0IsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUM7UUFDcEIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDO1FBQzNCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUU7WUFDeEMsSUFBSSxFQUFFLGNBQWM7WUFDcEIsSUFBSTtZQUNKLFNBQVMsRUFBRSxZQUFZLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQztZQUN6Qyx5RkFBeUY7WUFDekYsT0FBTyxFQUFFLGFBQWEsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDO1lBQ3RDLDBFQUEwRTtZQUMxRSxzQ0FBc0M7WUFDdEMsV0FBVyxFQUFFLENBQUM7WUFDZCwyRUFBMkU7WUFDM0Usd0VBQXdFO1lBQ3hFLHdFQUF3RTtZQUN4RSx3RUFBd0U7WUFDeEUsMERBQTBEO1lBQzFELEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMzQixTQUFTLEVBQUUsR0FBRyxFQUFFLFNBQVMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbkMsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUU7U0FDOUIsQ0FBQyxDQUFDO1FBQ0gseUVBQXlFO1FBQ3pFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUksQ0FBQyxlQUFlLEtBQUssS0FBSyxDQUFDLENBQUM7UUFDaEYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNLLGdCQUFnQixDQUFDLE9BQXVCLEVBQUUsU0FBdUI7UUFDdkUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDO1FBQzdDLElBQUksQ0FBQyxPQUFPLEVBQUUsZUFBZTtZQUFFLE9BQU87UUFDdEMsSUFBSSxPQUFPLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN2QyxPQUFPLENBQUMsZUFBZSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDN0MsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLElBQUksR0FBRyxRQUFRLENBQUM7UUFDcEIsSUFBSSxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUM7UUFDckIsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDO1FBQ3BCLElBQUksSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDO1FBQ3JCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM3QyxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkIsTUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUFFLFNBQVM7WUFDekQsSUFBSSxDQUFDLEdBQUcsSUFBSTtnQkFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxHQUFHLElBQUk7Z0JBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUN2QixJQUFJLENBQUMsR0FBRyxJQUFJO2dCQUFFLElBQUksR0FBRyxDQUFDLENBQUM7WUFDdkIsSUFBSSxDQUFDLEdBQUcsSUFBSTtnQkFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLENBQUM7UUFDRCxPQUFPLENBQUMsZUFBZSxDQUFDLHFCQUFxQixDQUFDLElBQUksR0FBRyxJQUFJLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7O09BZ0JHO0lBQ0gsZ0JBQWdCLENBQUMsTUFBZ0QsRUFBRSxnQkFBeUI7UUFDMUYsZ0VBQWdFO1FBQ2hFLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM5QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUNqQyxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDeEMsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE9BQU87Z0JBQUUsU0FBUztZQUNyQyxvRkFBb0Y7WUFDcEYsa0ZBQWtGO1lBQ2xGLElBQUksS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLFlBQVk7Z0JBQUUsU0FBUztZQUNoRSw4RUFBOEU7WUFDOUUseURBQXlEO1lBQ3pELEtBQUssQ0FBQyxPQUFPLEdBQUcsZ0JBQWdCLENBQUM7UUFDbkMsQ0FBQztRQUNELHlGQUF5RjtRQUN6RiwwRkFBMEY7UUFDMUYsSUFBSSxnQkFBZ0I7WUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDdkQsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7O09BZUc7SUFDSyxTQUFTLENBQUMsTUFBYyxFQUFFLFNBQWlCLEVBQUUsU0FBdUIsRUFBRSxVQUFtQjtRQUMvRiwyRkFBMkY7UUFDM0YsMkZBQTJGO1FBQzNGLHdEQUF3RDtRQUN4RCxJQUFJLFVBQVU7WUFBRSxPQUFPO1FBQ3ZCLGdDQUFnQztRQUNoQyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUztZQUFFLE9BQU87UUFFdEMsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDNUIsTUFBTSxHQUFHLEdBQUcsY0FBYyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsV0FBVyxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3pGLCtFQUErRTtRQUMvRSxvREFBb0Q7UUFDcEQsSUFBSSxDQUFDLEdBQUc7WUFBRSxPQUFPO1FBQ2pCLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO0lBQzFCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FpQkc7SUFDSyxLQUFLLENBQUMsYUFBYSxDQUN6QixNQUFjLEVBQ2QsT0FBdUIsRUFDdkIsSUFBc0IsRUFDdEIsU0FBK0IsRUFDL0IsSUFBaUI7UUFFakIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDekYsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDL0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDbkMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVqRCxnRkFBZ0Y7UUFDaEYsZ0ZBQWdGO1FBQ2hGLGdEQUFnRDtRQUNoRCxNQUFNLFFBQVEsR0FBRyxJQUFJO1lBQ25CLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLElBQUksRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDbEcsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNULE1BQU0sR0FBRyxHQUFHLFFBQVE7WUFDbEIsQ0FBQyxDQUFDO2dCQUNFLFFBQVE7Z0JBQ1IsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7Z0JBQ2QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLO2dCQUM3QixJQUFJLENBQUMsY0FBYztnQkFDbkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDO2FBQzdDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUNiLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDVCw0RkFBNEY7UUFDNUYsMEZBQTBGO1FBQzFGLGtGQUFrRjtRQUNsRixJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDMUUsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDekIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDekIsQ0FBQztRQUNELElBQUksR0FBRyxLQUFLLElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTztRQUVwQyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0QixNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDeEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDM0IsQ0FBQztRQUNELElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMzQixLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztZQUNuQixLQUFLLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztZQUNqQixPQUFPO1FBQ1QsQ0FBQztRQUVELHlFQUF5RTtRQUN6RSxnRkFBZ0Y7UUFDaEYsc0ZBQXNGO1FBQ3RGLGlGQUFpRjtRQUNqRixJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBQ3ZDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN6RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzNELElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUMvQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxHQUFHLGlCQUFpQixDQUFDLENBQUMsQ0FBQztRQUVsRixJQUFJLFFBQVEsS0FBSyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDM0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN0QyxJQUFJLE1BQW9CLENBQUM7WUFDekIsSUFBSSxDQUFDO2dCQUNILE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3QyxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixPQUFPLENBQUMsSUFBSSxDQUFDLDBCQUEwQixJQUFJLGVBQWUsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDakUsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7Z0JBQ3ZCLE9BQU87WUFDVCxDQUFDO1lBQ0QsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssR0FBRztnQkFBRSxPQUFPO1lBQy9DLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDcEYsSUFBSSxTQUFpQyxDQUFDO1lBQ3RDLElBQUksQ0FBQztnQkFDSCxTQUFTLEdBQUcsTUFBTSwyQkFBMkIsQ0FDM0MsT0FBTyxDQUFDLFlBQVksRUFDcEI7b0JBQ0UsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksT0FBTyxDQUFDLFFBQVE7b0JBQ2xDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7b0JBQy9CLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7b0JBQ2hDLElBQUk7b0JBQ0osS0FBSyxFQUFFLGNBQWMsR0FBRyxTQUFTO29CQUNqQyxNQUFNO29CQUNOLDBFQUEwRTtvQkFDMUUsd0VBQXdFO29CQUN4RSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sSUFBSSxXQUFXO2lCQUN0QyxFQUNELEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FDeEIsQ0FBQztZQUNKLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQztvQkFBRSxPQUFPLENBQUMsb0RBQW9EO2dCQUNuRixNQUFNLEdBQUcsQ0FBQztZQUNaLENBQUM7WUFDRCxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxHQUFHO2dCQUFFLE9BQU87WUFDL0MsS0FBSyxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUM7WUFDeEIsS0FBSyxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUM7UUFDdkIsQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDMUIsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPO1FBRW5CLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5Qyx3RkFBd0Y7UUFDeEYsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlELE1BQU0sSUFBSSxHQUFHLG9CQUFvQixDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDdEQsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ2xCLDJFQUEyRTtZQUMzRSx1REFBdUQ7WUFDdkQsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjO1NBQzdCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FDakMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQ3BHO1lBQ0UsSUFBSSxFQUFFLGNBQWMsSUFBSSxFQUFFO1lBQzFCLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUM7WUFDbkIsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNqQixRQUFRLEVBQUUsYUFBYTtTQUN4QixDQUNGLENBQUM7UUFDRixxRkFBcUY7UUFDckYsNkZBQTZGO1FBQzdGLHdGQUF3RjtRQUN4Rix5RkFBeUY7UUFDekYsMkRBQTJEO1FBQzNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFFLElBQUksS0FBSyxJQUFJLENBQUM7WUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzdELE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNIO2lEQUM2QztJQUNyQyxVQUFVLENBQUMsT0FBdUIsRUFBRSxJQUFzQjtRQUNoRSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUMvQixJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QyxPQUFPLG1CQUFtQixDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEcsQ0FBQztJQUVELDBGQUEwRjtJQUNsRixLQUFLLENBQUMsV0FBVyxDQUN2QixPQUF1QixFQUN2QixJQUFzQixFQUN0QixTQUErQjtRQUUvQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUMvQixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztRQUN6Qyw2RkFBNkY7UUFDN0YseUZBQXlGO1FBQ3pGLE1BQU0sTUFBTSxHQUFHLElBQUk7WUFDakIsQ0FBQyxDQUFDLE1BQU0sb0JBQW9CLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ3JGLE9BQU8sQ0FBQyxJQUFJLENBQUMsMEVBQTBFLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQzlGLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQyxDQUFDO1lBQ0osQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNULE1BQU0sTUFBTSxHQUFHLE1BQU07WUFDbkIsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7Z0JBQzlCLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtnQkFDckIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO2dCQUNyQixLQUFLLEVBQUUsa0JBQWtCLENBQUMsU0FBUyxDQUFDO2FBQ3JDLENBQUM7WUFDSixDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDdEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUMxRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCx3R0FBd0c7SUFDaEcsS0FBSyxDQUFDLFlBQVksQ0FDeEIsT0FBdUIsRUFDdkIsSUFBc0IsRUFDdEIsU0FBK0I7UUFFL0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDL0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUM3Qiw0RUFBNEU7UUFDNUUsMEVBQTBFO1FBQzFFLE1BQU0sS0FBSyxHQUFHLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTVDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN0Qix5RUFBeUU7WUFDekUsd0NBQXdDO1lBQ3hDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDO2dCQUFFLE9BQU8scUJBQXFCLENBQUM7WUFDOUQsMkVBQTJFO1lBQzNFLDBFQUEwRTtZQUMxRSw0RUFBNEU7WUFDNUUsMkNBQTJDO1lBQzNDLE9BQU8saUJBQWlCLENBQUMsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDcEUsTUFBTSxFQUFFLENBQUMsbUJBQW1CLENBQUM7Z0JBQzdCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztnQkFDckIsS0FBSzthQUNOLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDOUIsTUFBTSxNQUFNLEdBQWtCLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakUsSUFBSSxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUNoQyxNQUFNLElBQUksR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO29CQUMzQyxNQUFNLEVBQUUscUJBQXFCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztvQkFDMUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO29CQUNyQixLQUFLO2lCQUNOLENBQUMsQ0FBQztnQkFDSCxnRkFBZ0Y7Z0JBQ2hGLGtDQUFrQztnQkFDbEMsTUFBTSxXQUFXLEdBQUcsaUJBQWlCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNyRCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsTUFBTSxJQUFJLFdBQVcsS0FBSyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQzlELE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDdkMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO3dCQUM3QyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUMxQixJQUFJLENBQUMsS0FBSyxXQUFXLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQzs0QkFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3hELENBQUM7Z0JBQ0gsQ0FBQztnQkFDRCxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFDRCxzRUFBc0U7WUFDdEUsd0NBQXdDO1lBQ3hDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekQsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsaUZBQWlGO0lBQ2pGLGdCQUFnQixDQUFDLE1BQW9CLEVBQUUsSUFBc0IsRUFBRSxRQUEyQixJQUFJO1FBQzVGLE9BQU8sdUJBQXVCLENBQzVCLE1BQU0sRUFDTixJQUFJLEVBQ0osSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUNqQyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFDNUIsS0FBSyxDQUNOLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFFRDs0RkFDNEY7QUFDNUYsU0FBUyxXQUFXLENBQUMsR0FBd0IsRUFBRSxJQUFzQixFQUFFLElBQWlCO0lBQ3RGLE1BQU0sSUFBSSxHQUFHLGVBQWUsQ0FBQyxHQUFHLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztJQUMzRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hELE1BQU0sS0FBSyxHQUFHLElBQUksRUFBRSxXQUFXLElBQUksQ0FBQyxDQUFDO0lBQ3JDLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQzVFLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ2pHLE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEgsQ0FBQztBQUVELDRFQUE0RTtBQUM1RSxTQUFTLG9CQUFvQixDQUFDLEdBQXdCLEVBQUUsS0FBOEI7SUFDcEYsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO0lBQy9DLE1BQU0sU0FBUyxHQUFHLElBQUksWUFBWSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM5QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDL0IsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQixTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUIsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLE1BQU0sQ0FBQyxPQUF1QixFQUFFLEtBQWE7SUFDcEQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztJQUM5QixJQUFJLE9BQU8sQ0FBQyxRQUFRLElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDN0MsT0FBTztRQUNMLEdBQUcsRUFBRSxjQUFjLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxjQUFjLENBQUM7UUFDbkQsT0FBTyxFQUFFLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQztRQUNqRSxLQUFLO1FBQ0wsV0FBVyxFQUFFLDZCQUE2QixHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0tBQ2pFLENBQUM7QUFDSixDQUFDO0FBRUQ7MkNBQzJDO0FBQzNDLE1BQU0sVUFBVSxZQUFZLENBQUMsS0FBa0IsRUFBRSxNQUFzQztJQUNyRixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRSxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckMsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RixDQUFDO0FBRUQsaUZBQWlGO0FBQ2pGLE1BQU0sVUFBVSxhQUFhLENBQUMsT0FBMEIsRUFBRSxPQUFxQjtJQUM3RSxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTztRQUFFLE9BQU8sT0FBTyxDQUFDO0lBQ3pDLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwb2ludFN5bWJvbENvZGUgfSBmcm9tICduYXBhcmktanMnO1xuaW1wb3J0IHR5cGUgeyBJbWFnZUxheWVyLCBQb2ludHNMYXllciwgVmlld2VyIH0gZnJvbSAnbmFwYXJpLWpzJztcblxuaW1wb3J0IHsgSUhpc3RvZ3JhbSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jaGFubmVsLWhpc3RvZ3JhbS1hcGkuY29udHJhY3QnO1xuaW1wb3J0IHtcbiAgTk9fQ0FURUdPUlksXG4gIFNwYXRpYWxDb2x1bW4sXG4gIFNwYXRpYWxEYXRhc2V0LFxuICBTcGF0aWFsSW1hZ2VSZWYsXG4gIFNwYXRpYWxPYnNlcnZhdGlvbnMsXG4gIGlzQ2F0ZWdvcmljYWxDb2x1bW4sXG59IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHsgU3BhdGlhbFZpZXdTdGF0ZSwgVHJhbnNjcmlwdEdseXBoTmFtZSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9kaXNwbGF5LXR5cGVzJztcbmltcG9ydCB7IGVuY29kZUNhdGVnb3JpY2FsLCBtYXJrZXJEaWFtZXRlcnMsIHJlc29sdmVDYXRlZ29yeUNvbG9ycyB9IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1lbmNvZGluZyc7XG5pbXBvcnQge1xuICBTcGF0aWFsU2VsZWN0aW9uTWFzayxcbiAgZW1wdHlTZWxlY3Rpb24sXG4gIG1hc2tUb0luZGljZXMsXG4gIG11dGVkRnJvbVNlbGVjdGlvbixcbn0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLXNlbGVjdGlvbic7XG5pbXBvcnQgeyBmcmFtZVBvc2l0aW9ucyB9IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1mcmFtaW5nJztcbmltcG9ydCB7IFBJWEVMX1dPUkxEX1FVQU5UVU0sIHdvcmxkUXVhbnR1bUZvckV4dGVudCB9IGZyb20gJy4uLy4uL3NwYXRpYWwvd29ybGQtZ3JpZCc7XG5pbXBvcnQgeyBvYnNlcnZhdGlvbnNJblNsaWNlLCB2b2x1bWVJbWFnZVJlZiB9IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC12b2x1bWUtaW1hZ2UnO1xuaW1wb3J0IHsgY2VsbFR5cGVDb2x1bW5Gb3IgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtdGlsZXMnO1xuaW1wb3J0IHsgb2JzZXJ2YXRpb25HZW5lTWFzaywgb2JzZXJ2YXRpb25HZW5lU3R5bGUgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtZ2VuZS1maWx0ZXInO1xuaW1wb3J0IHsgRXhwcmVzc2lvbkZpZWxkLCBjb2xvckV4cHJlc3Npb25GaWVsZCwgZmllbGRDb250cmFzdFdpbmRvdyB9IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1leHByZXNzaW9uJztcbmltcG9ydCB7IGNvbXB1dGVFeHByZXNzaW9uRmllbGRBc3luYyB9IGZyb20gJy4uLy4uL3dvcmtlcnMvc3BhdGlhbC1tYXRoJztcbmltcG9ydCB7IFN1cGVyc2VkZSB9IGZyb20gJy4uLy4uL3V0aWwvc3VwZXJzZWRlJztcbmltcG9ydCB7IGlzQWJvcnRFcnJvciB9IGZyb20gJy4uL3RpbGUtc2VydmVyJztcbmltcG9ydCB7IE5hcGFyaVNwYXRpYWxUaWxlTGF5ZXJzIH0gZnJvbSAnLi9uYXBhcmktc3BhdGlhbC10aWxlcyc7XG5pbXBvcnQgeyBHTFlQSF9TWU1CT0xTIH0gZnJvbSAnLi9zcGF0aWFsLXRpbGVzL3RyYW5zY3JpcHQtbGF5ZXJzJztcbmltcG9ydCB7IEltYWdlMmRTY2VuZSB9IGZyb20gJy4vbmFwYXJpLWltYWdlLTJkLXNjZW5lJztcbmltcG9ydCB7XG4gIEdFTkVfTUFQX01BWF9TSURFLFxuICBHRU5FX01BUF9TSUdNQSxcbiAgU1BBVElBTF9GQUxMQkFDS19SQURJVVMsXG4gIFNQQVRJQUxfTkVVVFJBTF9DT0xPUixcbiAgU1BBVElBTF9ORVVUUkFMX0hFWCxcbiAgU1BBVElBTF9TTElDRV9NSU5fRElBTUVURVJfUFgsXG4gIFBvaW50Q29sb3JzLFxuICBlbmNvZGVTcGF0aWFsQ29udGludW91cyxcbiAgZ2F0aGVyQ29sb3JzLFxuICBoaWRlVW5zaG93bixcbn0gZnJvbSAnLi9uYXBhcmktc3BhdGlhbC1lbmNvZGluZyc7XG5pbXBvcnQgeyBTcGF0aWFsU2NlbmVCYXNlLCBTcGF0aWFsU2Vzc2lvbiwgU3BhdGlhbFRpbGVPd25lciB9IGZyb20gJy4vbmFwYXJpLXNwYXRpYWwtc2NlbmUnO1xuaW1wb3J0IHR5cGUgeyBOYXBhcmlTY2VuZSwgU2NlbmVDb250ZXh0IH0gZnJvbSAnLi9uYXBhcmktc2NlbmUnO1xuXG4vKiogVGhlIHBsYW5lIGEgdm9sdW1lLWJhY2tlZCBkYXRhc2V0IGlzIHNob3dpbmcgKHNlZSB7QGxpbmsgU3BhdGlhbDJkU2NlbmUuc2xhYn0pLiAqL1xuaW50ZXJmYWNlIFNsYWIge1xuICByZWY6IFNwYXRpYWxJbWFnZVJlZjtcbiAgaW5kaWNlczogVWludDMyQXJyYXk7XG4gIHNsaWNlOiBudW1iZXI7XG4gIG1pbkRpYW1ldGVyOiBudW1iZXI7XG59XG5cbi8qKlxuICogU1BBVElBTF9PTUlDUyAocmV2aWV3IEFwcGVuZGl4IEIsIGNsdXN0ZXIgSik6IHRoZSB0aXNzdWUgaW1hZ2UgKGFuIHtAbGluayBJbWFnZTJkU2NlbmV9KSB3aXRoIG9uZVxuICogbWFya2VyIHBlciBvYnNlcnZhdGlvbiwgY29sb3VyZWQgYnkgYW4gYW5ub3RhdGlvbiBjb2x1bW4gb3IgYSBnZW5lLCB0aGUgZ2VuZSBtYXAgdW5kZXIgdGhlXG4gKiBjZWxscywgYW5kIHRoZSBsZXZlbC1vZi1kZXRhaWwgdGlsZSBsYXllcnMgKG91dGxpbmVzLCB0cmFuc2NyaXB0cywgZGVuc2l0eSkgb3ZlciB0aGVtLiBUaGVcbiAqIG1hcmtlcnMgcmVidWlsZCB3aGVuZXZlciB0aGUgZGF0YXNldCBvciB0aGUgdmlldyBzdGF0ZSBjaGFuZ2VzLCBzbyBzd2l0Y2hpbmcgdGhlIGNvbG91ci1ieVxuICogY29sdW1uIGRvZXMgbm90IHJlbW91bnQgdGhlIHNjZW5lLlxuICpcbiAqIFNldHMgdXAgdGhlIGZ1bGwgMkQgaW50ZXJhY3Rpb24gc3RhY2sg4oCUIHJlZ2lvbiBvdmVybGF5LCBwaXhlbCB0b29scywgcmVhZGJhY2sgY3VycmVuY3kg4oCUIGV4YWN0bHlcbiAqIGFzIHRoZSBwbGFpbiBpbWFnZSB2aWV3IGRvZXMuIFRoYXQgaXMgTk9UIG9wdGlvbmFsIGhlcmU6IHRoaXMgbW9kZSdzIHNlbGVjdGlvbiBpcyBkcml2ZW4gYnlcbiAqIGRyYXduIFJPSXMsIHNvIHdpdGhvdXQgdGhlIG92ZXJsYXkgdGhlcmUgaXMgbm8gd2F5IHRvIG1ha2UgYSBzZWxlY3Rpb24gYXQgYWxsLlxuICovXG5leHBvcnQgY2xhc3MgU3BhdGlhbDJkU2NlbmUgZXh0ZW5kcyBTcGF0aWFsU2NlbmVCYXNlIGltcGxlbWVudHMgTmFwYXJpU2NlbmUsIFNwYXRpYWxUaWxlT3duZXIge1xuICByZWFkb25seSBpbWFnZTogSW1hZ2UyZFNjZW5lO1xuICAvKiogVGhlIG9ic2VydmF0aW9uIG1hcmtlcnMsIGFuZCB3aGljaCBkYXRhc2V0L3BsYW5lIHRoZXkgd2VyZSBidWlsdCBmb3Ig4oCUIHNvIGEgZGlzcGxheS1vbmx5XG4gICAqICBjaGFuZ2UgKHNpemUsIGNvbG91ciwgb3BhY2l0eSwgc2VsZWN0aW9uKSBjYW4gdXBkYXRlIHRoZW0gaW4gcGxhY2UuICovXG4gIHByaXZhdGUgcG9pbnRzOiBQb2ludHNMYXllciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxheWVyS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSBvYnNlcnZhdGlvbiBlYWNoIG1hcmtlciBpcywgaW4gZHJhdyBvcmRlcjsgbnVsbCB3aGVuIGV2ZXJ5IG9ic2VydmF0aW9uIGlzIGRyYXduLiAqL1xuICBwcml2YXRlIGRyYXduOiBVaW50MzJBcnJheSB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGdlbmUgbWFwJ3MgbGF5ZXIgYW5kIHRoZSBpbnB1dHMgaXQgd2FzIGNvbG91cmVkIGZvciAoaXRzIGZpZWxkIGlzIGNhY2hlZCBpbiB0aGUgc2Vzc2lvbixcbiAgICogIG9uIGEgY2xvY2sgb2YgaXRzIG93bikuICovXG4gIGdlbmVNYXBMYXllcjogSW1hZ2VMYXllciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGdlbmVNYXBLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGRhdGFzZXQgdGhlIGNhbWVyYSBoYXMgYmVlbiBmcmFtZWQgb24g4oCUIHNlZSB7QGxpbmsgZnJhbWVPbmNlfS4gKi9cbiAgcHJpdmF0ZSBmcmFtZWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGdlbmUtbWFwIGVzdGltYXRlIGluIGZsaWdodCAob2ZmIHRoZSBtYWluIHRocmVhZCBwYXN0IHRoZSB3b3JrZXIgdGhyZXNob2xkLFxuICAgKiAgU1BBVElBTC0xOSk6IGEgbmV3IGZpZWxkIGtleSBzdXBlcnNlZGVzIOKAlCBhbmQgYWJvcnRzIOKAlCBpdDsgYSByZWJ1aWxkIHRoYXQgbGVhdmVzIHRoZSBrZXlcbiAgICogIGFsb25lIGxldHMgaXQgZmluaXNoLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGdlbmVNYXBMb2FkcyA9IG5ldyBTdXBlcnNlZGUoKTtcblxuICAvKiogYG5vSW1hZ2VgOiBhbiBpbWFnZS1sZXNzIGRhdGFzZXQgb3BlbmVkIGJlZm9yZSBhbnkgaW1hZ2Ug4oCUIHRoZSBvYnNlcnZhdGlvbnMgYWxvbmUuICovXG4gIGNvbnN0cnVjdG9yKGN0eDogU2NlbmVDb250ZXh0LCBzZXNzaW9uOiBTcGF0aWFsU2Vzc2lvbiwgbm9JbWFnZSA9IGZhbHNlKSB7XG4gICAgc3VwZXIoY3R4LCBzZXNzaW9uLCBmYWxzZSk7XG4gICAgdGhpcy5pbWFnZSA9IG5ldyBJbWFnZTJkU2NlbmUoY3R4LCB7XG4gICAgICBpbWFnZTogIW5vSW1hZ2UsXG4gICAgICAvLyBPbmx5IGZpdCB0byB0aGUgaW1hZ2Ugd2hlbiB0aGlzIGRhdGFzZXQgYWN0dWFsbHkgaGFzIG9uZS4gT3RoZXJ3aXNlIHRoZXJlIGlzIG5vdGhpbmcgdG9cbiAgICAgIC8vIGZpdCwgdGhlIGltYWdlIHNpemUgc3RpbGwgaG9sZHMgdGhlIExBU1QgaW1hZ2UncyBkaW1lbnNpb25zLCBhbmQgdGhpcyBmaXRzIHRvIHRob3NlIOKAlCBhbmRcbiAgICAgIC8vIGJlY2F1c2UgaXQgZGVmZXJzIHRvIGEgZnJhbWUsIGl0IGxhbmRzIEFGVEVSIHRoZSBwb2ludHMgYXJlIGFkZGVkIGFuZCBvdmVyd3JpdGVzIHRoZVxuICAgICAgLy8gZnJhbWluZyB0aGV5IHNldC4gVGhhdCBpcyB3aGF0IGxlZnQgYW4gaW1hZ2UtbGVzcyBkYXRhc2V0IGFzIGEgdGVuLXBpeGVsIHNwZWNrLlxuICAgICAgZml0OiAoKSA9PiAhIXNlc3Npb24ubGF0ZXN0Py5bMF0/LmltYWdlUmVmLFxuICAgICAgb25TbGljZTogKHJlcmVuZGVyZWQpID0+IHtcbiAgICAgICAgdGhpcy5yZWRyYXdNYXJrZXJzKCk7XG4gICAgICAgIC8vIFRoZSBzdGl0Y2hlZCByZS1yZW5kZXIgY2xlYXJlZCB0aGUgY2VsbHMsIHRyYW5zY3JpcHRzIGFuZCBkZW5zaXR5IHRvbzogcmUtcGxhbiB0aGVtIG5vd1xuICAgICAgICAvLyByYXRoZXIgdGhhbiBhdCB0aGUgbmV4dCBjYW1lcmEgbW92ZSAoZWFjaCBncm91cCByZWRyYXdzIG9ubHkgd2hhdCBsZWZ0IHRoZSBzY2VuZSkuXG4gICAgICAgIGlmIChyZXJlbmRlcmVkKSB0aGlzLnNlc3Npb24udGlsZXM/LnJlZnJlc2goKTtcbiAgICAgIH0sXG4gICAgICBvbk5hdmlnYXRvckludGVyYWN0OiAoKSA9PiB0aGlzLmhvdmVyLmhpZGUoKSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIG1vdW50KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzO1xuICAgIGF3YWl0IHRoaXMuaW1hZ2UubW91bnQoKTtcbiAgICAvLyBEaXNwb3NlZCB3aGlsZSB0aGUgaW1hZ2UgbG9hZGVkOiBjbGFpbWluZyB0aGUgdGlsZXMgbm93IHdvdWxkIHRha2UgdGhlbSBmcm9tIHRoZSBuZXh0IHNjZW5lLFxuICAgIC8vIGFuZCB0aGUgc3BhdGlhbCBzdWJzY3JpcHRpb24gd291bGQgb3V0bGl2ZSB0aGlzIG9uZS5cbiAgICBpZiAoY3R4LnNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gICAgdGhpcy5ob3Zlci5pbnN0YWxsKGN0eC5ob3N0KTtcbiAgICB0aGlzLnNlc3Npb24uY2xhaW1UaWxlcyh0aGlzKT8uYXR0YWNoKGN0eC52aWV3ZXIpO1xuICAgIHRoaXMuc3Vic2NyaWJlU3BhdGlhbCgpO1xuICAgIGN0eC50b29scy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gIH1cblxuICBzZXRaKHo6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuaW1hZ2Uuc2V0Wih6KTtcbiAgfVxuXG4gIGhpc3RvZ3JhbShjaGFubmVsOiBudW1iZXIsIGJpbnM6IG51bWJlcik6IElIaXN0b2dyYW0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5pbWFnZS5oaXN0b2dyYW0oY2hhbm5lbCwgYmlucyk7XG4gIH1cblxuICBzZXRJbWFnZVNtb290aGluZyhlbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5pbWFnZS5zZXRJbWFnZVNtb290aGluZyhlbmFibGVkKTtcbiAgfVxuXG4gIHNldE5hdmlnYXRvclZpc2libGUodmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuaW1hZ2Uuc2V0TmF2aWdhdG9yVmlzaWJsZSh2aXNpYmxlKTtcbiAgfVxuXG4gIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwb3NlU3BhdGlhbCgpO1xuICAgIHRoaXMuZ2VuZU1hcExvYWRzLmNhbmNlbCgpO1xuICAgIHRoaXMuc2Vzc2lvbi5yZWxlYXNlVGlsZXModGhpcyk7XG4gICAgdGhpcy5pbWFnZS5kaXNwb3NlKCk7XG4gIH1cblxuICBjYW52YXNTaXplKCk6IFtudW1iZXIsIG51bWJlcl0ge1xuICAgIHJldHVybiBbdGhpcy5jdHguY2FudmFzLmNsaWVudFdpZHRoID8/IDAsIHRoaXMuY3R4LmNhbnZhcy5jbGllbnRIZWlnaHQgPz8gMF07XG4gIH1cblxuICBwb2x5Z29uc1Nob3duQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wb2ludHMpIHRoaXMucG9pbnRzLnZpc2libGUgPSB0aGlzLnBvaW50c1Zpc2libGUoKTtcbiAgICB0aGlzLmN0eC52aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFmdGVyQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuc2Vzc2lvbi50aWxlcz8ucmVmcmVzaCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGhvdmVyVGlsZXMoKTogTmFwYXJpU3BhdGlhbFRpbGVMYXllcnMgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uLnRpbGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBvYnNlcnZhdGlvbiB1bmRlciBhIGNsaWVudCBwb3NpdGlvbjogbmFwYXJpLWpzJ3MgcGljayBvbiB0aGUgbWFya2VyIGxheWVyIGl0c2VsZiAoYSBncmlkXG4gICAqIG92ZXIgaXRzIHBvc2l0aW9ucywgcmVidWlsdCBvbmx5IHdoZW4gdGhleSBjaGFuZ2UpLCBzbyB0aGUgdG9vbHRpcCBjYW5ub3QgbmFtZSBhIGNlbGwgdGhhdCBpc1xuICAgKiBub3QgZHJhd24sIHRoZW4gdGhlIGRyYXduIGluZGV4IG1hcHBlZCBiYWNrIHRvIHRoZSBvYnNlcnZhdGlvbi5cbiAgICpcbiAgICogQSBtYXJrZXIgaXMgaGl0IGFueXdoZXJlIG9uIGl0cyBkcmF3biBkaXNjLCBvciB3aXRoaW4gYHNsYWNrUHhgIHNjcmVlbiBwaXhlbHMgb2YgaXRzIGNlbnRyZVxuICAgKiB3aGVuIGl0IGlzIHNtYWxsZXIgdGhhbiB0aGF0IChhIDEuNSBweCBkb3Qgc3RpbGwgaGFzIHRvIGJlIGhvdmVyYWJsZSksIGFuZCBvZiBzZXZlcmFsIGhpdHMgdGhlXG4gICAqIE5FQVJFU1QgY2VudHJlIHdpbnMgKGFuIGV4YWN0IHRpZSBnb2VzIHRvIHRoZSBvbmUgZHJhd24gb24gdG9wKS4gTm90IG5hcGFyaSdzIGAndG9wbW9zdCdgOiB0aGVcbiAgICogc2xhY2sgaXMgd2lkZXIgdGhhbiBtb3N0IG1hcmtlcnMsIGFuZCBvdmVyIGEgZGVuc2UgZmllbGQgb2Ygc21hbGwgb25lcyBcInRoZSBsYXN0IGRyYXduIHdpdGhpblxuICAgKiAxMCBweFwiIG5hbWVzIGEgbmVpZ2hib3VyIHJhdGhlciB0aGFuIHRoZSBjZWxsIHVuZGVyIHRoZSBjdXJzb3IuXG4gICAqL1xuICBwcm90ZWN0ZWQgcGlja09ic2VydmF0aW9uKGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyLCBzbGFja1B4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHBvaW50cyA9IHRoaXMucG9pbnRzO1xuICAgIGlmICghcG9pbnRzKSByZXR1cm4gLTE7XG4gICAgY29uc3Qgdmlld2VyID0gdGhpcy5jdHgudmlld2VyO1xuICAgIGNvbnN0IFt3eCwgd3ldID0gdmlld2VyLmNhbnZhc1RvV29ybGQoY2xpZW50WCwgY2xpZW50WSk7XG4gICAgY29uc3Qgem9vbSA9IHZpZXdlci5jYW1lcmEuem9vbTtcbiAgICBjb25zdCBrID0gcG9pbnRzLnBpY2sod3gsIHd5LCB7IHRvbGVyYW5jZTogc2xhY2tQeCAvICh6b29tID4gMCA/IHpvb20gOiAxKSwgdGllQnJlYWs6ICduZWFyZXN0JyB9KTtcbiAgICBpZiAoayA8IDApIHJldHVybiAtMTtcbiAgICByZXR1cm4gdGhpcy5kcmF3biA/IHRoaXMuZHJhd25ba10gOiBrO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG1hcmtlcnMgYXJlIGRyYXduOiB3aGVuIHRoZSB1c2VyIHdhbnRzIHRoZW0sIGFuZCBub3Qgd2hpbGUgY2VsbCBvdXRsaW5lcyBhcmUgb25cbiAgICogc2NyZWVuIOKAlCB0aGVuIGEgY2VsbCBJUyBpdHMgb3V0bGluZSwgYW5kIGEgY2lyY2xlIG9uIHRvcCBvZiBpdCBpcyBub2lzZS4gWm9vbWVkIG91dCBwYXN0IHRoZVxuICAgKiBvdXRsaW5lIHRocmVzaG9sZCwgdGhlIGNpcmNsZXMgc3RhbmQgaW4gZm9yIHRoZSBjZWxscy5cbiAgICovXG4gIHByaXZhdGUgcG9pbnRzVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5zZXNzaW9uLmxhdGVzdD8uWzFdO1xuICAgIHJldHVybiAodmlldz8uc2hvd1BvaW50cyA/PyB0cnVlKSAmJiAhdGhpcy5zZXNzaW9uLnRpbGVzPy5vdXRsaW5lc1Nob3duO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZHJhdyB0aGUgbWFya2VycyBvdmVyIGEgZnJlc2hseSByZW5kZXJlZCBpbWFnZS4gVHdvIHJlYXNvbnMsIGJvdGggaW52aXNpYmxlIGZyb20gdGhlXG4gICAqIHNwYXRpYWwgc3RvcmUg4oCUIHdoaWNoIGlzIHdoeSBhIHNjcnViIG9yIGEgcmUtcmVuZGVyIG5ldmVyIHJlYWNoZWQgdGhlIG1hcmtlcnMgb24gaXRzIG93bjpcbiAgICogIC0gdGhlIGltYWdlIHJlbmRlciBDTEVBUlMgdGhlIGxheWVyIGxpc3QsIHRha2luZyB0aGUgbWFya2VycyB3aXRoIGl0O1xuICAgKiAgLSBvdmVyIGEgdm9sdW1lLWJhY2tlZCBkYXRhc2V0IHRoZSBkaXNwbGF5ZWQgcGxhbmUgZGVjaWRlcyB3aGljaCBvYnNlcnZhdGlvbnMgYmVsb25nIG9uXG4gICAqICAgIHNjcmVlbiBhdCBhbGwsIHNvIHRoZSBjZWxscyBoYXZlIHRvIG1vdmUgd2l0aCB0aGUgc2VjdGlvbiByYXRoZXIgdGhhbiBoYW5nIG92ZXIgYW5vdGhlci5cbiAgICovXG4gIHByaXZhdGUgcmVkcmF3TWFya2VycygpOiB2b2lkIHtcbiAgICBjb25zdCBsYXRlc3QgPSB0aGlzLnNlc3Npb24ubGF0ZXN0O1xuICAgIGlmICghbGF0ZXN0Py5bMF0pIHJldHVybjtcbiAgICB2b2lkIHRoaXMucmVidWlsZCguLi5sYXRlc3QpO1xuICB9XG5cbiAgLyoqIChSZSlidWlsZCB0aGUgb2JzZXJ2YXRpb24gbWFya2VyIGxheWVyIGZvciB0aGUgY3VycmVudCBkYXRhc2V0ICsgdmlldyBzdGF0ZS4gKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHJlYnVpbGQoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQgfCBudWxsLFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayA9IGVtcHR5U2VsZWN0aW9uKCksXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZpZXdlciA9IHRoaXMuY3R4LnZpZXdlcjtcbiAgICBjb25zdCB0YXNrID0gdGhpcy5yZWJ1aWxkcy5uZXh0KCk7XG5cbiAgICAvLyBSZXNvbHZlIGNvbG91cnMgQkVGT1JFIHRvdWNoaW5nIHRoZSBzY2VuZTogYSBnZW5lIGZldGNoIGNhbiBmYWlsIG9yIGJlXG4gICAgLy8gc3VwZXJzZWRlZCwgYW5kIGRyb3BwaW5nIHRoZSBleGlzdGluZyBsYXllciBmaXJzdCB3b3VsZCBibGFuayB0aGUgdmlldy5cbiAgICBsZXQgZmFjZUNvbG9yOiBQb2ludENvbG9ycztcbiAgICBsZXQgc3ltYm9sczogVWludDhBcnJheSB8IG51bGwgPSBudWxsO1xuICAgIGxldCBzaG93bjogVWludDhBcnJheSB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IGVuZExvYWRpbmcgPSB0aGlzLmN0eC5iYWRnZS5iZWdpbignT2JzZXJ2YXRpb25zJyk7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFdoaWNoIG9ic2VydmF0aW9ucyB0aGUgZ2VuZSBmaWx0ZXIga2VlcHMsIHNldHRsZWQgYXBhcnQgZnJvbSB0aGVpciBjb2xvdXJzOiBhIGNvbG91ciBjYW5cbiAgICAgIC8vIGZhbGwgYmFjayB0byBhIGZsYXQgb25lLCB0aGUgZmlsdGVyIGNhbm5vdC4gRHJhd24gd2l0aG91dCBpdCwgZXZlcnkgb2JzZXJ2YXRpb24gd291bGRcbiAgICAgIC8vIHNob3cgYXMgaWYgaXQgZXhwcmVzc2VkIHRoZSBwaWNrZWQgZ2VuZXMuIFNvIGEgZmFpbGVkIHJlYWQga2VlcHMgdGhlIG1hcmtlcnMgYXMgdGhleVxuICAgICAgLy8gd2VyZSBkcmF3biwgYW5kIHRoZSBwYW5lbCBzYXlzIHRoZSBmaWx0ZXIgY291bGQgbm90IGJlIGFwcGxpZWQuXG4gICAgICB0cnkge1xuICAgICAgICBzaG93biA9IGRhdGFzZXQgPyBhd2FpdCB0aGlzLmZpbHRlck1hc2soZGF0YXNldCwgdmlldykgOiBudWxsO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gZ2VuZSBmaWx0ZXIgY291bGQgbm90IGJlIGFwcGxpZWQg4oCUIGtlZXBpbmcgdGhlIG9ic2VydmF0aW9ucyBhcyBkcmF3bicsIGVycik7XG4gICAgICAgIGlmICh0YXNrKCkpIHRoaXMuc2Vzc2lvbi5yZXBvcnRHZW5lRmlsdGVyKHRydWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzdHlsZSA9IGRhdGFzZXQgPyBhd2FpdCB0aGlzLm1hcmtlclN0eWxlKGRhdGFzZXQsIHZpZXcsIHNlbGVjdGlvbikgOiBudWxsO1xuICAgICAgICBmYWNlQ29sb3IgPSBzdHlsZT8uY29sb3JzID8/IFNQQVRJQUxfTkVVVFJBTF9DT0xPUjtcbiAgICAgICAgc3ltYm9scyA9IHN0eWxlPy5zeW1ib2xzID8/IG51bGw7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSBzcGF0aWFsIGNvbG91cmluZyBmYWlsZWQg4oCUIGZhbGxpbmcgYmFjayB0byBhIGZsYXQgY29sb3VyJywgZXJyKTtcbiAgICAgICAgZmFjZUNvbG9yID0gU1BBVElBTF9ORVVUUkFMX0NPTE9SO1xuICAgICAgICBzeW1ib2xzID0gbnVsbDtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgZW5kTG9hZGluZygpO1xuICAgIH1cbiAgICAvLyBBIG5ld2VyIHJlYnVpbGQgKG9yIGEgdGVhcmRvd24pIHN0YXJ0ZWQgd2hpbGUgdGhlIHZlY3RvciB3YXMgaW4gZmxpZ2h0LlxuICAgIGlmICghdGFzaygpKSByZXR1cm47XG4gICAgdGhpcy5zZXNzaW9uLnJlcG9ydEdlbmVGaWx0ZXIoZmFsc2UpO1xuICAgIC8vIFRoZSBmaWx0ZXIgYXBwbGllcyB0byB3aGljaGV2ZXIgY29sb3VycyB3b24sIHRoZSBmYWxsYmFjaydzIGluY2x1ZGVkLlxuICAgIGlmIChzaG93biAmJiBkYXRhc2V0KSBmYWNlQ29sb3IgPSBoaWRlVW5zaG93bihmYWNlQ29sb3IsIHNob3duKTtcblxuICAgIGlmICghZGF0YXNldCB8fCBkYXRhc2V0Lm9ic2VydmF0aW9ucy5jb3VudCA9PT0gMCkge1xuICAgICAgdGhpcy5yZW1vdmVMYXllcnModmlld2VyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBIGRhdGFzZXQgd2hvc2UgaW1hZ2UgSVMgaXRzIHZvbHVtZSBzaG93cyBPTkUgUExBTkUgYXQgYSB0aW1lLCBzbyB0aGVcbiAgICAvLyBtYXJrZXJzIGFyZSB0aGUgb2JzZXJ2YXRpb25zIGluIHRoZSBkaXNwbGF5ZWQgcGxhbmUsIGRyYXduIGluIHRoYXQgcGxhbmUnc1xuICAgIC8vIHBpeGVsIGdyaWQuIFdpdGhvdXQgdGhlIGZpbHRlciB0aGUgc3BlY2ltZW4ncyB3aG9sZSBkZXB0aCBwaWxlcyBvbnRvIG9uZVxuICAgIC8vIHNlY3Rpb24gYW5kIHJlYWRzIGFzIGEgc21lYXI7IHdpdGhvdXQgdGhlIGFmZmluZSB0aGUgY29vcmRpbmF0ZXMgYXJlIHJlYWRcbiAgICAvLyBhcyBwaXhlbHMgYW5kIGxhbmQgb2ZmIHRoZSBzbGljZSBlbnRpcmVseS5cbiAgICBjb25zdCBzbGFiID0gc2xhYkF0KGRhdGFzZXQsIHRoaXMuY3R4LnooKSk7XG4gICAgLy8gVGhlIGdlbmUgbWFwIGdvZXMgVU5ERVIgdGhlIGNlbGxzLCBzbyBpdCBpcyBzZXR0bGVkIGJlZm9yZSB0aGV5IGFyZSBhZGRlZC5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZUdlbmVNYXAodmlld2VyLCBkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24sIHNsYWIpO1xuICAgIGlmICghdGFzaygpKSByZXR1cm47XG4gICAgdGhpcy5kcmF3TWFya2Vycyh2aWV3ZXIsIGRhdGFzZXQsIHZpZXcsIGZhY2VDb2xvciwgc2xhYiwgc3ltYm9scyk7XG4gIH1cblxuICAvKiogTm90aGluZyB0byBkcmF3OiBkcm9wIHRoZSBtYXJrZXJzIGFuZCB0aGUgZ2VuZSBtYXAuICovXG4gIHByaXZhdGUgcmVtb3ZlTGF5ZXJzKHZpZXdlcjogVmlld2VyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucG9pbnRzKSB7XG4gICAgICB2aWV3ZXIubGF5ZXJzLnJlbW92ZSh0aGlzLnBvaW50cyk7XG4gICAgICB0aGlzLnBvaW50cyA9IG51bGw7XG4gICAgICB0aGlzLmxheWVyS2V5ID0gbnVsbDtcbiAgICAgIHRoaXMuZHJhd24gPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy5nZW5lTWFwTGF5ZXIpIHtcbiAgICAgIHZpZXdlci5sYXllcnMucmVtb3ZlKHRoaXMuZ2VuZU1hcExheWVyKTtcbiAgICAgIHRoaXMuZ2VuZU1hcExheWVyID0gbnVsbDtcbiAgICAgIHRoaXMuZ2VuZU1hcEtleSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERyYXcgdGhlIG9ic2VydmF0aW9uIG1hcmtlcnMgb3ZlciB0aGUgaW1hZ2UgKGFuZCB0aGUgZ2VuZSBtYXApOiByZXN0eWxlZCBpbiBwbGFjZSBmb3IgYVxuICAgKiBkaXNwbGF5LW9ubHkgY2hhbmdlLCBlbHNlIGEgbmV3IGxheWVyLlxuICAgKi9cbiAgcHJpdmF0ZSBkcmF3TWFya2VycyhcbiAgICB2aWV3ZXI6IFZpZXdlcixcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCxcbiAgICB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIGZhY2VDb2xvcjogUG9pbnRDb2xvcnMsXG4gICAgc2xhYjogU2xhYiB8IG51bGwsXG4gICAgc3ltYm9sczogVWludDhBcnJheSB8IG51bGwgPSBudWxsLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBvYnMgPSBkYXRhc2V0Lm9ic2VydmF0aW9ucztcbiAgICBjb25zdCByZWYgPSBzbGFiPy5yZWYgPz8gZGF0YXNldC5pbWFnZVJlZjtcbiAgICBjb25zdCBzaXplID0gbWFya2VyU2l6ZXMob2JzLCB2aWV3LCBzbGFiKTtcblxuICAgIC8vIG5hcGFyaSdzIGltYWdlIHZpZXcgQ0xFQVJTIHRoZSB3aG9sZSBsYXllciBsaXN0IG9uIGV2ZXJ5IHJlbmRlciwgc28gdGhlXG4gICAgLy8gbWFya2VycyBnbyB3aXRoIGl0IHdoZW5ldmVyIHRoZSBpbWFnZSBpcyByZS1yZW5kZXJlZCDigJQgYSBzY3J1YiwgYSBjb250cmFzdFxuICAgIC8vIGNoYW5nZS4gVGhlIGNhY2hlZCBoYW5kbGUgaXMgdGhlbiBkZXRhY2hlZCwgYW5kIG11dGF0aW5nIGl0IGRyYXdzIG5vdGhpbmc6XG4gICAgLy8gdHJlYXQgYSBsYXllciB0aGF0IGlzIG5vIGxvbmdlciBpbiB0aGUgc2NlbmUgYXMgYWJzZW50IHNvIGl0IGdldHMgcmUtYWRkZWQuXG4gICAgaWYgKHRoaXMucG9pbnRzICYmICF2aWV3ZXIubGF5ZXJzLml0ZW1zLmluY2x1ZGVzKHRoaXMucG9pbnRzKSkge1xuICAgICAgdGhpcy5wb2ludHMgPSBudWxsO1xuICAgICAgdGhpcy5sYXllcktleSA9IG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hvd0ltYWdlID0gKCEhcmVmIHx8ICEhZGF0YXNldC52b2x1bWUpICYmIHZpZXcuc2hvd0ltYWdlICE9PSBmYWxzZTtcbiAgICAvLyBBIHNpemUvY29sb3VyL29wYWNpdHkvc2VsZWN0aW9uIGNoYW5nZSBpcyBESVNQTEFZLW9ubHk6IG11dGF0ZSB0aGUgbGF5ZXJcbiAgICAvLyByYXRoZXIgdGhhbiBkcm9wcGluZyBhbmQgcmUtYWRkaW5nIGl0LiBCb3RoIHNldHRlcnMgYnVtcCB0aGUgbGF5ZXInc1xuICAgIC8vIGRhdGFWZXJzaW9uLCB3aGljaCBpcyB3aGF0IG1ha2VzIG5hcGFyaS1qcyByZWJ1aWxkIHRoZSBpbnN0YW5jZSBidWZmZXIgYW5kXG4gICAgLy8gcmVkcmF3IOKAlCBhbmQgaXQgYXZvaWRzIHJlYnVpbGRpbmcgODRrIHBvc2l0aW9ucyB0byBjaGFuZ2Ugb25lIG51bWJlci5cbiAgICAvLyBUaGUgc2xpY2UgaXMgcGFydCBvZiB0aGUga2V5OiBhIHNjcnViIGNoYW5nZXMgV0hJQ0ggb2JzZXJ2YXRpb25zIGFyZSBkcmF3bixcbiAgICAvLyB3aGljaCBpcyBnZW9tZXRyeSwgbm90IGRpc3BsYXkuXG4gICAgY29uc3Qga2V5ID0gYCR7ZGF0YXNldC5pZH06JHtvYnMuY291bnR9OiR7c2xhYj8uc2xpY2UgPz8gJyd9YDtcbiAgICBpZiAodGhpcy5wb2ludHMgJiYga2V5ID09PSB0aGlzLmxheWVyS2V5KSB7XG4gICAgICB0aGlzLnBvaW50cy5zaXplID0gc2l6ZTtcbiAgICAgIHRoaXMucG9pbnRzLnZpc2libGUgPSB0aGlzLnBvaW50c1Zpc2libGUoKTtcbiAgICAgIHRoaXMucG9pbnRzLmZhY2VDb2xvciA9IGdhdGhlckNvbG9ycyhmYWNlQ29sb3IsIHNsYWI/LmluZGljZXMpO1xuICAgICAgdGhpcy5wb2ludHMuc3ltYm9scyA9IGdhdGhlclN5bWJvbHMoc3ltYm9scywgc2xhYj8uaW5kaWNlcyk7XG4gICAgICB0aGlzLmhpZGVGb3JlaWduSW1hZ2Uodmlld2VyLCBzaG93SW1hZ2UpO1xuICAgICAgdGhpcy5jdHgudG9vbHMucmVnaW9uT3ZlcmxheT8uc2V0UmVnaW9uc1Zpc2libGUodmlldy5zaG93QW5ub3RhdGlvbnMgIT09IGZhbHNlKTtcbiAgICAgIHZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucG9pbnRzKSB7XG4gICAgICB2aWV3ZXIubGF5ZXJzLnJlbW92ZSh0aGlzLnBvaW50cyk7XG4gICAgICB0aGlzLnBvaW50cyA9IG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZHJhd24gPSBzbGFiPy5pbmRpY2VzO1xuICAgIGNvbnN0IHBvc2l0aW9ucyA9IG9ic2VydmF0aW9uUG9zaXRpb25zKG9icywgZHJhd24pO1xuICAgIHRoaXMubGF5ZXJLZXkgPSBrZXk7XG4gICAgdGhpcy5kcmF3biA9IGRyYXduID8/IG51bGw7XG4gICAgdGhpcy5wb2ludHMgPSB2aWV3ZXIuYWRkUG9pbnRzKHBvc2l0aW9ucywge1xuICAgICAgbmFtZTogJ29ic2VydmF0aW9ucycsXG4gICAgICBzaXplLFxuICAgICAgZmFjZUNvbG9yOiBnYXRoZXJDb2xvcnMoZmFjZUNvbG9yLCBkcmF3biksXG4gICAgICAvLyBFYWNoIG9ic2VydmF0aW9uJ3MgZ2VuZSdzIGljb24gd2hpbGUgdGhleSBhcmUgY29sb3VyZWQgYnkgZ2VuZTsgdGhlIGxheWVyJ3MgZGlzYyBlbHNlLlxuICAgICAgc3ltYm9sczogZ2F0aGVyU3ltYm9scyhzeW1ib2xzLCBkcmF3biksXG4gICAgICAvLyBObyBib3JkZXI6IGF0IFZpc2l1bSBzcG90IGRlbnNpdHkgYW4gb3V0bGluZSBwZXIgbWFya2VyIHJlYWRzIGFzIG5vaXNlLFxuICAgICAgLy8gYW5kIGl0IGNvc3RzIGEgc2Vjb25kIGNvbG91ciBhcnJheS5cbiAgICAgIGJvcmRlcldpZHRoOiAwLFxuICAgICAgLy8gVGhlIGRhdGFzZXQncyBkYXRhLT53b3JsZCBhZmZpbmUuIFNwYXRpYWxEYXRhIHJlY29yZHMgb25lIHBlciBjb29yZGluYXRlXG4gICAgICAvLyBzeXN0ZW0gKFZpc2l1bSBzcG90IGNvb3JkcyBhcmUgaW4gdGhlIEZVTEwtcmVzb2x1dGlvbiBmcmFtZSB3aGlsZSB0aGVcbiAgICAgIC8vIHNlcnZlZCBpbWFnZSBtYXkgYmUgdGhlIGhpcmVzIGRvd25zY2FsZSksIHNvIHdpdGhvdXQgdGhpcyB0aGUgbWFya2Vyc1xuICAgICAgLy8gbGFuZCBpbiB0aGUgcmlnaHQgc2hhcGUgYXQgdGhlIHdyb25nIHNjYWxlLiBEZWZhdWx0cyB0byBpZGVudGl0eSB3aGVuXG4gICAgICAvLyB0aGUgY29vcmRpbmF0ZXMgYXJlIGFscmVhZHkgaW4gdGhlIGltYWdlJ3MgcGl4ZWwgc3BhY2UuXG4gICAgICBzY2FsZTogcmVmPy5zY2FsZSA/PyBbMSwgMV0sXG4gICAgICB0cmFuc2xhdGU6IHJlZj8udHJhbnNsYXRlID8/IFswLCAwXSxcbiAgICAgIHZpc2libGU6IHRoaXMucG9pbnRzVmlzaWJsZSgpLFxuICAgIH0pO1xuICAgIC8vIE91dGxpbmVzLCBkZW5zaXR5IGFuZCB0cmFuc2NyaXB0cyBnbyBiYWNrIG92ZXIgdGhlIG1hcmtlcnMganVzdCBhZGRlZC5cbiAgICB0aGlzLnNlc3Npb24udGlsZXM/LmFmdGVyT2JzZXJ2YXRpb25zKCk7XG4gICAgdGhpcy5mcmFtZU9uY2Uodmlld2VyLCBkYXRhc2V0LmlkLCBwb3NpdGlvbnMsICEhcmVmKTtcbiAgICB0aGlzLmhpZGVGb3JlaWduSW1hZ2Uodmlld2VyLCBzaG93SW1hZ2UpO1xuICAgIHRoaXMuY3R4LnRvb2xzLnJlZ2lvbk92ZXJsYXk/LnNldFJlZ2lvbnNWaXNpYmxlKHZpZXcuc2hvd0Fubm90YXRpb25zICE9PSBmYWxzZSk7XG4gICAgdGhpcy5zZXRSZWdpb25HcmlkRm9yKGRhdGFzZXQsIHBvc2l0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogVGVsbCB0aGUgcmVnaW9uIG92ZXJsYXkgaG93IGZpbmVseSBhIGRyYXduIHZlcnRleCBtYXkgYmUgcGxhY2VkLlxuICAgKlxuICAgKiBSZWdpb24gZ2VvbWV0cnkgaXMgc3RvcmVkIGluIHdob2xlIHdvcmxkIHVuaXRzLCB3aGljaCBpcyByaWdodCB3aGVuIHRoZSB3b3JsZCBJU1xuICAgKiBwaXhlbHMg4oCUIGEgcmVnaW9uIHNob3VsZCBhbGlnbiB0byB0aGVtLiBJdCBpcyB3cm9uZyBmb3IgYSBkYXRhc2V0IHRoYXQgcmVnaXN0ZXJzIG9udG9cbiAgICogbm8gaW1hZ2U6IHNlcUZJU0gncyBvYnNlcnZhdGlvbnMgc3BhbiBhYm91dCA1IHggNyB1bml0cyBpbiB0b3RhbCwgc28gd2hvbGUtdW5pdFxuICAgKiB2ZXJ0aWNlcyBsZWF2ZSByb3VnaGx5IHNpeCBieSBlaWdodCBwbGFjZWFibGUgcG9zaXRpb25zIGFjcm9zcyB0aGUgZW50aXJlIHNhbXBsZSBhbmRcbiAgICogYW4gUk9JIGNhbm5vdCBiZSBkcmF3biBhdCBhbnkgem9vbS4gTm90aGluZyBlcnJvcnM7IHRoZSB0b29sIGp1c3QgY2Fubm90IGV4cHJlc3MgdGhlXG4gICAqIHNoYXBlLlxuICAgKlxuICAgKiBLZXllZCBvbiB3aGV0aGVyIHRoZSBkYXRhc2V0IGJyaW5ncyBQSVhFTFMgcmF0aGVyIHRoYW4gb24gdGhlIGV4dGVudCwgYmVjYXVzZSB0aGVcbiAgICogZXh0ZW50IGNhbm5vdCB0ZWxsIHRoZSB0d28gYXBhcnQg4oCUIDIsMDAwIHVuaXRzIGlzIGEgc21hbGwgc2xpZGUgb3IgYSBsYXJnZSBzZWN0aW9uXG4gICAqIGRlcGVuZGluZyBvbmx5IG9uIHdoYXQgdGhlIHVuaXRzIGFyZSwgYW5kIG9ubHkgdGhlIGRhdGFzZXQga25vd3MuXG4gICAqL1xuICBwcml2YXRlIHNldFJlZ2lvbkdyaWRGb3IoZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHBvc2l0aW9uczogRmxvYXQzMkFycmF5KTogdm9pZCB7XG4gICAgY29uc3Qgb3ZlcmxheSA9IHRoaXMuY3R4LnRvb2xzLnJlZ2lvbk92ZXJsYXk7XG4gICAgaWYgKCFvdmVybGF5Py5zZXRXb3JsZFF1YW50dW0pIHJldHVybjtcbiAgICBpZiAoZGF0YXNldC5pbWFnZVJlZiB8fCBkYXRhc2V0LnZvbHVtZSkge1xuICAgICAgb3ZlcmxheS5zZXRXb3JsZFF1YW50dW0oUElYRUxfV09STERfUVVBTlRVTSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBtaW5YID0gSW5maW5pdHk7XG4gICAgbGV0IG1heFggPSAtSW5maW5pdHk7XG4gICAgbGV0IG1pblkgPSBJbmZpbml0eTtcbiAgICBsZXQgbWF4WSA9IC1JbmZpbml0eTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgY29uc3QgeCA9IHBvc2l0aW9uc1tpXTtcbiAgICAgIGNvbnN0IHkgPSBwb3NpdGlvbnNbaSArIDFdO1xuICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoeCkgfHwgIU51bWJlci5pc0Zpbml0ZSh5KSkgY29udGludWU7XG4gICAgICBpZiAoeCA8IG1pblgpIG1pblggPSB4O1xuICAgICAgaWYgKHggPiBtYXhYKSBtYXhYID0geDtcbiAgICAgIGlmICh5IDwgbWluWSkgbWluWSA9IHk7XG4gICAgICBpZiAoeSA+IG1heFkpIG1heFkgPSB5O1xuICAgIH1cbiAgICBvdmVybGF5LnNldFdvcmxkUXVhbnR1bSh3b3JsZFF1YW50dW1Gb3JFeHRlbnQobWF4WCAtIG1pblgsIG1heFkgLSBtaW5ZKSk7XG4gIH1cblxuICAvKipcbiAgICogSGlkZSB0aGUgaW1hZ2UgbGF5ZXIgZm9yIGEgZGF0YXNldCB0aGF0IGJyaW5ncyBubyBpbWFnZSBvZiBpdHMgb3duLlxuICAgKlxuICAgKiBUaGUgaG9zdCdzIHZpZXdlciBrZWVwcyB3aGF0ZXZlciBpbWFnZSB3YXMgbGFzdCBsb2FkZWQsIGFuZCBmb3IgYSBkYXRhc2V0IHRoYXRcbiAgICogcmVnaXN0ZXJzIG9udG8gbm9uZSB0aGF0IHBpY3R1cmUgYmVsb25ncyB0byBzb21ldGhpbmcgZWxzZSBlbnRpcmVseSDigJQgdGhlIGV4YW1wbGUnc1xuICAgKiBkZWZhdWx0IHNsaWRlLCBzYXkuIEl0IGlzIG5vdCBtZXJlbHkgaXJyZWxldmFudDogdGhlIHR3byBsaXZlIGluIGRpZmZlcmVudCBjb29yZGluYXRlXG4gICAqIHNwYWNlcyAoaW1hZ2UgcGl4ZWxzIGFnYWluc3QgdGhlIGVtYmVkZGluZydzIG93biB1bml0cyksIHNvIHRoZSBsZWZ0b3ZlciBpcyBtYWduaWZpZWRcbiAgICogcm91Z2hseSBhIGh1bmRyZWRmb2xkLiBBdCB0aGUgZml0dGVkIHpvb20gdGhlIGNhbWVyYSBzaXRzIGluc2lkZSBpdHMgY29ybmVyLCB3aGVyZSBpdFxuICAgKiByZWFkcyBhcyBibGFuayBiYWNrZ3JvdW5kLCBhbmQgaXQgYXBwZWFycyBvbmx5IG9uY2UgeW91IHpvb20gb3V0IGZhciBlbm91Z2ggdG8gZmluZFxuICAgKiBpdCDigJQgd2hpY2ggaXMgZXhhY3RseSBob3cgaXQgZ2V0cyBub3RpY2VkLlxuICAgKlxuICAgKiBIaWRkZW4gcmF0aGVyIHRoYW4gcmVtb3ZlZCwgYW5kIGhpZGRlbiBIRVJFIHJhdGhlciB0aGFuIGJ5IGNsZWFyaW5nIHRoZSBob3N0J3MgaW1hZ2VcbiAgICogc3RhdGU6IHRoYXQgc3RhdGUgZHJpdmVzIHRoZSB3aG9sZSByZW5kZXIgcGlwZWxpbmUsIGluY2x1ZGluZyBhIFBsb3RseSBiYWNrZW5kIHdob3NlXG4gICAqIGZpZWxkcyBhcmUgZGVjbGFyZWQgd2l0aCBkZWZpbml0ZS1hc3NpZ25tZW50IGFzc2VydGlvbnMsIHNvIGVtcHR5aW5nIGl0IHRocm93cyBmcm9tXG4gICAqIHdoaWNoZXZlciBmaWVsZCB0aGUgbmV4dCBwYXRoIGhhcHBlbnMgdG8gcmVhZC4gVGhpcyB0b3VjaGVzIG9uZSBsYXllcidzIHZpc2liaWxpdHlcbiAgICogYW5kIG5vdGhpbmcgZWxzZS5cbiAgICovXG4gIGhpZGVGb3JlaWduSW1hZ2Uodmlld2VyOiBQaWNrPFZpZXdlciwgJ2xheWVycycgfCAncmVxdWVzdFJlbmRlcic+LCBkYXRhc2V0SGFzUGl4ZWxzOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gTm8gaW1hZ2Ugb2YgaXRzIG93biDihpIgbm90aGluZyBmb3IgYW4gb3ZlcnZpZXcgdG8gc2hvdyBlaXRoZXIuXG4gICAgdGhpcy5pbWFnZS5zaG93TmF2aWdhdG9yRm9yKGRhdGFzZXRIYXNQaXhlbHMpO1xuICAgIGNvbnN0IHRpbGVzID0gdGhpcy5zZXNzaW9uLnRpbGVzO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2Ygdmlld2VyLmxheWVycy5pdGVtcykge1xuICAgICAgaWYgKGxheWVyLmtpbmQgIT09ICdpbWFnZScpIGNvbnRpbnVlO1xuICAgICAgLy8gVGhlIHRyYW5zY3JpcHQtZGVuc2l0eSByYXN0ZXIgYW5kIHRoZSBnZW5lIG1hcCBhcmUgaW1hZ2UgbGF5ZXJzIHRvbywgYnV0IHRoZXkgYXJlXG4gICAgICAvLyBkYXRhLCBub3QgdGhlIHRpc3N1ZTogdGhlIEltYWdlcyB0b2dnbGUgbXVzdCBub3QgdGFrZSB0aGVtIGRvd24gd2l0aCB0aGUgc2xpZGUuXG4gICAgICBpZiAodGlsZXM/Lm93bnMobGF5ZXIpIHx8IGxheWVyID09PSB0aGlzLmdlbmVNYXBMYXllcikgY29udGludWU7XG4gICAgICAvLyBSZS1zaG93biB3aGVuIGEgZGF0YXNldCB0aGF0IG93bnMgYW4gaW1hZ2UgY29tZXMgYmFjaywgc28gc3dpdGNoaW5nIGJldHdlZW5cbiAgICAgIC8vIGRhdGFzZXRzIGRvZXMgbm90IGxlYXZlIHRoZSB0aXNzdWUgcGVybWFuZW50bHkgaGlkZGVuLlxuICAgICAgbGF5ZXIudmlzaWJsZSA9IGRhdGFzZXRIYXNQaXhlbHM7XG4gICAgfVxuICAgIC8vIFNob3dpbmcgdGhlIHRpc3N1ZSBtdXN0IG5vdCBzaG93IGl0cyBjaGFubmVscyB0aGUgdXNlciBvciB0aGUgZGVmYXVsdHMgc3dpdGNoZWQgb2ZmIChhXG4gICAgLy8gMjItY2hhbm5lbCBwbGF0ZSBzdGFydHMgd2l0aCBmb3VyKTogdGhlIGNoYW5uZWwgc3RhdGVzIGRlY2lkZSB3aGljaCBvZiBpdHMgbGF5ZXJzIGRyYXcuXG4gICAgaWYgKGRhdGFzZXRIYXNQaXhlbHMpIHRoaXMuaW1hZ2UucmVhcHBseURpc3BsYXlTdGF0ZSgpO1xuICAgIHZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogRnJhbWUgdGhlIGNhbWVyYSBvbiB0aGUgb2JzZXJ2YXRpb25zLCBmb3IgYSBkYXRhc2V0IHRoYXQgYnJpbmdzIG5vIGltYWdlLlxuICAgKlxuICAgKiBUaGUgMkQgY2FtZXJhIGlzIG5vcm1hbGx5IGZpdHRlZCB0byB0aGUgSU1BR0UsIGJlY2F1c2UgdGhlIG9ic2VydmF0aW9ucyBhcmUgaW4gdGhhdFxuICAgKiBpbWFnZSdzIHBpeGVsIHNwYWNlIGFuZCBmcmFtaW5nIHRoZSBpbWFnZSBmcmFtZXMgdGhlbSB0b28uIEEgZGF0YXNldCB3aXRoIG5vXG4gICAqIHJlZmVyZW5jZSBpbWFnZSBoYXMgY29vcmRpbmF0ZXMgaW4gaXRzIG93biB1bml0cyBpbnN0ZWFkIOKAlCBzZXFGSVNIJ3Mgc3BhbiBhYm91dFxuICAgKiA1eDcg4oCUIHNvIHRoZSBpbWFnZSBmcmFtaW5nIGxlZnQgb3ZlciBmcm9tIHdoYXRldmVyIHdhcyBvbiBzY3JlZW4gYmVmb3JlIHB1dHMgdGhlXG4gICAqIHdob2xlIGNsb3VkIG9mZnNjcmVlbjogbWVhc3VyZWQgYXQgOS43IHggMTMuNCBQSVhFTFMsIGNlbnRyZWQgMjU2cHggZnJvbSB3aGVyZSB0aGVcbiAgICogY2FtZXJhIHdhcyBsb29raW5nLiBUaGUgcG9pbnRzIGFyZSBhbGwgdGhlcmUgYW5kIGRyYXduOyB0aGV5IGFyZSBhIHNwZWNrLiBXaGljaFxuICAgKiBsb29rcyBleGFjdGx5IGxpa2UgdGhlIGRhdGFzZXQgaGF2aW5nIGZhaWxlZCB0byBsb2FkLlxuICAgKlxuICAgKiBPbmNlIHBlciBkYXRhc2V0LCBhcyBuYXBhcmktanMncyBgZml0M2Q6ICdvbmNlJ2AgZG9lcyBmb3IgdGhlIGNsb3VkOiByZS1jb2xvdXJpbmcsXG4gICAqIHNsaWNpbmcgb3IgcGlja2luZyBhIGdlbmUgcmUtYWRkcyB0aGlzIGxheWVyLCBhbmQgcmUtZnJhbWluZyBvbiB0aG9zZSB3b3VsZCBtb3ZlXG4gICAqIHRoZSBjYW1lcmEgdW5kZXIgdGhlIHVzZXIg4oCUIHRoZSBjYW1lcmEgdG9vbHMgYW5kIHRoZSBjYW52YXMgZHJhZyBhcmUgbWVhbnQgdG8gYmVcbiAgICogdGhlIG9ubHkgdGhpbmdzIHRoYXQgZG8uXG4gICAqL1xuICBwcml2YXRlIGZyYW1lT25jZSh2aWV3ZXI6IFZpZXdlciwgZGF0YXNldElkOiBzdHJpbmcsIHBvc2l0aW9uczogRmxvYXQzMkFycmF5LCByZWdpc3RlcmVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gR2F0ZWQgb24gd2hldGhlciBUSElTIGRhdGFzZXQgcmVnaXN0ZXJzIG9udG8gYW4gaW1hZ2UsIG5vdCBvbiB0aGUgaW1hZ2Ugc2l6ZTogdGhhdCBrZWVwc1xuICAgIC8vIHRoZSBsYXN0IHBsb3R0ZWQgaW1hZ2UncyBkaW1lbnNpb25zIGFmdGVyIHRoZSBob3N0IGNsZWFycyBpdCwgc28gYSBzdGFsZSA1MTJ4MzgzIHJlYWQgYXNcbiAgICAvLyBcInRoZXJlIGlzIGFuIGltYWdlXCIgYW5kIHNraXBwZWQgdGhlIGZyYW1pbmcgZW50aXJlbHkuXG4gICAgaWYgKHJlZ2lzdGVyZWQpIHJldHVybjtcbiAgICAvLyBPbmNlIHBlciBkYXRhc2V0IChzZWUgYWJvdmUpLlxuICAgIGlmICh0aGlzLmZyYW1lZCA9PT0gZGF0YXNldElkKSByZXR1cm47XG5cbiAgICBjb25zdCB7IGNhbnZhcyB9ID0gdGhpcy5jdHg7XG4gICAgY29uc3QgZml0ID0gZnJhbWVQb3NpdGlvbnMocG9zaXRpb25zLCBjYW52YXMuY2xpZW50V2lkdGggPz8gMCwgY2FudmFzLmNsaWVudEhlaWdodCA/PyAwKTtcbiAgICAvLyBOdWxsIG1lYW5zIHRoZXJlIGlzIG5vdGhpbmcgdG8gZnJhbWUgb247IGxlYXZlIHRoZSBjYW1lcmEgd2hlcmUgaXQgaXMgcmF0aGVyXG4gICAgLy8gdGhhbiBtb3ZpbmcgdGhlIHZpZXcgZm9yIGEgZGF0YXNldCB3ZSBjYW5ub3QgZml0LlxuICAgIGlmICghZml0KSByZXR1cm47XG4gICAgdmlld2VyLmNhbWVyYS5zZXQoZml0LmNlbnRlciwgZml0Lnpvb20gPz8gdmlld2VyLmNhbWVyYS56b29tKTtcbiAgICB0aGlzLmZyYW1lZCA9IGRhdGFzZXRJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgKipnZW5lIG1hcCoqOiB0aGUgYWN0aXZlIGdlbmUncyBleHByZXNzaW9uIGFzIGEgY29udGludW91cyBmaWVsZCBkcmF3biB1bmRlclxuICAgKiB0aGUgY2VsbHMuXG4gICAqXG4gICAqIEEgc2NhdHRlciBjb2xvdXJlZCBieSBhIGdlbmUgc2F5cyB3aGljaCBjZWxscyBleHByZXNzIGl0OyBpdCBjYW5ub3Qgc2F5IHdoZXJlLFxuICAgKiBiZWNhdXNlIHRoZSBleWUgd2lsbCBub3QgaW50ZWdyYXRlIHRob3VzYW5kcyBvZiBkb3RzIGludG8gYSB0ZXJyaXRvcnkuIFRoZSBmaWVsZFxuICAgKiBpcyBhIGtlcm5lbC13ZWlnaHRlZCBNRUFOIHBlciBjZWxsIChzZWUgYHNwYXRpYWwtZXhwcmVzc2lvbi50c2ApLCBzbyBhIGRlbnNlXG4gICAqIHJlZ2lvbiBkb2VzIG5vdCBnbG93IG1lcmVseSBmb3IgYmVpbmcgZGVuc2UsIGFuZCBpdCBpcyB0cmFuc3BhcmVudCB3aGVyZXZlciBub1xuICAgKiBjZWxsIHdhcyBtZWFzdXJlZCDigJQgYW4gdW5zYW1wbGVkIGdhcCBtdXN0IG5vdCByZWFkIGFzIFwibm90IGV4cHJlc3NlZFwiLlxuICAgKlxuICAgKiBJdCBzaGFyZXMgdGhlIHBvaW50cycgTFVULCBwZXJjZW50aWxlIHdpbmRvdyBhbmQgbG9nIGZsYWcsIHNvIHRoZSBsYXllciB1bmRlclxuICAgKiB0aGUgY2VsbHMgYW5kIHRoZSBjZWxscyB0aGVtc2VsdmVzIGNhbm5vdCBkaXNhZ3JlZSBhYm91dCB3aGF0IGEgY29sb3VyIG1lYW5zLlxuICAgKlxuICAgKiBFc3RpbWF0ZWQgb24gdGhlIERJU1BMQVlFRCBpbWFnZSdzIHBpeGVsIGdyaWQsIGNvYXJzZW5lZCBzbyB0aGUgbG9uZyBzaWRlIGlzIGF0XG4gICAqIG1vc3QgYEdFTkVfTUFQX01BWF9TSURFYDogYSBzbW9vdGggZmllbGQgZ2FpbnMgbm90aGluZyBmcm9tIGEgc2xpZGUncyBmdWxsXG4gICAqIHJlc29sdXRpb24uIEZvciBhIHZvbHVtZS1iYWNrZWQgZGF0YXNldCB0aGF0IGdyaWQgaXMgdGhlIGN1cnJlbnQgc2xpY2UsIGFuZCBvbmx5XG4gICAqIHRoYXQgcGxhbmUncyBvYnNlcnZhdGlvbnMgYXJlIGluY2x1ZGVkIOKAlCB0aGUgc2FtZSBydWxlIHRoZSBtYXJrZXJzIGZvbGxvdy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlR2VuZU1hcChcbiAgICB2aWV3ZXI6IFZpZXdlcixcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCxcbiAgICB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gICAgc2xhYjogU2xhYiB8IG51bGwsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGdlbmUgPSB2aWV3LmdlbmVNYXAgJiYgdmlldy5jb2xvckJ5Py5raW5kID09PSAnZmVhdHVyZScgPyB2aWV3LmNvbG9yQnkubmFtZSA6IG51bGw7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc2Vzc2lvbi5wb3J0O1xuICAgIGNvbnN0IGNhY2hlID0gdGhpcy5zZXNzaW9uLmdlbmVNYXA7XG4gICAgY29uc3Qgc21vb3RoaW5nID0gdmlldy5nZW5lTWFwU21vb3RoaW5nID4gMCA/IHZpZXcuZ2VuZU1hcFNtb290aGluZyA6IDE7XG4gICAgY29uc3QgY2xpcCA9IHZpZXcucGVyY2VudGlsZUNsaXAgPz8gWzAuMDEsIDAuOTldO1xuXG4gICAgLy8gVHdvIGNsb2NrczogdGhlIEZJRUxEIGRlcGVuZHMgb24gdGhlIGdlbmUsIHRoZSBwbGFuZSBhbmQgdGhlIGJhbmR3aWR0aCwgd2hpbGVcbiAgICAvLyB0aGUgY29sb3VycyBkZXBlbmQgb24gdGhlIHdpbmRvdywgdGhlIGxvZyBmbGFnIGFuZCB0aGUgb3BhY2l0eS4gUmVjb2xvdXJpbmcgYVxuICAgIC8vIGNhY2hlZCBmaWVsZCBpcyBhIGZyYWN0aW9uIG9mIGVzdGltYXRpbmcgb25lLlxuICAgIGNvbnN0IGZpZWxkS2V5ID0gZ2VuZVxuICAgICAgPyBbZGF0YXNldC5pZCwgZ2VuZSwgc2xhYj8uc2xpY2UgPz8gJycsIHNtb290aGluZywgdGhpcy5zZXNzaW9uLnNlbGVjdGlvblJldihzZWxlY3Rpb24pXS5qb2luKCd8JylcbiAgICAgIDogbnVsbDtcbiAgICBjb25zdCBrZXkgPSBmaWVsZEtleVxuICAgICAgPyBbXG4gICAgICAgICAgZmllbGRLZXksXG4gICAgICAgICAgY2xpcC5qb2luKCcsJyksXG4gICAgICAgICAgdmlldy5sb2dTY2FsZSA/ICdsb2cnIDogJ2xpbicsXG4gICAgICAgICAgdmlldy5nZW5lTWFwT3BhY2l0eSxcbiAgICAgICAgICB0aGlzLmN0eC5kaXNwbGF5LmNvbnRpbnVvdXNDb2xvcm1hcEtleSh2aWV3KSxcbiAgICAgICAgXS5qb2luKCd8JylcbiAgICAgIDogbnVsbDtcbiAgICAvLyBBIHN0aXRjaGVkIHNsaWNlIHJlLXJlbmRlciBjbGVhcnMgdGhlIHdob2xlIGxheWVyIGxpc3QsIHRoZSBtYXAgd2l0aCBpdCwgYW5kIHRoZSBrZXkgb2YgYVxuICAgIC8vIHJlZ2lzdGVyZWQgaW1hZ2UncyBtYXAgZG9lcyBub3QgbmFtZSB0aGUgc2xpY2U6IGEgbWFwIG5vIGxvbmdlciBpbiB0aGUgc2NlbmUgaXMgYWJzZW50LFxuICAgIC8vIGFzIHRoZSBtYXJrZXJzJyBpcyAoc2VlIGByZWJ1aWxkYCksIHNvIGl0IGlzIGRyYXduIGFnYWluIGZyb20gdGhlIGNhY2hlZCBmaWVsZC5cbiAgICBpZiAodGhpcy5nZW5lTWFwTGF5ZXIgJiYgIXZpZXdlci5sYXllcnMuaXRlbXMuaW5jbHVkZXModGhpcy5nZW5lTWFwTGF5ZXIpKSB7XG4gICAgICB0aGlzLmdlbmVNYXBMYXllciA9IG51bGw7XG4gICAgICB0aGlzLmdlbmVNYXBLZXkgPSBudWxsO1xuICAgIH1cbiAgICBpZiAoa2V5ID09PSB0aGlzLmdlbmVNYXBLZXkpIHJldHVybjtcblxuICAgIGlmICh0aGlzLmdlbmVNYXBMYXllcikge1xuICAgICAgdmlld2VyLmxheWVycy5yZW1vdmUodGhpcy5nZW5lTWFwTGF5ZXIpO1xuICAgICAgdGhpcy5nZW5lTWFwTGF5ZXIgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmdlbmVNYXBLZXkgPSBrZXk7XG4gICAgaWYgKCFrZXkgfHwgIWdlbmUgfHwgIXBvcnQpIHtcbiAgICAgIGNhY2hlLmZpZWxkID0gbnVsbDtcbiAgICAgIGNhY2hlLmtleSA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGhlIHJhc3RlciBjb3ZlcnMgdGhlIGRpc3BsYXllZCBpbWFnZTsgd2l0aG91dCBvbmUgdGhlcmUgaXMgbm90aGluZyB0b1xuICAgIC8vIG92ZXJsYXkgYW5kIHRoZSBjbG91ZCBpcyB0aGUgM0QgbW9kZSdzIGJ1c2luZXNzLCBub3QgdGhpcyBvbmUncy4gR2F0ZWQgb24gdGhlXG4gICAgLy8gREFUQVNFVCBicmluZ2luZyBwaXhlbHMsIG5vdCBvbiB0aGUgaW1hZ2Ugc2l6ZTogdGhhdCBrZWVwcyB0aGUgbGFzdCBwbG90dGVkIGltYWdlJ3NcbiAgICAvLyBzaXplIGFmdGVyIHRoZSBob3N0IGNsZWFycyBpdCwgd2hpY2ggd291bGQgc2l6ZSB0aGUgbWFwIG92ZXIgdGhlIHdyb25nIGV4dGVudC5cbiAgICBpZiAoIXNsYWIgJiYgIWRhdGFzZXQuaW1hZ2VSZWYpIHJldHVybjtcbiAgICBjb25zdCBzaXplID0gdGhpcy5jdHguaW1hZ2VTaXplKCk7XG4gICAgY29uc3QgaW1hZ2VXID0gc2xhYiA/IGRhdGFzZXQudm9sdW1lIS53aWR0aCA6IHNpemUud2lkdGg7XG4gICAgY29uc3QgaW1hZ2VIID0gc2xhYiA/IGRhdGFzZXQudm9sdW1lIS5oZWlnaHQgOiBzaXplLmhlaWdodDtcbiAgICBpZiAoIWltYWdlVyB8fCAhaW1hZ2VIKSByZXR1cm47XG4gICAgY29uc3Qgc3RlcCA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChNYXRoLm1heChpbWFnZVcsIGltYWdlSCkgLyBHRU5FX01BUF9NQVhfU0lERSkpO1xuXG4gICAgaWYgKGZpZWxkS2V5ICE9PSBjYWNoZS5rZXkpIHtcbiAgICAgIGNvbnN0IGxvYWQgPSB0aGlzLmdlbmVNYXBMb2Fkcy5uZXh0KCk7XG4gICAgICBsZXQgdmFsdWVzOiBGbG9hdDMyQXJyYXk7XG4gICAgICB0cnkge1xuICAgICAgICB2YWx1ZXMgPSBhd2FpdCBwb3J0LmdldEZlYXR1cmVWZWN0b3IoZ2VuZSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBbbmFwYXJpLWpzXSBnZW5lIG1hcDogXCIke2dlbmV9XCIgdW5hdmFpbGFibGVgLCBlcnIpO1xuICAgICAgICB0aGlzLmdlbmVNYXBLZXkgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIWxvYWQoKSB8fCB0aGlzLmdlbmVNYXBLZXkgIT09IGtleSkgcmV0dXJuO1xuICAgICAgY29uc3QgaW5TZWxlY3Rpb24gPSBzZWxlY3Rpb24uY291bnQgPiAwID8gbWFza1RvSW5kaWNlcyhzZWxlY3Rpb24ubWFzaykgOiB1bmRlZmluZWQ7XG4gICAgICBsZXQgZXN0aW1hdGVkOiBFeHByZXNzaW9uRmllbGQgfCBudWxsO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZXN0aW1hdGVkID0gYXdhaXQgY29tcHV0ZUV4cHJlc3Npb25GaWVsZEFzeW5jKFxuICAgICAgICAgIGRhdGFzZXQub2JzZXJ2YXRpb25zLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlZjogc2xhYj8ucmVmID8/IGRhdGFzZXQuaW1hZ2VSZWYsXG4gICAgICAgICAgICB3aWR0aDogTWF0aC5jZWlsKGltYWdlVyAvIHN0ZXApLFxuICAgICAgICAgICAgaGVpZ2h0OiBNYXRoLmNlaWwoaW1hZ2VIIC8gc3RlcCksXG4gICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgc2lnbWE6IEdFTkVfTUFQX1NJR01BICogc21vb3RoaW5nLFxuICAgICAgICAgICAgdmFsdWVzLFxuICAgICAgICAgICAgLy8gQSBwbGFuZSB3aW5zIG92ZXIgYSBzZWxlY3Rpb246IHRoZSAyRCB2aWV3IGlzIHNob3dpbmcgb25lIHNlY3Rpb24sIHNvIGFcbiAgICAgICAgICAgIC8vIGZpZWxkIHNwYW5uaW5nIHRoZSBzcGVjaW1lbidzIGRlcHRoIHdvdWxkIG5vdCBiZSB0aGUgdGhpbmcgb24gc2NyZWVuLlxuICAgICAgICAgICAgaW5kaWNlczogc2xhYj8uaW5kaWNlcyA/PyBpblNlbGVjdGlvbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgc2lnbmFsOiBsb2FkLnNpZ25hbCB9LFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChpc0Fib3J0RXJyb3IoZXJyKSkgcmV0dXJuOyAvLyBzdXBlcnNlZGVkIGJ5IGEgbmV3ZXIgbWFwLCBvciB0aGUgc2NlbmUgd2VudCBhd2F5XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIGlmICghbG9hZCgpIHx8IHRoaXMuZ2VuZU1hcEtleSAhPT0ga2V5KSByZXR1cm47XG4gICAgICBjYWNoZS5maWVsZCA9IGVzdGltYXRlZDtcbiAgICAgIGNhY2hlLmtleSA9IGZpZWxkS2V5O1xuICAgIH1cbiAgICBjb25zdCBmaWVsZCA9IGNhY2hlLmZpZWxkO1xuICAgIGlmICghZmllbGQpIHJldHVybjtcblxuICAgIGNvbnN0IGx1dCA9IHRoaXMuY3R4LmRpc3BsYXkuc3BhdGlhbEx1dCh2aWV3KTtcbiAgICAvLyBPdmVyIHRoZSBtZWFzdXJlZCBwaXhlbHMgb25seTogdW5tZWFzdXJlZCBvbmVzIGFyZSAwIGFuZCB3b3VsZCBkcmFnIHRoZSBsb3cgZW5kIGRvd24uXG4gICAgY29uc3QgW2xvLCBoaV0gPSBmaWVsZENvbnRyYXN0V2luZG93KGZpZWxkLCBjbGlwWzBdLCBjbGlwWzFdKTtcbiAgICBjb25zdCByZ2JhID0gY29sb3JFeHByZXNzaW9uRmllbGQoZmllbGQsIGx1dCwgW2xvLCBoaV0sIHtcbiAgICAgIGxvZzogdmlldy5sb2dTY2FsZSxcbiAgICAgIC8vIFRoZSBNQVAncyBvd24gb3BhY2l0eTogcmVhZGluZyBhIGZpZWxkIHVuZGVyIHRoZSBjZWxscyBtZWFucyB0dXJuaW5nIHRoZVxuICAgICAgLy8gY2VsbHMgZG93biwgd2hpY2ggbXVzdCBub3QgdGFrZSB0aGUgZmllbGQgd2l0aCB0aGVtLlxuICAgICAgb3BhY2l0eTogdmlldy5nZW5lTWFwT3BhY2l0eSxcbiAgICB9KTtcbiAgICB0aGlzLmdlbmVNYXBMYXllciA9IHZpZXdlci5hZGRJbWFnZShcbiAgICAgIHsga2luZDogJ3R5cGVkJywgd2lkdGg6IGZpZWxkLndpZHRoLCBoZWlnaHQ6IGZpZWxkLmhlaWdodCwgY2hhbm5lbHM6IDQsIGR0eXBlOiAndWludDgnLCBkYXRhOiByZ2JhIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6IGBnZW5lIG1hcCDCtyAke2dlbmV9YCxcbiAgICAgICAgc2NhbGU6IFtzdGVwLCBzdGVwXSxcbiAgICAgICAgdHJhbnNsYXRlOiBbMCwgMF0sXG4gICAgICAgIGJsZW5kaW5nOiAndHJhbnNsdWNlbnQnLFxuICAgICAgfSxcbiAgICApO1xuICAgIC8vIGBhZGRJbWFnZWAgYXBwZW5kcywgc28gdGhlIG1hcCBqdXN0IGxhbmRlZCBvdmVyIHRoZSBjZWxscyAoZHJhd24gYnkgdGhpcyByZWJ1aWxkJ3NcbiAgICAvLyBwcmV2aW91cyBwYXNzLCBvciBieSBhIG5ld2VyIHJlYnVpbGQgd2hpbGUgdGhlIGZpZWxkIHdhcyBjb21wdXRpbmcpOiBtb3ZlIGl0IHRvIGp1c3QgdW5kZXJcbiAgICAvLyB0aGVtLiBBIG1vdmUga2VlcHMgdGhlIG1hcmtlcnMnIEdQVSBidWZmZXJzLCB3aGVyZSBkcm9wcGluZyBhbmQgcmUtYWRkaW5nIHRoZSBtYXJrZXJzXG4gICAgLy8gcmUtdXBsb2FkZWQgZXZlcnkgb25lIG9mIHRoZW0gKE5BUEFSSS1CT1VOREFSWS0xMSkuIFdpdGhvdXQgbWFya2VycyBvbiBzY3JlZW4gdGhlcmUgaXNcbiAgICAvLyBub3RoaW5nIHRvIGdvIHVuZGVyOyB0aGUgcmVidWlsZCBhZGRzIHRoZW0gb3ZlciB0aGUgbWFwLlxuICAgIGNvbnN0IHVuZGVyID0gdGhpcy5wb2ludHMgPyB2aWV3ZXIubGF5ZXJzLml0ZW1zLmluZGV4T2YodGhpcy5wb2ludHMpIDogLTE7XG4gICAgaWYgKHVuZGVyID49IDApIHZpZXdlci5sYXllcnMubW92ZSh0aGlzLmdlbmVNYXBMYXllciwgdW5kZXIpO1xuICAgIHZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogUGVyLW9ic2VydmF0aW9uIGNvbG91cnMgZm9yIHRoZSBjdXJyZW50IHZpZXcgc3RhdGUsIG9yIGEgc2luZ2xlIGZsYXQgY29sb3VyIHdoZW4gbm90aGluZyBpc1xuICAgKiBzZWxlY3RlZCB0byBjb2xvdXIgYnkuIENhdGVnb3JpY2FsIGNvbHVtbnMgdXNlIHRoZSBjb2x1bW4ncyBvd24gcGFsZXR0ZTsgY29udGludW91cyBjb2x1bW5zXG4gICAqIGFuZCBnZW5lIHZlY3RvcnMgZ28gdGhyb3VnaCB0aGUgYWN0aXZlIGNvbG9ybWFwIHdpdGggYSBwZXJjZW50aWxlLWNsaXBwZWQgd2luZG93LlxuICAgKi9cbiAgLyoqIFRoZSBvYnNlcnZhdGlvbnMgdGhlIHZpZXcncyBnZW5lIGZpbHRlciBrZWVwcyAoMSA9IGRyYXduKSwgb3IgbnVsbCB3aGVuIGl0IGhhcyBub25lLlxuICAgKiAgUmVqZWN0cyB3aGVuIGFuIGV4cHJlc3Npb24gcmVhZCBmYWlscy4gKi9cbiAgcHJpdmF0ZSBmaWx0ZXJNYXNrKGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlKTogUHJvbWlzZTxVaW50OEFycmF5IHwgbnVsbD4ge1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnNlc3Npb24ucG9ydDtcbiAgICBpZiAoIXBvcnQpIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gICAgcmV0dXJuIG9ic2VydmF0aW9uR2VuZU1hc2sodmlldywgZGF0YXNldC5vYnNlcnZhdGlvbnMuY291bnQsIChnKSA9PiBwb3J0LmdldEZlYXR1cmVWZWN0b3IoZykpO1xuICB9XG5cbiAgLyoqIFRoZSBtYXJrZXJzJyBjb2xvdXJzIChhbmQgaWNvbnMsIGJ5IGdlbmUpIGJlZm9yZSB0aGUgZ2VuZSBmaWx0ZXIgaGlkZXMgYW55IG9mIHRoZW0uICovXG4gIHByaXZhdGUgYXN5bmMgbWFya2VyU3R5bGUoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsXG4gICAgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrLFxuICApOiBQcm9taXNlPHsgY29sb3JzOiBQb2ludENvbG9yczsgc3ltYm9sczogVWludDhBcnJheSB8IG51bGwgfT4ge1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnNlc3Npb24ucG9ydDtcbiAgICBjb25zdCBjb3VudCA9IGRhdGFzZXQub2JzZXJ2YXRpb25zLmNvdW50O1xuICAgIC8vIENvbG91cmVkIGJ5IGdlbmU6IGVhY2ggb2JzZXJ2YXRpb24gaW4gaXRzIGdlbmUncyBjb2xvdXIsIGRyYXduIGFzIGl0cyBnZW5lJ3MgaWNvbi4gVGhhdCBpc1xuICAgIC8vIGEgY29sb3VyLCBzbyBhIGZhaWxlZCByZWFkIGZhbGxzIGJhY2sgdG8gdGhlIHZpZXcncyBjb2xvdXIgc291cmNlLCBhcyBhbnkgY29sb3VyIGRvZXMuXG4gICAgY29uc3QgYnlHZW5lID0gcG9ydFxuICAgICAgPyBhd2FpdCBvYnNlcnZhdGlvbkdlbmVTdHlsZSh2aWV3LCBjb3VudCwgKGcpID0+IHBvcnQuZ2V0RmVhdHVyZVZlY3RvcihnKSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gY29sb3VyaW5nIGJ5IGdlbmUgZmFpbGVkIOKAlCBmYWxsaW5nIGJhY2sgdG8gdGhlIGNvbG91ciBzb3VyY2UnLCBlcnIpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9KVxuICAgICAgOiBudWxsO1xuICAgIGNvbnN0IGNvbG9ycyA9IGJ5R2VuZVxuICAgICAgPyBlbmNvZGVDYXRlZ29yaWNhbChieUdlbmUuY29kZXMsIHtcbiAgICAgICAgICBjb2xvcnM6IGJ5R2VuZS5jb2xvcnMsXG4gICAgICAgICAgb3BhY2l0eTogdmlldy5vcGFjaXR5LFxuICAgICAgICAgIG11dGVkOiBtdXRlZEZyb21TZWxlY3Rpb24oc2VsZWN0aW9uKSxcbiAgICAgICAgfSlcbiAgICAgIDogYXdhaXQgdGhpcy5zb3VyY2VDb2xvcnMoZGF0YXNldCwgdmlldywgc2VsZWN0aW9uKTtcbiAgICBjb25zdCBzeW1ib2xzID0gYnlHZW5lID8gZ2x5cGhTeW1ib2xzKGJ5R2VuZS5jb2RlcywgYnlHZW5lLmdseXBocykgOiBudWxsO1xuICAgIHJldHVybiB7IGNvbG9ycywgc3ltYm9scyB9O1xuICB9XG5cbiAgLyoqIHtAbGluayBmYWNlQ29sb3JzfSBiZWZvcmUgdGhlIGdlbmUgZmlsdGVyOiB3aGF0IHRoZSBjb2xvdXIgc291cmNlIGFuZCB0aGUgc2VsZWN0aW9uIG1ha2Ugb2YgdGhlbS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBzb3VyY2VDb2xvcnMoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsXG4gICAgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrLFxuICApOiBQcm9taXNlPFBvaW50Q29sb3JzPiB7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc2Vzc2lvbi5wb3J0O1xuICAgIGNvbnN0IGNvbG9yQnkgPSB2aWV3LmNvbG9yQnk7XG4gICAgLy8gRXZlcnl0aGluZyBOT1Qgc2VsZWN0ZWQgaXMgbXV0ZWQ7IHdpdGggbm90aGluZyBzZWxlY3RlZCwgbm90aGluZyBpcyBtdXRlZFxuICAgIC8vIGFuZCB0aGUgd2hvbGUgdGlzc3VlIHJlYWRzIG5vcm1hbGx5ICh0aGUgQ29zTXggaGlnaGxpZ2h0LXZzLW11dGUgcnVsZSkuXG4gICAgY29uc3QgbXV0ZWQgPSBtdXRlZEZyb21TZWxlY3Rpb24oc2VsZWN0aW9uKTtcblxuICAgIGlmICghcG9ydCB8fCAhY29sb3JCeSkge1xuICAgICAgLy8gR2VudWluZWx5IHVuaWZvcm06IG9uZSBicm9hZGNhc3QgdHVwbGUsIHNvIGEgZmxhdCA4NGstb2JzZXJ2YXRpb24gdmlld1xuICAgICAgLy8gZG9lcyBub3QgYWxsb2NhdGUgYSBjb2xvdXIgcGVyIHBvaW50LlxuICAgICAgaWYgKCFtdXRlZCAmJiB2aWV3Lm9wYWNpdHkgPj0gMSkgcmV0dXJuIFNQQVRJQUxfTkVVVFJBTF9DT0xPUjtcbiAgICAgIC8vIE5vdCB1bmlmb3JtIOKAlCB0aGUgb3BhY2l0eSBjb250cm9sIG9yIGEgc2VsZWN0aW9uIHZhcmllcyB0aGUgYWxwaGEsIHNvIGl0XG4gICAgICAvLyBoYXMgdG8gYmUgcGVyLXBvaW50LiBSZXR1cm5pbmcgdGhlIGNvbnN0YW50IHR1cGxlIGhlcmUgaXMgd2hhdCBtYWRlIHRoZVxuICAgICAgLy8gT3BhY2l0eSBzbGlkZXIgZG8gbm90aGluZyBpbiB0aGUgZGVmYXVsdCBzdGF0ZSwgd2hpY2ggaXMgdGhlIHN0YXRlIGFueW9uZVxuICAgICAgLy8gbGFuZHMgaW4gYmVmb3JlIHBpY2tpbmcgYSBjb2xvdXIgc291cmNlLlxuICAgICAgcmV0dXJuIGVuY29kZUNhdGVnb3JpY2FsKG5ldyBVaW50MTZBcnJheShkYXRhc2V0Lm9ic2VydmF0aW9ucy5jb3VudCksIHtcbiAgICAgICAgY29sb3JzOiBbU1BBVElBTF9ORVVUUkFMX0hFWF0sXG4gICAgICAgIG9wYWNpdHk6IHZpZXcub3BhY2l0eSxcbiAgICAgICAgbXV0ZWQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoY29sb3JCeS5raW5kID09PSAnY29sdW1uJykge1xuICAgICAgY29uc3QgY29sdW1uOiBTcGF0aWFsQ29sdW1uID0gYXdhaXQgcG9ydC5nZXRDb2x1bW4oY29sb3JCeS5uYW1lKTtcbiAgICAgIGlmIChpc0NhdGVnb3JpY2FsQ29sdW1uKGNvbHVtbikpIHtcbiAgICAgICAgY29uc3QgcmdiYSA9IGVuY29kZUNhdGVnb3JpY2FsKGNvbHVtbi5jb2Rlcywge1xuICAgICAgICAgIGNvbG9yczogcmVzb2x2ZUNhdGVnb3J5Q29sb3JzKGNvbHVtbi5tZXRhKSxcbiAgICAgICAgICBvcGFjaXR5OiB2aWV3Lm9wYWNpdHksXG4gICAgICAgICAgbXV0ZWQsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBHcm91cHMgc3dpdGNoZWQgb2ZmIGluIHRoZSBDZWxscyBwYW5lbCBoaWRlIHRoZWlyIGRvdHMgdG9vLCB3aGVuIHRoZSBkb3RzIGFyZVxuICAgICAgICAvLyBjb2xvdXJlZCBieSB0aGF0IHNhbWUgZ3JvdXBpbmcuXG4gICAgICAgIGNvbnN0IGdyb3VwQ29sdW1uID0gY2VsbFR5cGVDb2x1bW5Gb3IoZGF0YXNldCwgdmlldyk7XG4gICAgICAgIGlmICh2aWV3LmhpZGRlbkdyb3Vwcz8ubGVuZ3RoICYmIGdyb3VwQ29sdW1uID09PSBjb2xvckJ5Lm5hbWUpIHtcbiAgICAgICAgICBjb25zdCBvZmYgPSBuZXcgU2V0KHZpZXcuaGlkZGVuR3JvdXBzKTtcbiAgICAgICAgICBjb25zdCBoaWRlID0gY29sdW1uLm1ldGEuY2F0ZWdvcmllcy5tYXAoKGMpID0+IG9mZi5oYXMoYykpO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sdW1uLmNvZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjID0gY29sdW1uLmNvZGVzW2ldO1xuICAgICAgICAgICAgaWYgKGMgIT09IE5PX0NBVEVHT1JZICYmIGhpZGVbY10pIHJnYmFbNCAqIGkgKyAzXSA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZ2JhO1xuICAgICAgfVxuICAgICAgLy8gQSBjb250aW51b3VzIGNvbHVtbiBtYXkgY2FycnkgaXRzIG93biBsb2cgaGludCAoY291bnRzKTsgdGhlIHZpZXcnc1xuICAgICAgLy8gdG9nZ2xlIHdpbnMgb25jZSB0aGUgdXNlciBoYXMgc2V0IGl0LlxuICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlQ29udGludW91cyhjb2x1bW4udmFsdWVzLCB2aWV3LCBtdXRlZCk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWVzID0gYXdhaXQgcG9ydC5nZXRGZWF0dXJlVmVjdG9yKGNvbG9yQnkubmFtZSk7XG4gICAgcmV0dXJuIHRoaXMuZW5jb2RlQ29udGludW91cyh2YWx1ZXMsIHZpZXcsIG11dGVkKTtcbiAgfVxuXG4gIC8qKiBDb250aW51b3VzIHZhbHVlcyDihpIgUkdCQSB0aHJvdWdoIHRoZSBhY3RpdmUgY29sb3JtYXAgYW5kIGEgY2xpcHBlZCB3aW5kb3cuICovXG4gIGVuY29kZUNvbnRpbnVvdXModmFsdWVzOiBGbG9hdDMyQXJyYXksIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsIG11dGVkOiBVaW50OEFycmF5IHwgbnVsbCA9IG51bGwpOiBGbG9hdDMyQXJyYXkge1xuICAgIHJldHVybiBlbmNvZGVTcGF0aWFsQ29udGludW91cyhcbiAgICAgIHZhbHVlcyxcbiAgICAgIHZpZXcsXG4gICAgICB0aGlzLmN0eC5kaXNwbGF5LnNwYXRpYWxMdXQodmlldyksXG4gICAgICB0aGlzLnNlc3Npb24uY29udHJhc3RXaW5kb3dzLFxuICAgICAgbXV0ZWQsXG4gICAgKTtcbiAgfVxufVxuXG4vKiogVGhlIG1hcmtlcnMnIGRpYW1ldGVyczogZWFjaCBvYnNlcnZhdGlvbidzIG93biAob3IgdGhlIGZhbGxiYWNrKSwgYXQgbGVhc3QgdGhlIHNsYWIncyBmbG9vcixcbiAqICB0aW1lcyB0aGUgdmlldydzIHBvaW50IHNjYWxlOyBvbmUgbnVtYmVyIHdoZW4gZXZlcnkgbWFya2VyIGlzIGRyYXduIGF0IHRoZSBzYW1lIHNpemUuICovXG5mdW5jdGlvbiBtYXJrZXJTaXplcyhvYnM6IFNwYXRpYWxPYnNlcnZhdGlvbnMsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsIHNsYWI6IFNsYWIgfCBudWxsKTogbnVtYmVyIHwgRmxvYXQzMkFycmF5IHtcbiAgY29uc3QgYmFzZSA9IG1hcmtlckRpYW1ldGVycyhvYnMsIFNQQVRJQUxfRkFMTEJBQ0tfUkFESVVTKTtcbiAgY29uc3Qgc2NhbGUgPSB2aWV3LnBvaW50U2NhbGUgPiAwID8gdmlldy5wb2ludFNjYWxlIDogMTtcbiAgY29uc3QgZmxvb3IgPSBzbGFiPy5taW5EaWFtZXRlciA/PyAwO1xuICBpZiAodHlwZW9mIGJhc2UgPT09ICdudW1iZXInICYmICFzbGFiKSByZXR1cm4gTWF0aC5tYXgoYmFzZSwgZmxvb3IpICogc2NhbGU7XG4gIGNvbnN0IHNpemVPZiA9IChpOiBudW1iZXIpID0+IE1hdGgubWF4KHR5cGVvZiBiYXNlID09PSAnbnVtYmVyJyA/IGJhc2UgOiBiYXNlW2ldLCBmbG9vcikgKiBzY2FsZTtcbiAgcmV0dXJuIEZsb2F0MzJBcnJheS5mcm9tKHNsYWI/LmluZGljZXMgPz8geyBsZW5ndGg6IG9icy5jb3VudCB9LCAoX3YsIGkpID0+IHNpemVPZihzbGFiID8gc2xhYi5pbmRpY2VzW2ldIDogaSkpO1xufVxuXG4vKiogSW50ZXJsZWF2ZWQgeCx5IG9mIHRoZSBgZHJhd25gIG9ic2VydmF0aW9ucyAodW5kZWZpbmVkOiBhbGwgb2YgdGhlbSkuICovXG5mdW5jdGlvbiBvYnNlcnZhdGlvblBvc2l0aW9ucyhvYnM6IFNwYXRpYWxPYnNlcnZhdGlvbnMsIGRyYXduOiBVaW50MzJBcnJheSB8IHVuZGVmaW5lZCk6IEZsb2F0MzJBcnJheSB7XG4gIGNvbnN0IGNvdW50ID0gZHJhd24gPyBkcmF3bi5sZW5ndGggOiBvYnMuY291bnQ7XG4gIGNvbnN0IHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoY291bnQgKiAyKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgY29uc3QgbyA9IGRyYXduID8gZHJhd25baV0gOiBpO1xuICAgIHBvc2l0aW9uc1tpICogMl0gPSBvYnMueFtvXTtcbiAgICBwb3NpdGlvbnNbaSAqIDIgKyAxXSA9IG9icy55W29dO1xuICB9XG4gIHJldHVybiBwb3NpdGlvbnM7XG59XG5cbi8qKlxuICogVGhlIHBsYW5lIGBzbGljZWAgb2YgYSB2b2x1bWUtYmFja2VkIGRhdGFzZXQ6IGl0cyBwaXhlbCBhZmZpbmUsIHRoZSBvYnNlcnZhdGlvbnMgdGhhdCBmYWxsIGluXG4gKiBpdCwgYW5kIHRoZSBtYXJrZXIgZmxvb3IgdGhhdCBncmlkIG5lZWRzLlxuICpcbiAqIE51bGwgZm9yIGEgZGF0YXNldCB3aXRoIGEgcmVhbCBgaW1hZ2VSZWZgIChpdHMgY29vcmRpbmF0ZXMgYXJlIGFscmVhZHkgdGhlIGltYWdlJ3MgcGl4ZWxzIGFuZFxuICogZXZlcnkgb2JzZXJ2YXRpb24gYmVsb25ncyB0byB0aGUgb25lIHNlY3Rpb24pIGFuZCBmb3Igb25lIHdpdGggbm8gdm9sdW1lIGF0IGFsbCDigJQgYm90aCBvZlxuICogd2hpY2ggZHJhdyBleGFjdGx5IGFzIGJlZm9yZS5cbiAqL1xuZnVuY3Rpb24gc2xhYkF0KGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCBzbGljZTogbnVtYmVyKTogU2xhYiB8IG51bGwge1xuICBjb25zdCB2b2x1bWUgPSBkYXRhc2V0LnZvbHVtZTtcbiAgaWYgKGRhdGFzZXQuaW1hZ2VSZWYgfHwgIXZvbHVtZSkgcmV0dXJuIG51bGw7XG4gIHJldHVybiB7XG4gICAgcmVmOiB2b2x1bWVJbWFnZVJlZih2b2x1bWUsIGRhdGFzZXQubWljcm9uc1BlclVuaXQpLFxuICAgIGluZGljZXM6IG9ic2VydmF0aW9uc0luU2xpY2UoZGF0YXNldC5vYnNlcnZhdGlvbnMsIHZvbHVtZSwgc2xpY2UpLFxuICAgIHNsaWNlLFxuICAgIG1pbkRpYW1ldGVyOiBTUEFUSUFMX1NMSUNFX01JTl9ESUFNRVRFUl9QWCAqIHZvbHVtZS52b3hlbFNpemVbMF0sXG4gIH07XG59XG5cbi8qKiBQZXItb2JzZXJ2YXRpb24gbmFwYXJpLWpzIHN5bWJvbCBjb2RlczogZWFjaCBvYnNlcnZhdGlvbidzIGdlbmUncyBpY29uIChgY29kZXNgIGluZGV4XG4gKiAgYGdseXBoc2ApLCBhIGRpc2Mgd2hlcmUgaXQgaGFzIG5vbmUuICovXG5leHBvcnQgZnVuY3Rpb24gZ2x5cGhTeW1ib2xzKGNvZGVzOiBVaW50MTZBcnJheSwgZ2x5cGhzOiByZWFkb25seSBUcmFuc2NyaXB0R2x5cGhOYW1lW10pOiBVaW50OEFycmF5IHtcbiAgY29uc3QgYnlHZW5lID0gZ2x5cGhzLm1hcCgoZykgPT4gcG9pbnRTeW1ib2xDb2RlKEdMWVBIX1NZTUJPTFNbZ10pKTtcbiAgY29uc3QgZGlzYyA9IHBvaW50U3ltYm9sQ29kZSgnZGlzYycpO1xuICByZXR1cm4gVWludDhBcnJheS5mcm9tKGNvZGVzLCAoYykgPT4gKGMgPT09IE5PX0NBVEVHT1JZID8gZGlzYyA6IChieUdlbmVbY10gPz8gZGlzYykpKTtcbn1cblxuLyoqIFRoZSBzeW1ib2xzIG9mIHRoZSBkcmF3biBzdWJzZXQgKGFsbCBvZiB0aGVtIHdoZW4gYGluZGljZXNgIGlzIHVuZGVmaW5lZCkuICovXG5leHBvcnQgZnVuY3Rpb24gZ2F0aGVyU3ltYm9scyhzeW1ib2xzOiBVaW50OEFycmF5IHwgbnVsbCwgaW5kaWNlcz86IFVpbnQzMkFycmF5KTogVWludDhBcnJheSB8IG51bGwge1xuICBpZiAoIXN5bWJvbHMgfHwgIWluZGljZXMpIHJldHVybiBzeW1ib2xzO1xuICByZXR1cm4gVWludDhBcnJheS5mcm9tKGluZGljZXMsIChpKSA9PiBzeW1ib2xzW2ldKTtcbn1cbiJdfQ==
|
|
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=
|