@jax-data-science/sci-image-visualizer 0.16.0 → 0.18.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 +4 -2
- package/esm2022/lib/contracts/image.contract.mjs +1 -1
- package/esm2022/lib/contracts/ports/spatial-data.port.mjs +1 -1
- package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
- package/esm2022/lib/contracts/region-store.contract.mjs +1 -1
- package/esm2022/lib/contracts/spatial-dataset.contract.mjs +1 -1
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/geometry/cell-meshes.mjs +37 -0
- package/esm2022/lib/geometry/place.mjs +47 -0
- package/esm2022/lib/implementations/napari-js/napari-camera-depth.mjs +93 -0
- package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +2 -2
- package/esm2022/lib/implementations/napari-js/napari-scene.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +86 -18
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-cells.mjs +746 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +343 -18
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-transcripts.mjs +427 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +11 -4
- package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +95 -5
- package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +15 -1
- package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +35 -8
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +40 -1
- package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +136 -28
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +19 -3
- package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +188 -52
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +35 -11
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +2 -2
- package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +10 -1
- package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +30 -3
- package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +15 -3
- package/esm2022/lib/region-editor/region-editor.component.mjs +24 -4
- package/esm2022/lib/region-source/region-source-ops.mjs +7 -1
- package/esm2022/lib/region-source/region-tiles.mjs +1 -1
- package/esm2022/lib/region-source/worker-region-source.mjs +24 -1
- package/esm2022/lib/routing-visualizer.service.mjs +404 -7
- package/esm2022/lib/spatial/observations-in-selection.mjs +83 -0
- package/esm2022/lib/spatial/plane-cells.mjs +119 -0
- package/esm2022/lib/spatial/spatial-controls.facade.mjs +304 -8
- package/esm2022/lib/spatial/spatial-encoding.mjs +52 -3
- package/esm2022/lib/spatial/spatial-hover.mjs +34 -1
- package/esm2022/lib/spatial/spatial-planes.mjs +49 -0
- package/esm2022/lib/spatial/spatial-selection.mjs +2 -2
- package/esm2022/lib/spatial/spatial-tile-merge.mjs +38 -1
- package/esm2022/lib/spatial/transcripts-in-selection.mjs +208 -0
- package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +42 -65
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +6 -2
- package/esm2022/lib/spatial-controls/spatial-color-by/spatial-color-by.component.mjs +187 -0
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +51 -12
- 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 +21 -6
- package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +94 -13
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +79 -57
- package/esm2022/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.mjs +101 -0
- package/esm2022/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.mjs +94 -0
- package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +9 -3
- package/esm2022/lib/store/region-source-scope.mjs +10 -1
- package/esm2022/lib/store/region-store.service.mjs +33 -2
- package/esm2022/lib/toolbar/toolbar.component.mjs +10 -3
- package/esm2022/lib/visualizer/spatial-region-set.mjs +95 -0
- package/esm2022/lib/visualizer.component.mjs +40 -4
- package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CYsPzX3J.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CBiLcnE6.mjs} +4838 -656
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CBiLcnE6.mjs.map +1 -0
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-DaZVXq1s.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-BXHjv4PE.mjs} +2 -2
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-DaZVXq1s.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-BXHjv4PE.mjs.map} +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +1 -1
- package/fesm2022/region-source.worker.js +84 -2
- package/lib/contracts/display-types.d.ts +99 -6
- package/lib/contracts/image.contract.d.ts +6 -0
- package/lib/contracts/ports/spatial-data.port.d.ts +7 -0
- package/lib/contracts/region-editor-api.contract.d.ts +9 -0
- package/lib/contracts/region-store.contract.d.ts +6 -0
- package/lib/contracts/spatial-dataset.contract.d.ts +7 -1
- package/lib/contracts/visualizer.contract.d.ts +43 -1
- package/lib/geometry/cell-meshes.d.ts +27 -0
- package/lib/geometry/place.d.ts +45 -0
- package/lib/implementations/napari-js/napari-camera-depth.d.ts +23 -0
- package/lib/implementations/napari-js/napari-loading-state.d.ts +1 -1
- package/lib/implementations/napari-js/napari-scene.d.ts +12 -0
- package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +19 -3
- package/lib/implementations/napari-js/napari-spatial-3d-cells.d.ts +141 -0
- package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +89 -0
- package/lib/implementations/napari-js/napari-spatial-3d-transcripts.d.ts +103 -0
- package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +9 -2
- package/lib/implementations/napari-js/napari-spatial-hover.d.ts +22 -0
- package/lib/implementations/napari-js/napari-spatial-scene.d.ts +12 -0
- package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +20 -6
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +27 -1
- package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +48 -16
- package/lib/implementations/napari-js/napari-volume-scene.d.ts +2 -0
- package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +54 -1
- package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +11 -2
- package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +7 -0
- package/lib/region-editor/class-tree/class-tree.component.d.ts +16 -1
- package/lib/region-editor/classes-panel/classes-panel.component.d.ts +10 -1
- package/lib/region-editor/region-editor.component.d.ts +4 -0
- package/lib/region-source/region-source-ops.d.ts +12 -0
- package/lib/region-source/region-tiles.d.ts +8 -0
- package/lib/region-source/worker-region-source.d.ts +18 -0
- package/lib/routing-visualizer.service.d.ts +140 -1
- package/lib/spatial/observations-in-selection.d.ts +43 -0
- package/lib/spatial/plane-cells.d.ts +37 -0
- package/lib/spatial/spatial-controls.facade.d.ts +59 -0
- package/lib/spatial/spatial-encoding.d.ts +24 -1
- package/lib/spatial/spatial-hover.d.ts +23 -0
- package/lib/spatial/spatial-planes.d.ts +22 -0
- package/lib/spatial/spatial-selection.d.ts +2 -1
- package/lib/spatial/spatial-tile-merge.d.ts +9 -0
- package/lib/spatial/transcripts-in-selection.d.ts +95 -0
- package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +19 -28
- package/lib/spatial-controls/spatial-color-by/spatial-color-by.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-controls.component.d.ts +19 -2
- 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 +7 -0
- package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +28 -7
- package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +26 -23
- package/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.d.ts +48 -0
- package/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.d.ts +43 -0
- package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +3 -1
- package/lib/store/region-source-scope.d.ts +4 -0
- package/lib/store/region-store.service.d.ts +21 -0
- package/lib/toolbar/toolbar.component.d.ts +6 -1
- package/lib/visualizer/spatial-region-set.d.ts +55 -0
- package/lib/visualizer.component.d.ts +14 -0
- package/package.json +2 -2
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CYsPzX3J.mjs.map +0 -1
|
@@ -115,7 +115,7 @@ export class OsdRegionOverlay {
|
|
|
115
115
|
skip: (region) => this.hidden(region),
|
|
116
116
|
});
|
|
117
117
|
this.sourceLayer = this.store.getRegionSourceView$
|
|
118
|
-
? new RegionSourceLayer(this.svg, this.store.getRegionSourceView$())
|
|
118
|
+
? new RegionSourceLayer(this.svg, this.store.getDrawnRegionSourceView$?.() ?? this.store.getRegionSourceView$())
|
|
119
119
|
: null;
|
|
120
120
|
this.viewer.canvas.addEventListener('pointercancel', this.pointerCancelHandler);
|
|
121
121
|
// 'update-viewport' fires on every redrawn frame, animated ones included —
|
|
@@ -730,4 +730,4 @@ export class OsdRegionOverlay {
|
|
|
730
730
|
this.redraw();
|
|
731
731
|
}
|
|
732
732
|
}
|
|
733
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3NkLXJlZ2lvbi1vdmVybGF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9pbXBsZW1lbnRhdGlvbnMvb3NkL29zZC1yZWdpb24tb3ZlcmxheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFcEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBSS9FLE9BQU8sRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTlELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzNELE9BQU8sRUFDTCxnQkFBZ0IsRUFFaEIsU0FBUyxFQUNULFdBQVcsRUFDWCxjQUFjLEVBQ2QsYUFBYSxFQUNiLGVBQWUsR0FDaEIsTUFBTSxzQ0FBc0MsQ0FBQztBQUM5QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNuRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNuRyxPQUFPLEVBQ0wsYUFBYSxFQUNiLGFBQWEsRUFDYixlQUFlLEVBQ2YsaUJBQWlCLEVBQ2pCLG9CQUFvQixFQUNwQixnQkFBZ0IsRUFDaEIsWUFBWSxHQUNiLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLFdBQVcsRUFBWSxXQUFXLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBYWhILE1B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QixJQUFJLE1BQU07Z0JBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2hCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlICogYXMgT3BlblNlYWRyYWdvbiBmcm9tICdvcGVuc2VhZHJhZ29uJztcbmltcG9ydCB7IE9TRCB9IGZyb20gJy4vb3NkLWxpYic7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgUmVnaW9uLCBSZWN0YW5nbGUsIFBvbHlnb24sIE11bHRpUG9seWdvbiB9IGZyb20gJy4uLy4uL21vZGVscy9yZWdpb24nO1xuaW1wb3J0IHsgSVJlZ2lvblN0b3JlIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QnO1xuaW1wb3J0IHsgSVJlZ2lvbkVkaXRBcGksIElSZWdpb25Tb3VyY2VBcGkgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvcmVnaW9uLXN0b3JlLmNvbnRyYWN0JztcbmltcG9ydCB7IElSZWdpb25PdmVybGF5LCBSZWdpb25Ub29sTW9kZSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9yZWdpb24tb3ZlcmxheS5jb250cmFjdCc7XG5pbXBvcnQgeyBlbGVtZW50VG9JbWFnZSwgaW1hZ2VUb0VsZW1lbnQgfSBmcm9tICcuL29zZC1jb29yZHMnO1xuaW1wb3J0IHsgT3NkVmlld2VyTGlrZSB9IGZyb20gJy4vb3NkLXZpZXdlci1saWtlJztcbmltcG9ydCB7IE9TRF9aT09NX1BFUl9TQ1JPTEwgfSBmcm9tICcuL29zZC16b29tJztcbmltcG9ydCB7IHRyYW5zbGF0ZUJvdW5kcyB9IGZyb20gJy4uLy4uL21vZGVscy9wb2x5Z29uLWVkaXQnO1xuaW1wb3J0IHsgbWFrZVBvbHlnb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvcG9seWdvbi1mYWN0b3J5JztcbmltcG9ydCB7XG4gIE9QRU5fUEFUSF9UT0xfUFgsXG4gIFRvU2NyZWVuLFxuICBoaXRIYW5kbGUsXG4gIG5lYXJlc3RFZGdlLFxuICByZWdpb25Db250YWlucyxcbiAgcmVnaW9uc0luUmVjdCxcbiAgdG9wbW9zdFJlZ2lvbkF0LFxufSBmcm9tICcuLi8uLi9yZWdpb24tb3ZlcmxheS9yZWdpb24tZ2VvbWV0cnknO1xuaW1wb3J0IHsgU3ZnUmVnaW9uUmVuZGVyZXIsIGFmZmluZUZyb21Qcm9qZWN0aW9uIH0gZnJvbSAnLi4vLi4vcmVnaW9uLW92ZXJsYXkvc3ZnLXJlZ2lvbi1yZW5kZXJlcic7XG5pbXBvcnQgeyBSZWdpb25Tb3VyY2VMYXllciwgU09VUkNFX01BUlFVRUVfTElNSVQgfSBmcm9tICcuLi8uLi9yZWdpb24tb3ZlcmxheS9yZWdpb24tc291cmNlLWxheWVyJztcbmltcG9ydCB7XG4gIGRyYXdEcmFmdFBhdGgsXG4gIGRyYXdEcmFmdFJlY3QsXG4gIGRyYXdSZWdpb25MYWJlbCxcbiAgZHJhd1NlbGVjdGlvbkJhbmQsXG4gIGRyYXdTZWxlY3Rpb25IYW5kbGVzLFxuICBzdHlsZVJlZ2lvblNoYXBlLFxuICB2ZXJ0ZXhNYXJrZXIsXG59IGZyb20gJy4vb3NkLXJlZ2lvbi1vdmVybGF5LWRyYXcnO1xuaW1wb3J0IHsgRURJVF9UT0xfUFgsIEVkaXRab25lLCBaT05FX0NVUlNPUiwgcmVjdFpvbmUsIHJlc2l6ZVJlY3QgfSBmcm9tICcuLi8uLi9yZWdpb24tb3ZlcmxheS9yZWdpb24taGl0LXRlc3QnO1xuXG4vKipcbiAqIFRoZSBzaGFyZWQgcmVnaW9uIHN0b3JlIGFzIHRoZSBvdmVybGF5IG5lZWRzIGl0OiB0aGUgY3Jvc3MtYmFja2VuZFxuICoge0BsaW5rIElSZWdpb25TdG9yZX0gKHJlYWQgcmVnaW9ucywgc2VsZWN0aW9uLCBjb2xvdXJzKSBwbHVzIHRoZSBSZWdpb24tbmF0aXZlXG4gKiB7QGxpbmsgSVJlZ2lvbkVkaXRBcGl9IChhZGQvbW92ZS9yZXNpemUvdmVydGV4IGVkaXRzKS4gVGhlIHNoYXJlZCBSZWdpb25TdG9yZVxuICogc2F0aXNmaWVzIGJvdGguIFRoZSBvdmVybGF5IGVkaXRzIHRocm91Z2ggdGhlc2UgdHlwZWQgb3BlcmF0aW9ucyBvbiB0aGVcbiAqIG5ldXRyYWwgUmVnaW9uIG1vZGVsIOKAlCBpdCBuZXZlciB0b3VjaGVzIGEgYmFja2VuZCdzIG93biBzaGFwZSByZXByZXNlbnRhdGlvblxuICogKGUuZy4gUGxvdGx5J3MgYHgwL3kwL3gxL3kxYCAvIGBN4oCmTOKAplpgIGRpY3RzKS4gV2l0aCB7QGxpbmsgSVJlZ2lvblNvdXJjZUFwaX1cbiAqIChvcHRpb25hbCkgaXQgYWxzbyBkcmF3cyBhbmQgcGlja3MgdGhlIGltYWdlJ3MgcmVnaW9uIHNvdXJjZS5cbiAqL1xuZXhwb3J0IHR5cGUgUmVnaW9uRWRpdFN0b3JlID0gSVJlZ2lvblN0b3JlICYgSVJlZ2lvbkVkaXRBcGkgJiBQYXJ0aWFsPElSZWdpb25Tb3VyY2VBcGk+O1xuXG5jb25zdCBTVkdOUyA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7XG5cbi8qKiBBIHJlZ2lvbidzIGdlb21ldHJ5IGF0IHRoZSBzdGFydCBvZiBhIG1vdmUvcmVzaXplIChzZWUgYHNuYXBzaG90YCk6IGEgcmVjdGFuZ2xlJ3NcbiAqICBib3ggZm9yIGEgcmVzaXplLCBvciB0aGUgcG9seWdvbi9tdWx0aS1wb2x5Z29uIGJvdW5kcyB0aGVtc2VsdmVzIGZvciBhIG1vdmUg4oCUIHRoZVxuICogIHN0b3JlIGlzIGNvcHktb24td3JpdGUsIHNvIHRoZSBnZXN0dXJlLXN0YXJ0IGluc3RhbmNlIG5ldmVyIGNoYW5nZXMgdW5kZXIgdGhlIGRyYWcuICovXG50eXBlIEVkaXRTbmFwc2hvdCA9XG4gIHsga2luZDogJ3JlY3QnOyB4OiBudW1iZXI7IHk6IG51bWJlcjsgdzogbnVtYmVyOyBoOiBudW1iZXIgfSB8IHsga2luZDogJ3NoYXBlJzsgYm91bmRzOiBQb2x5Z29uIHwgTXVsdGlQb2x5Z29uIH07XG5cbi8qKlxuICogT3BlblNlYWRyYWdvbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSVJlZ2lvbk92ZXJsYXl9LlxuICpcbiAqIC0gUmVuZGVycyB0aGUgc3RvcmUncyByZWdpb25zIChyZWN0L3BvbHlnb24pIGluIGltYWdlLXBpeGVsIHNwYWNlLCBrZXB0XG4gKiAgIGFsaWduZWQgb24gZXZlcnkgcGFuL3pvb20gdmlhIHRoZSBPU0Qgdmlld3BvcnQgQVBJLlxuICogLSBEcmF3cyBuZXcgcmVjdGFuZ2xlIGFuZCBwb2x5Z29uIHJlZ2lvbnMgKGNvbW1pdHRlZCB0byB0aGUgc2hhcmVkIHN0b3JlKS5cbiAqIC0gQ2xpY2stdG8tc2VsZWN0IGluICdzZWxlY3QnIG1vZGUuXG4gKlxuICogUmVhZHMvd3JpdGVzIHRoZSBzaGFyZWQge0BsaW5rIElSZWdpb25TdG9yZX0sIHNvIHJlZ2lvbnMgc3RheSBpbiBzeW5jIHdpdGggdGhlXG4gKiBSZWdpb24gRWRpdG9yIGFuZCB0aGUgUGxvdGx5IGJhY2tlbmQuIFRoZSB3YW5kLCB2ZXJ0ZXgtZXJhc2VyIGFuZCB6b29tLXRvLWJveFxuICogdG9vbHMgYXJlIE5PVCBoYW5kbGVkIGhlcmUg4oCUIHRoZXkncmUgb3duZWQgYnkgT3BlblNlYWRyYWdvblZpc3VhbGl6ZXJTZXJ2aWNlXG4gKiAod2hpY2ggYmluZHMgdGhlbSB0byBPU0QgdmlhIHRoZSBzaGFyZWQgY29vcmRpbmF0ZSB0cmFuc2Zvcm0gKyB2aWV3cG9ydCBwaXhlbFxuICogcmVhZGJhY2spLCB0aGUgc2FtZSBzaW5nbGV0b24gdG9vbCBzZXJ2aWNlcyB0aGUgUGxvdGx5IGJhY2tlbmQgdXNlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIE9zZFJlZ2lvbk92ZXJsYXkgaW1wbGVtZW50cyBJUmVnaW9uT3ZlcmxheSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3ZnOiBTVkdTVkdFbGVtZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IHN1YnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByaXZhdGUgc2VsZWN0ZWQ6IG51bWJlcltdID0gW107XG4gIHByaXZhdGUgbW9kZTogUmVnaW9uVG9vbE1vZGUgPSAnbm9uZSc7XG5cbiAgcHJpdmF0ZSB0cmFja2VyOiBPcGVuU2VhZHJhZ29uLk1vdXNlVHJhY2tlcjtcbiAgcHJpdmF0ZSByZWN0U3RhcnQ6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB8IG51bGwgPSBudWxsOyAvLyBpbWFnZSBjb29yZHNcbiAgcHJpdmF0ZSByZWN0Q3VycmVudDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcG9seVBvaW50czogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9W10gPSBbXTsgLy8gaW1hZ2UgY29vcmRzXG4gIC8qKiBUcnVlIHdoaWxlIGRyYWdnaW5nIGEgZnJlZWhhbmQgcGF0aCAoZnJlZWZvcm0gLyBwb2x5bGluZSkuICovXG4gIHByaXZhdGUgZnJlZWhhbmREcmFnZ2luZyA9IGZhbHNlO1xuICAvKiogVHJ1ZSB3aGlsZSBwbGFjaW5nIGEgY2xpY2stdG8tYWRkIHBvbHlnb24gKCdkcmF3cG9seWdvbicgbW9kZSkuICovXG4gIHByaXZhdGUgZHJhd2luZ1BvbHlnb24gPSBmYWxzZTtcbiAgLyoqIExhc3QgZWxlbWVudC1waXhlbCBwb2ludCBhcHBlbmRlZCwgdG8gdGhpbiB0aGUgZnJlZWhhbmQgcGF0aC4gKi9cbiAgcHJpdmF0ZSBsYXN0RnJlZWhhbmRQeDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gIC8qKlxuICAgKiBJbi1wcm9ncmVzcyBlZGl0IG9mIHRoZSBzZWxlY3RlZCByZWdpb246XG4gICAqICAtIGtpbmQgJ2JvdW5kcycg4oCUIHJlY3RhbmdsZSByZXNpemUvbW92ZSBvciB3aG9sZS1yZWdpb24gbW92ZSAodXNlcyBgem9uZWApO1xuICAgKiAgLSBraW5kICd2ZXJ0ZXgnIOKAlCBkcmFnZ2luZyBhIHNpbmdsZSBwb2x5Z29uIHZlcnRleCAodXNlcyBgdmVydGV4SW5kZXhgKS5cbiAgICovXG4gIHByaXZhdGUgZWRpdDoge1xuICAgIGtpbmQ6ICdib3VuZHMnIHwgJ3ZlcnRleCcgfCAnaGFuZGxlJztcbiAgICB6b25lOiBFZGl0Wm9uZTtcbiAgICB2ZXJ0ZXhJbmRleDogbnVtYmVyO1xuICAgIC8qKiBXaGljaCByaW5nIHRoZSBkcmFnZ2VkIHZlcnRleCBiZWxvbmdzIHRvOiAtMSA9IGV4dGVyaW9yLCBlbHNlIGEgaG9sZVxuICAgICAqICBpbmRleCBpbnRvIGBQb2x5Z29uLmhvbGVzYCAoaml0LXVpIzg1KS4gKi9cbiAgICByaW5nOiBudW1iZXI7XG4gICAgaGFuZGxlU2lkZTogJ2luJyB8ICdvdXQnO1xuICAgIGlkOiBudW1iZXI7XG4gICAgc3RhcnRJbWc6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfTtcbiAgICAvKiogR2VzdHVyZS1zdGFydCBnZW9tZXRyeTsgc2V0IGZvciAnYm91bmRzJyBlZGl0cyBvbmx5LiAqL1xuICAgIG9yaWc6IEVkaXRTbmFwc2hvdCB8IG51bGw7XG4gIH0gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBlZGl0RHJhZ2dlZCA9IGZhbHNlO1xuICAvKiogUnViYmVyLWJhbmQgKG1hcnF1ZWUpIG11bHRpLXNlbGVjdCBpbiAnc2VsZWN0JyBtb2RlOiBwcmVzcyBvbiBlbXB0eSBzcGFjZVxuICAgKiAgYW5kIGRyYWcgdG8gc2VsZWN0IGV2ZXJ5IHJlZ2lvbiB0aGUgYmFuZCBpbnRlcnNlY3RzLiBJbWFnZSBjb29yZHMuICovXG4gIHByaXZhdGUgYmFuZFN0YXJ0OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBiYW5kQ3VycmVudDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYmFuZERyYWdnZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHJlZHJhd0hhbmRsZXIgPSAoKSA9PiB0aGlzLnJlZHJhdygpO1xuICAvKiogQSBjYW1lcmEgbW92ZSAoJ3VwZGF0ZS12aWV3cG9ydCcsIHJhaXNlZCBvbiBldmVyeSByZWRyYXduIGZyYW1lLCBhbmltYXRlZCBvbmVzXG4gICAqICBpbmNsdWRlZDsgJ3Jlc2l6ZSc7ICdyb3RhdGUnKS4gVGhlIHJlZ2lvbnMgYXJlIGRyYXduIGluIGltYWdlIGNvb3JkaW5hdGVzLCBzb1xuICAgKiAgb25seSB0aGUgcmVuZGVyZXIncyB0cmFuc2Zvcm0gYW5kIGl0cyBmZXcgc2NyZWVuLXNwYWNlIGVsZW1lbnRzIGZvbGxvdzsgbm90aGluZ1xuICAgKiAgaXMgcmVidWlsdCAoT1NELVBMT1RMWS0xMSkuIEEgdGlsZS1vbmx5IGZyYW1lIChsb2FkaW5nLCByZWNvbG9yKSBsZWF2ZXMgdGhlXG4gICAqICBwcm9qZWN0aW9uLCBhbmQgc28gdGhlIERPTSwgdW50b3VjaGVkLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNhbWVyYUhhbmRsZXIgPSAoKSA9PiB0aGlzLnVwZGF0ZUNhbWVyYSgpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlbmRlcmVyOiBTdmdSZWdpb25SZW5kZXJlcjtcbiAgLyoqIFRoZSBpbWFnZSdzIHJlZ2lvbiBzb3VyY2UsIGRyYXduIHVuZGVyIHRoZSByZWdpb25zIGF0IHRoZSB6b29tJ3MgbGV2ZWwgb2YgZGV0YWlsLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNvdXJjZUxheWVyOiBSZWdpb25Tb3VyY2VMYXllciB8IG51bGw7XG4gIC8qKiBPU0QncyBNb3VzZVRyYWNrZXIgZHJvcHMgYSBjYW5jZWxsZWQgcG9pbnRlciAodG91Y2ggaW50ZXJydXB0ZWQsIHBvaW50ZXJcbiAgICogIGNhcHR1cmUgbG9zdCB0byB0aGUgYnJvd3Nlcikgd2l0aG91dCBjYWxsaW5nIHJlbGVhc2VIYW5kbGVyLCBzbyB0aGVcbiAgICogIGdlc3R1cmUgaXMgZW5kZWQgaGVyZSBpbnN0ZWFkLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHBvaW50ZXJDYW5jZWxIYW5kbGVyID0gKCkgPT4ge1xuICAgIHRoaXMuZW5kR2VzdHVyZSgpO1xuICAgIHRoaXMucmVkcmF3KCk7XG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB2aWV3ZXI6IE9zZFZpZXdlckxpa2UsXG4gICAgcHJpdmF0ZSBzdG9yZTogUmVnaW9uRWRpdFN0b3JlLFxuICApIHtcbiAgICB0aGlzLnN2ZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdOUywgJ3N2ZycpIGFzIFNWR1NWR0VsZW1lbnQ7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLnN2Zy5zdHlsZSwge1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBsZWZ0OiAnMCcsXG4gICAgICB0b3A6ICcwJyxcbiAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJywgLy8gT1NEIGhhbmRsZXMgbmF2aWdhdGlvbiB1bmxlc3Mgd2UncmUgZHJhd2luZ1xuICAgIH0pO1xuICAgIHRoaXMudmlld2VyLmNhbnZhcy5hcHBlbmRDaGlsZCh0aGlzLnN2Zyk7XG4gICAgdGhpcy5yZW5kZXJlciA9IG5ldyBTdmdSZWdpb25SZW5kZXJlcih0aGlzLnN2Zywge1xuICAgICAgcmVjdEVsZW1lbnQ6ICdwb2x5Z29uJyxcbiAgICAgIHN0eWxlU2hhcGU6IChlbCwgcmVnaW9uLCBzZWxlY3RlZCkgPT5cbiAgICAgICAgc3R5bGVSZWdpb25TaGFwZShlbCwgcmVnaW9uLCBzZWxlY3RlZCwgdGhpcy5zdG9yZS5nZXRTaGFwZUNvbG9yKCksIHRoaXMuc3RvcmUuZ2V0UmVnaW9uU3R5bGU/LigpKSxcbiAgICAgIC8vIFRoZSBjbGFzcyBsYWJlbCwgd2hlbiB0aGUgUmVnaW9uIEVkaXRvcidzIFwic2hvdyBsYWJlbHNcIiBpcyBvbi5cbiAgICAgIGRlY29yYXRlOiAocmVnaW9uLCBfaSwgX3NlbGVjdGVkLCBsYXllcikgPT4ge1xuICAgICAgICBpZiAodGhpcy5zdG9yZS5nZXRTaG93U2hhcGVMYWJlbCgpICYmICF0aGlzLnN0b3JlLmlzTGFiZWxDb3ZlcmVkPy4ocmVnaW9uLmxhYmVsKSkge1xuICAgICAgICAgIGRyYXdSZWdpb25MYWJlbChsYXllciwgcmVnaW9uLCB0aGlzLnN0b3JlLmdldFNoYXBlQ29sb3IoKSwgdGhpcy5zdG9yZS5nZXRSZWdpb25TdHlsZT8uKCkpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2tpcDogKHJlZ2lvbikgPT4gdGhpcy5oaWRkZW4ocmVnaW9uKSxcbiAgICB9KTtcbiAgICB0aGlzLnNvdXJjZUxheWVyID0gdGhpcy5zdG9yZS5nZXRSZWdpb25Tb3VyY2VWaWV3JFxuICAgICAgPyBuZXcgUmVnaW9uU291cmNlTGF5ZXIodGhpcy5zdmcsIHRoaXMuc3RvcmUuZ2V0UmVnaW9uU291cmNlVmlldyQoKSlcbiAgICAgIDogbnVsbDtcbiAgICB0aGlzLnZpZXdlci5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIHRoaXMucG9pbnRlckNhbmNlbEhhbmRsZXIpO1xuXG4gICAgLy8gJ3VwZGF0ZS12aWV3cG9ydCcgZmlyZXMgb24gZXZlcnkgcmVkcmF3biBmcmFtZSwgYW5pbWF0ZWQgb25lcyBpbmNsdWRlZCDigJRcbiAgICAvLyBhbHNvIGxpc3RlbmluZyB0byAnYW5pbWF0aW9uJyByZWJ1aWx0IHRoZSB3aG9sZSBTVkcgdHdpY2UgcGVyIGZyYW1lLlxuICAgIHRoaXMudmlld2VyLmFkZEhhbmRsZXIoJ3VwZGF0ZS12aWV3cG9ydCcsIHRoaXMuY2FtZXJhSGFuZGxlcik7XG4gICAgdGhpcy52aWV3ZXIuYWRkSGFuZGxlcigncmVzaXplJywgdGhpcy5jYW1lcmFIYW5kbGVyKTtcbiAgICB0aGlzLnZpZXdlci5hZGRIYW5kbGVyKCdyb3RhdGUnLCB0aGlzLmNhbWVyYUhhbmRsZXIpO1xuICAgIC8vIEtlZXAgd2hlZWwtem9vbSBhbGl2ZSB3aGlsZSBhIHRvb2wgaGFzIG1vdXNlLW5hdiBkaXNhYmxlZCAoc2VlIGhhbmRsZXIpLlxuICAgIHRoaXMudmlld2VyLmVsZW1lbnQ/LmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgdGhpcy53aGVlbFpvb21IYW5kbGVyLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuXG4gICAgdGhpcy50cmFja2VyID0gbmV3IE9TRC5Nb3VzZVRyYWNrZXIoe1xuICAgICAgZWxlbWVudDogdGhpcy52aWV3ZXIuY2FudmFzLFxuICAgICAgcHJlc3NIYW5kbGVyOiAoZTogYW55KSA9PiB0aGlzLm9uUHJlc3MoZSksXG4gICAgICBkcmFnSGFuZGxlcjogKGU6IGFueSkgPT4gdGhpcy5vbkRyYWcoZSksXG4gICAgICByZWxlYXNlSGFuZGxlcjogKGU6IGFueSkgPT4gdGhpcy5vblJlbGVhc2UoZSksXG4gICAgICBjbGlja0hhbmRsZXI6IChlOiBhbnkpID0+IHRoaXMub25DbGljayhlKSxcbiAgICAgIG1vdmVIYW5kbGVyOiAoZTogYW55KSA9PiB0aGlzLm9uTW92ZShlKSxcbiAgICB9KTtcbiAgICB0aGlzLnRyYWNrZXIuc2V0VHJhY2tpbmcoZmFsc2UpO1xuXG4gICAgdGhpcy5zdWJzLmFkZCh0aGlzLnN0b3JlLmdldFJlZ2lvblVwZGF0ZUV2ZW50KCkuc3Vic2NyaWJlKHRoaXMucmVkcmF3SGFuZGxlcikpO1xuICAgIHRoaXMuc3Vicy5hZGQoXG4gICAgICB0aGlzLnN0b3JlLmdldFNlbGVjdGVkU2hhcGVJbmRpY2VzJCgpLnN1YnNjcmliZSgoaWR4KSA9PiB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBpZHggfHwgW107XG4gICAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgdGhpcy5yZWRyYXcoKTtcbiAgfVxuXG4gIC8qKiBTd2l0Y2ggZHJhd2luZy9zZWxlY3Rpb24gbW9kZTsgdG9nZ2xlcyBPU0QgbmF2aWdhdGlvbiBhY2NvcmRpbmdseS4gKi9cbiAgc2V0TW9kZShtb2RlOiBSZWdpb25Ub29sTW9kZSk6IHZvaWQge1xuICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgdGhpcy5yZXNldEluUHJvZ3Jlc3MoKTtcbiAgICAvLyBBbnkgYWN0aXZlIHJlZ2lvbiB0b29sIHRha2VzIG92ZXIgdGhlIHBvaW50ZXIg4oCUIE9TRCBwYW4vem9vbSBpcyBkaXNhYmxlZFxuICAgIC8vIHNvIGRyYWdnaW5nIGRyYXdzIChhbmQgY2xpY2tzIHNlbGVjdCkgaW5zdGVhZCBvZiBwYW5uaW5nLiBXaXRoIG5vIHRvb2wsXG4gICAgLy8gT1NEIG5hdmlnYXRlcyBub3JtYWxseS5cbiAgICB0aGlzLnZpZXdlci5zZXRNb3VzZU5hdkVuYWJsZWQobW9kZSA9PT0gJ25vbmUnKTtcbiAgICB0aGlzLnRyYWNrZXIuc2V0VHJhY2tpbmcobW9kZSAhPT0gJ25vbmUnKTtcbiAgICB0aGlzLnVwZGF0ZUN1cnNvcihmYWxzZSk7XG4gICAgdGhpcy5yZW5kZXJPdmVybGF5KCk7XG4gIH1cblxuICAvKiogRHJpdmUgT1NEIHpvb20gZnJvbSB0aGUgd2hlZWwgd2hpbGUgYW55IHRvb2wgb3ducyB0aGUgcG9pbnRlci5cbiAgICpcbiAgICogT1NEJ3MgbmF0aXZlIHNjcm9sbC16b29tIGlzIHBhcnQgb2YgbW91c2UtbmF2LCBzbyBgc2V0TW91c2VOYXZFbmFibGVkKGZhbHNlKWBcbiAgICogKHVzZWQgYnkgZXZlcnkgcmVnaW9uIHRvb2wgYW5kIGJ5IHRoZSB3YW5kL2JydXNoL2VyYXNlci9TQU0gdG9vbHMpIGRpc2FibGVzXG4gICAqIGl0LiBUaGUgY292ZXJpbmctY2FudmFzIHRvb2xzIGFsc28gc2l0IGFib3ZlIHRoZSBPU0QgY2FudmFzIGFuZCBzd2FsbG93IHRoZVxuICAgKiB3aGVlbCBvdXRyaWdodC4gVGhpcyBsaXN0ZW5lciBpcyBib3VuZCBvbmNlIHRvIHRoZSB2aWV3ZXIgZWxlbWVudCDigJQgYW5cbiAgICogYW5jZXN0b3Igb2YgYm90aCB0aGUgT1NEIGNhbnZhcyBhbmQgdGhlIHRvb2wgb3ZlcmxheXMg4oCUIGFuZCBmb3J3YXJkcyB0aGVcbiAgICogd2hlZWwgdG8gYSBjdXJzb3ItY2VudHJlZCB6b29tIHdoZW5ldmVyIG1vdXNlLW5hdiBpcyBvZmYuIFdoZW4gbmF2IGlzIG9uIChub1xuICAgKiB0b29sIGFjdGl2ZSkgaXQgZG9lcyBub3RoaW5nIGFuZCBPU0Qgem9vbXMgbmF0aXZlbHkuIChqaXQtdWkjOTQpICovXG4gIHByaXZhdGUgcmVhZG9ubHkgd2hlZWxab29tSGFuZGxlciA9IChlOiBXaGVlbEV2ZW50KSA9PiB7XG4gICAgY29uc3QgdnAgPSB0aGlzLnZpZXdlcj8udmlld3BvcnQ7XG4gICAgY29uc3QgZWwgPSB0aGlzLnZpZXdlcj8uZWxlbWVudDtcbiAgICAvLyBOYXYgb24g4oaSIG5vIHRvb2wgYWN0aXZlIOKGkiBsZXQgT1NEIGhhbmRsZSBzY3JvbGwtem9vbSBuYXRpdmVseS5cbiAgICBpZiAoIXZwIHx8ICFlbCB8fCBlLmRlbHRhWSA9PT0gMCB8fCB0aGlzLnZpZXdlci5pc01vdXNlTmF2RW5hYmxlZCgpKSByZXR1cm47XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCByZWZQb2ludCA9IHZwLnBvaW50RnJvbVBpeGVsKG5ldyBPU0QuUG9pbnQoZS5jbGllbnRYIC0gcmVjdC5sZWZ0LCBlLmNsaWVudFkgLSByZWN0LnRvcCkpO1xuICAgIHZwLnpvb21CeShlLmRlbHRhWSA8IDAgPyBPU0RfWk9PTV9QRVJfU0NST0xMIDogMSAvIE9TRF9aT09NX1BFUl9TQ1JPTEwsIHJlZlBvaW50KTtcbiAgICB2cC5hcHBseUNvbnN0cmFpbnRzKCk7XG4gIH07XG5cbiAgLyoqIEN1cnNvciBmZWVkYmFjayBwZXIgbW9kZSAoY3Jvc3NoYWlyIHdoaWxlIGRyYXdpbmc7IHBvaW50ZXIgb3ZlciBhIHJlZ2lvblxuICAgKiAgaW4gc2VsZWN0IG1vZGUpLiAqL1xuICBwcml2YXRlIHVwZGF0ZUN1cnNvcihvdmVyUmVnaW9uOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgY2FudmFzID0gdGhpcy52aWV3ZXIuY2FudmFzO1xuICAgIGlmIChcbiAgICAgIHRoaXMubW9kZSA9PT0gJ2RyYXdyZWN0JyB8fFxuICAgICAgdGhpcy5tb2RlID09PSAnZHJhd2Nsb3NlZHBhdGgnIHx8XG4gICAgICB0aGlzLm1vZGUgPT09ICdkcmF3b3BlbnBhdGgnIHx8XG4gICAgICB0aGlzLm1vZGUgPT09ICdkcmF3cG9seWdvbicgfHxcbiAgICAgIHRoaXMubW9kZSA9PT0gJ2FkZHBvaW50JyB8fFxuICAgICAgdGhpcy5tb2RlID09PSAnZGVsZXRlcG9pbnQnXG4gICAgKSB7XG4gICAgICBjYW52YXMuc3R5bGUuY3Vyc29yID0gJ2Nyb3NzaGFpcic7XG4gICAgfSBlbHNlIGlmICh0aGlzLm1vZGUgPT09ICdtb3ZlJykge1xuICAgICAgY2FudmFzLnN0eWxlLmN1cnNvciA9ICdtb3ZlJztcbiAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSA9PT0gJ3NlbGVjdCcpIHtcbiAgICAgIGNhbnZhcy5zdHlsZS5jdXJzb3IgPSBvdmVyUmVnaW9uID8gJ3BvaW50ZXInIDogJ2RlZmF1bHQnO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYW52YXMuc3R5bGUuY3Vyc29yID0gJyc7IC8vIE9TRCBkZWZhdWx0IChncmFiKVxuICAgIH1cbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZSBzZWxlY3RlZCByZWdpb24ncyB2ZXJ0aWNlcy9oYW5kbGVzIHNob3VsZCBiZSBkcmF3bi4gU2hvd25cbiAgICogIHdoZW5ldmVyIGEgcmVnaW9uIGlzIHNlbGVjdGVkIOKAlCBpbmNsdWRpbmcgYG5vbmVgIChkaXNwbGF5KSBtb2RlIGFuZCB3aGlsZVxuICAgKiAgYW5vdGhlciB0b29sICh3YW5kLCBicnVzaCwgU0FN4oCmKSBpcyBhY3RpdmUg4oCUIHNvIGEgc2VsZWN0aW9uIGFsd2F5cyByZXZlYWxzXG4gICAqICBpdHMgdmVydGljZXMuIFN1cHByZXNzZWQgb25seSB3aGlsZSBhY3RpdmVseSBkcmF3aW5nIGEgYnJhbmQtbmV3IHNoYXBlLFxuICAgKiAgd2hlcmUgc3RyYXkgaGFuZGxlcyB3b3VsZCBiZSBub2lzZS4gKi9cbiAgcHJpdmF0ZSBnZXQgc2hvd3NTZWxlY3RlZFZlcnRpY2VzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLm1vZGUgIT09ICdkcmF3cmVjdCcgJiZcbiAgICAgIHRoaXMubW9kZSAhPT0gJ2RyYXdwb2x5Z29uJyAmJlxuICAgICAgdGhpcy5tb2RlICE9PSAnZHJhd2Nsb3NlZHBhdGgnICYmXG4gICAgICB0aGlzLm1vZGUgIT09ICdkcmF3b3BlbnBhdGgnXG4gICAgKTtcbiAgfVxuXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgLy8gQ2xvc2UgYSBnZXN0dXJlIGluIGZsaWdodCBmaXJzdDogYSBkcmFnJ3Mgb3BlbiBzdG9yZSBiYXRjaCB3b3VsZFxuICAgIC8vIG90aGVyd2lzZSBzdXBwcmVzcyBldmVyeSBsYXRlciByZWdpb24tdXBkYXRlIGVtaXNzaW9uIGFwcC13aWRlLlxuICAgIHRoaXMuZW5kR2VzdHVyZSgpO1xuICAgIHRoaXMudmlld2VyLmNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyY2FuY2VsJywgdGhpcy5wb2ludGVyQ2FuY2VsSGFuZGxlcik7XG4gICAgdGhpcy5zdWJzLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy52aWV3ZXIuZWxlbWVudD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLndoZWVsWm9vbUhhbmRsZXIpO1xuICAgIHRoaXMudmlld2VyLnJlbW92ZUhhbmRsZXIoJ3VwZGF0ZS12aWV3cG9ydCcsIHRoaXMuY2FtZXJhSGFuZGxlcik7XG4gICAgdGhpcy52aWV3ZXIucmVtb3ZlSGFuZGxlcigncmVzaXplJywgdGhpcy5jYW1lcmFIYW5kbGVyKTtcbiAgICB0aGlzLnZpZXdlci5yZW1vdmVIYW5kbGVyKCdyb3RhdGUnLCB0aGlzLmNhbWVyYUhhbmRsZXIpO1xuICAgIGlmICh0aGlzLnRyYWNrZXIpIHRoaXMudHJhY2tlci5kZXN0cm95KCk7XG4gICAgdGhpcy5zb3VyY2VMYXllcj8uZGVzdHJveSgpO1xuICAgIGlmICh0aGlzLnN2Zy5wYXJlbnROb2RlKSB0aGlzLnN2Zy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuc3ZnKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBjb29yZGluYXRlIGhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8qKiBJbWFnZS1waXhlbCBwb2ludCAtPiBlbGVtZW50IHBpeGVsIHBvaW50LiAqL1xuICBwcml2YXRlIHRvUHgoaW1nWDogbnVtYmVyLCBpbWdZOiBudW1iZXIpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0ge1xuICAgIHJldHVybiBpbWFnZVRvRWxlbWVudCh0aGlzLnZpZXdlciwgaW1nWCwgaW1nWSk7XG4gIH1cbiAgLyoqIEVsZW1lbnQgcGl4ZWwgcG9pbnQgKGZyb20gYSBNb3VzZVRyYWNrZXIgZXZlbnQpIC0+IGltYWdlLXBpeGVsIHBvaW50LCByb3VuZGVkXG4gICAqICB0byB3aG9sZSBwaXhlbHMgKHdoZXJlIGEgZHJhd24gdmVydGV4IGxhbmRzKS4gKi9cbiAgcHJpdmF0ZSB0b0ltYWdlKHBvczogYW55KTogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHtcbiAgICBjb25zdCBwID0gZWxlbWVudFRvSW1hZ2UodGhpcy52aWV3ZXIsIHBvcy54LCBwb3MueSk7XG4gICAgcmV0dXJuIHsgeDogTWF0aC5yb3VuZChwLngpLCB5OiBNYXRoLnJvdW5kKHAueSkgfTtcbiAgfVxuICAvKiogRWxlbWVudCBwaXhlbCBwb2ludCAtPiBleGFjdCBpbWFnZSBwb2ludCwgZm9yIGhpdCB0ZXN0cy4gKi9cbiAgcHJpdmF0ZSB0b1dvcmxkKHBvczogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9KTogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHtcbiAgICByZXR1cm4gZWxlbWVudFRvSW1hZ2UodGhpcy52aWV3ZXIsIHBvcy54LCBwb3MueSk7XG4gIH1cbiAgLyoqIEltYWdlIHBvaW50IC0+IGVsZW1lbnQgcHgsIGFzIHRoZSBzaGFyZWQgcmVnaW9uIGdlb21ldHJ5IHdhbnRzIGl0LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHRvU2NyZWVuOiBUb1NjcmVlbiA9ICh4LCB5KSA9PiB7XG4gICAgY29uc3QgcSA9IHRoaXMudG9QeCh4LCB5KTtcbiAgICByZXR1cm4gW3EueCwgcS55XTtcbiAgfTtcblxuICAvLyDilIDilIAgcmVuZGVyaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvKiogRm9sbG93IHRoZSBjdXJyZW50IGltYWdl4oaSZWxlbWVudCBwcm9qZWN0aW9uOiB0aGUgcmVuZGVyZXIgcmV3cml0ZXMgb25lIHRyYW5zZm9ybVxuICAgKiAgYW5kIHJlLXBvc2l0aW9ucyBpdHMgc2NyZWVuLXNwYWNlIGVsZW1lbnRzLCBvciBkb2VzIG5vdGhpbmcgd2hlbiBpdCBkaWQgbm90IG1vdmUuICovXG4gIHByaXZhdGUgdXBkYXRlQ2FtZXJhKCk6IHZvaWQge1xuICAgIGNvbnN0IGFmZmluZSA9IGFmZmluZUZyb21Qcm9qZWN0aW9uKHRoaXMudG9TY3JlZW4pO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0Q2FtZXJhKGFmZmluZSk7XG4gICAgdGhpcy5zb3VyY2VMYXllcj8uc2V0Q2FtZXJhKGFmZmluZSk7XG4gIH1cblxuICAvKiogUmVidWlsZCBldmVyeXRoaW5nOiB0aGUgcmVnaW9ucyAoaW4gaW1hZ2UgY29vcmRpbmF0ZXMpLCB0aGVpciBsYWJlbHMgYW5kIHRoZSBvdmVybGF5LiAqL1xuICByZWRyYXcoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVDYW1lcmEoKTtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbmRlcih0aGlzLnN0b3JlLmdldFJlZ2lvbnMoKSwgdGhpcy5zZWxlY3RlZCk7XG4gICAgdGhpcy5yZW5kZXJPdmVybGF5KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVidWlsZCB0aGUgc2NyZWVuLXNwYWNlIG92ZXJsYXkgb25seTogdGhlIHNlbGVjdGVkIHJlZ2lvbidzIGhhbmRsZXMsIHRoZSBydWJiZXIgYmFuZFxuICAgKiBhbmQgYW55IGluLXByb2dyZXNzIGRyYXdpbmcuIERyYXdpbmcgYW5kIG1hcnF1ZWUgZHJhZ3MgY2FsbCB0aGlzIHJhdGhlciB0aGFuXG4gICAqIHtAbGluayByZWRyYXd9LCBzbyB0aGUgcmVnaW9ucyBhcmUgbm90IHJlYnVpbHQgcGVyIHBvaW50ZXIgbW92ZS5cbiAgICovXG4gIHByaXZhdGUgcmVuZGVyT3ZlcmxheSgpOiB2b2lkIHtcbiAgICBjb25zdCBzaGFwZUNvbG9yID0gdGhpcy5zdG9yZS5nZXRTaGFwZUNvbG9yKCk7XG4gICAgdGhpcy5yZW5kZXJlci5yZW5kZXJPdmVybGF5KChsYXllcikgPT4ge1xuICAgICAgLy8gSGFuZGxlcyBvbiB0aGUgc2VsZWN0ZWQgcmVnaW9uLCBzbyB0aGUgdXNlciBjYW4gZ3JhYi9pbnNlcnQvZGVsZXRlXG4gICAgICAvLyB2ZXJ0aWNlcyDigJQgaW4gdGhlIHJlZ2lvbidzIG93biBjb2xvdXIsIHNvIHRoZXkgbWF0Y2ggdGhlIHNoYXBlLlxuICAgICAgY29uc3Qgc2VsID0gdGhpcy5zaG93c1NlbGVjdGVkVmVydGljZXMgPyB0aGlzLnNlbGVjdGVkUmVnaW9uSW5mbygpIDogbnVsbDtcbiAgICAgIGlmIChzZWwpIGRyYXdTZWxlY3Rpb25IYW5kbGVzKGxheWVyLCBzZWwucmVnaW9uLCBzZWwucmVnaW9uLmNvbG9yIHx8IHNoYXBlQ29sb3IpO1xuICAgICAgLy8gUnViYmVyLWJhbmQgKG1hcnF1ZWUpIHNlbGVjdGlvbiBwcmV2aWV3LlxuICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ3NlbGVjdCcgJiYgdGhpcy5iYW5kU3RhcnQgJiYgdGhpcy5iYW5kQ3VycmVudCkge1xuICAgICAgICBkcmF3U2VsZWN0aW9uQmFuZChsYXllciwgdGhpcy5iYW5kU3RhcnQsIHRoaXMuYmFuZEN1cnJlbnQpO1xuICAgICAgfVxuICAgICAgLy8gSW4tcHJvZ3Jlc3MgZHJhd2luZyBwcmV2aWV3LlxuICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ2RyYXdyZWN0JyAmJiB0aGlzLnJlY3RTdGFydCAmJiB0aGlzLnJlY3RDdXJyZW50KSB7XG4gICAgICAgIGRyYXdEcmFmdFJlY3QobGF5ZXIsIHRoaXMucmVjdFN0YXJ0LCB0aGlzLnJlY3RDdXJyZW50LCBzaGFwZUNvbG9yKTtcbiAgICAgIH1cbiAgICAgIGlmICgodGhpcy5tb2RlID09PSAnZHJhd2Nsb3NlZHBhdGgnIHx8IHRoaXMubW9kZSA9PT0gJ2RyYXdvcGVucGF0aCcpICYmIHRoaXMucG9seVBvaW50cy5sZW5ndGgpIHtcbiAgICAgICAgZHJhd0RyYWZ0UGF0aChsYXllciwgdGhpcy5wb2x5UG9pbnRzLCBzaGFwZUNvbG9yKTtcbiAgICAgIH1cbiAgICAgIC8vIENsaWNrLXRvLXBsYWNlIHBvbHlnb24gcHJldmlldzogdGhlIHBvbHlsaW5lIHNvIGZhciArIGEgbWFya2VyIG9uIHRoZVxuICAgICAgLy8gZmlyc3QgdmVydGV4IChjbGljayBpdCB0byBjbG9zZSkuXG4gICAgICBpZiAodGhpcy5tb2RlID09PSAnZHJhd3BvbHlnb24nICYmIHRoaXMucG9seVBvaW50cy5sZW5ndGgpIHtcbiAgICAgICAgZHJhd0RyYWZ0UGF0aChsYXllciwgdGhpcy5wb2x5UG9pbnRzLCBzaGFwZUNvbG9yKTtcbiAgICAgICAgdmVydGV4TWFya2VyKGxheWVyLCB0aGlzLnBvbHlQb2ludHNbMF0ueCwgdGhpcy5wb2x5UG9pbnRzWzBdLnksIHRydWUsIHNoYXBlQ29sb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8g4pSA4pSAIGludGVyYWN0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBwcml2YXRlIGdldCBpc0ZyZWVoYW5kKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1vZGUgPT09ICdkcmF3Y2xvc2VkcGF0aCcgfHwgdGhpcy5tb2RlID09PSAnZHJhd29wZW5wYXRoJztcbiAgfVxuXG4gIHByaXZhdGUgb25QcmVzcyhlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnZHJhd3JlY3QnKSB7XG4gICAgICB0aGlzLnJlY3RTdGFydCA9IHRoaXMudG9JbWFnZShlLnBvc2l0aW9uKTtcbiAgICAgIHRoaXMucmVjdEN1cnJlbnQgPSB0aGlzLnJlY3RTdGFydDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNGcmVlaGFuZCkge1xuICAgICAgLy8gRnJlZWhhbmQgZHJhdyAobWF0Y2hlcyBQbG90bHkgZHJhd2Nsb3NlZHBhdGgvZHJhd29wZW5wYXRoKTogcHJlc3MgdG9cbiAgICAgIC8vIHN0YXJ0LCBkcmFnIHRvIHRyYWNlLCByZWxlYXNlIHRvIGNvbW1pdC5cbiAgICAgIHRoaXMuZnJlZWhhbmREcmFnZ2luZyA9IHRydWU7XG4gICAgICB0aGlzLnBvbHlQb2ludHMgPSBbdGhpcy50b0ltYWdlKGUucG9zaXRpb24pXTtcbiAgICAgIHRoaXMubGFzdEZyZWVoYW5kUHggPSB7IHg6IGUucG9zaXRpb24ueCwgeTogZS5wb3NpdGlvbi55IH07XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLm1vZGUgPT09ICdtb3ZlJykge1xuICAgICAgLy8gV2hvbGUtcmVnaW9uIGRyYWcgKCdtb3ZlJyBtb2RlKTogcHJlc3MgaW5zaWRlIHRoZSBzZWxlY3RlZCByZWdpb25cbiAgICAgIC8vIHRvIHRyYW5zbGF0ZSBpdCwgaWdub3JpbmcgdmVydGljZXMvZWRnZXMuXG4gICAgICBjb25zdCBzZWwgPSB0aGlzLnNlbGVjdGVkUmVnaW9uSW5mbygpO1xuICAgICAgaWYgKHNlbCAmJiB0aGlzLmNvbnRhaW5zUG9pbnQoc2VsLnJlZ2lvbiwgZS5wb3NpdGlvbikpIHtcbiAgICAgICAgdGhpcy5zdGFydEVkaXQoJ2JvdW5kcycsICdtb3ZlJywgLTEsIHNlbC5yZWdpb24sIHRoaXMudG9JbWFnZShlLnBvc2l0aW9uKSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLm1vZGUgPT09ICdzZWxlY3QnKSB7XG4gICAgICAvLyBBIGJlemllciBjb250cm9sIGhhbmRsZSB0YWtlcyB0b3AgcHJpb3JpdHkgKGl0IHNpdHMgb2ZmIHRoZSBhbmNob3IpLCB0aGVuXG4gICAgICAvLyBkcmFnZ2luZyBhIHNpbmdsZSBwb2x5Z29uIHZlcnRleCAob3ZlciBib2R5LW1vdmUvcmVzaXplKS5cbiAgICAgIGNvbnN0IGhpdCA9IHRoaXMuaGl0UG9seWdvbkhhbmRsZShlLnBvc2l0aW9uKTtcbiAgICAgIGlmIChoaXQpIHtcbiAgICAgICAgY29uc3QgcmVnaW9uID0gdGhpcy5zdG9yZS5nZXRSZWdpb25zKClbdGhpcy5zZWxlY3RlZFt0aGlzLnNlbGVjdGVkLmxlbmd0aCAtIDFdXTtcbiAgICAgICAgaWYgKGhpdC5raW5kID09PSAnYmV6aWVyJykge1xuICAgICAgICAgIHRoaXMuc3RhcnRFZGl0KCdoYW5kbGUnLCAnbW92ZScsIGhpdC5pbmRleCwgcmVnaW9uLCB0aGlzLnRvSW1hZ2UoZS5wb3NpdGlvbiksIGhpdC5zaWRlLCBoaXQucmluZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zdGFydEVkaXQoJ3ZlcnRleCcsICdtb3ZlJywgaGl0LmluZGV4LCByZWdpb24sIHRoaXMudG9JbWFnZShlLnBvc2l0aW9uKSwgJ291dCcsIGhpdC5yaW5nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBPdGhlcndpc2Ugc3RhcnQgYSBtb3ZlL3Jlc2l6ZSB3aGVuIHByZXNzaW5nIHRoZSBzZWxlY3RlZCByZWdpb24nc1xuICAgICAgLy8gYm9keS9oYW5kbGVzLlxuICAgICAgY29uc3QgZXogPSB0aGlzLmVkaXRab25lQXQoZS5wb3NpdGlvbik7XG4gICAgICBpZiAoZXopIHtcbiAgICAgICAgdGhpcy5zdGFydEVkaXQoJ2JvdW5kcycsIGV6LnpvbmUsIC0xLCB0aGlzLnN0b3JlLmdldFJlZ2lvbnMoKVtlei5pbmRleF0sIHRoaXMudG9JbWFnZShlLnBvc2l0aW9uKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFByZXNzIG9uIGVtcHR5IHNwYWNlIC8gYSBub24tc2VsZWN0ZWQgcmVnaW9uOiBiZWdpbiBhIHJ1YmJlci1iYW5kXG4gICAgICAvLyBtdWx0aS1zZWxlY3QuIEEgcGxhaW4gY2xpY2sgKG5vIGRyYWcpIGZhbGxzIHRocm91Z2ggdG8gb25DbGljaywgd2hpY2hcbiAgICAgIC8vIHNpbmdsZS1zZWxlY3RzIG9yIGNsZWFycy5cbiAgICAgIHRoaXMuYmFuZFN0YXJ0ID0gdGhpcy50b0ltYWdlKGUucG9zaXRpb24pO1xuICAgICAgdGhpcy5iYW5kQ3VycmVudCA9IHRoaXMuYmFuZFN0YXJ0O1xuICAgICAgdGhpcy5iYW5kRHJhZ2dlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBCZWdpbiBhbiBlZGl0IGdlc3R1cmUgKG1vdmUvcmVzaXplIG9yIHNpbmdsZS12ZXJ0ZXggZHJhZykgYW5kIG9wZW4gYSBzdG9yZVxuICAgKiAgYmF0Y2ggc28gdGhlIGxpdmUgZHJhZyBlbWl0cyBvbmNlIG9uIHJlbGVhc2UuICovXG4gIHByaXZhdGUgc3RhcnRFZGl0KFxuICAgIGtpbmQ6ICdib3VuZHMnIHwgJ3ZlcnRleCcgfCAnaGFuZGxlJyxcbiAgICB6b25lOiBFZGl0Wm9uZSxcbiAgICB2ZXJ0ZXhJbmRleDogbnVtYmVyLFxuICAgIHJlZ2lvbjogUmVnaW9uLFxuICAgIHN0YXJ0SW1nOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0sXG4gICAgaGFuZGxlU2lkZTogJ2luJyB8ICdvdXQnID0gJ291dCcsXG4gICAgcmluZyA9IC0xLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLmVkaXQgPSB7XG4gICAgICBraW5kLFxuICAgICAgem9uZSxcbiAgICAgIHZlcnRleEluZGV4LFxuICAgICAgcmluZyxcbiAgICAgIGhhbmRsZVNpZGUsXG4gICAgICBpZDogcmVnaW9uLmlkLFxuICAgICAgc3RhcnRJbWcsXG4gICAgICBvcmlnOiBraW5kID09PSAnYm91bmRzJyA/IHRoaXMuc25hcHNob3QocmVnaW9uKSA6IG51bGwsXG4gICAgfTtcbiAgICB0aGlzLmVkaXREcmFnZ2VkID0gZmFsc2U7XG4gICAgdGhpcy5zdG9yZS5iZWdpbkJhdGNoKCk7XG4gIH1cblxuICBwcml2YXRlIG9uRHJhZyhlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnZHJhd3JlY3QnICYmIHRoaXMucmVjdFN0YXJ0KSB7XG4gICAgICB0aGlzLnJlY3RDdXJyZW50ID0gdGhpcy50b0ltYWdlKGUucG9zaXRpb24pO1xuICAgICAgdGhpcy5yZW5kZXJPdmVybGF5KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmZyZWVoYW5kRHJhZ2dpbmcgJiYgdGhpcy5pc0ZyZWVoYW5kKSB7XG4gICAgICAvLyBUaGluIHRoZSBwYXRoOiBvbmx5IHNhbXBsZSBvbmNlIHRoZSBjdXJzb3IgaGFzIG1vdmVkIGEgZmV3IHNjcmVlbiBweC5cbiAgICAgIGNvbnN0IGxhc3QgPSB0aGlzLmxhc3RGcmVlaGFuZFB4O1xuICAgICAgaWYgKCFsYXN0IHx8IE1hdGguaHlwb3QoZS5wb3NpdGlvbi54IC0gbGFzdC54LCBlLnBvc2l0aW9uLnkgLSBsYXN0LnkpID49IDQpIHtcbiAgICAgICAgdGhpcy5wb2x5UG9pbnRzLnB1c2godGhpcy50b0ltYWdlKGUucG9zaXRpb24pKTtcbiAgICAgICAgdGhpcy5sYXN0RnJlZWhhbmRQeCA9IHsgeDogZS5wb3NpdGlvbi54LCB5OiBlLnBvc2l0aW9uLnkgfTtcbiAgICAgICAgdGhpcy5yZW5kZXJPdmVybGF5KCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmVkaXQpIHtcbiAgICAgIHRoaXMuZWRpdERyYWdnZWQgPSB0cnVlO1xuICAgICAgdGhpcy5hcHBseUVkaXQodGhpcy50b0ltYWdlKGUucG9zaXRpb24pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuYmFuZFN0YXJ0KSB7XG4gICAgICB0aGlzLmJhbmRDdXJyZW50ID0gdGhpcy50b0ltYWdlKGUucG9zaXRpb24pO1xuICAgICAgdGhpcy5iYW5kRHJhZ2dlZCA9IHRydWU7XG4gICAgICB0aGlzLnJlbmRlck92ZXJsYXkoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uUmVsZWFzZShlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnZHJhd3JlY3QnICYmIHRoaXMucmVjdFN0YXJ0KSB7XG4gICAgICBjb25zdCBlbmQgPSB0aGlzLnRvSW1hZ2UoZS5wb3NpdGlvbik7XG4gICAgICBjb25zdCB4ID0gTWF0aC5taW4odGhpcy5yZWN0U3RhcnQueCwgZW5kLngpO1xuICAgICAgY29uc3QgeSA9IE1hdGgubWluKHRoaXMucmVjdFN0YXJ0LnksIGVuZC55KTtcbiAgICAgIGNvbnN0IHcgPSBNYXRoLmFicyhlbmQueCAtIHRoaXMucmVjdFN0YXJ0LngpO1xuICAgICAgY29uc3QgaCA9IE1hdGguYWJzKGVuZC55IC0gdGhpcy5yZWN0U3RhcnQueSk7XG4gICAgICB0aGlzLnJlY3RTdGFydCA9IHRoaXMucmVjdEN1cnJlbnQgPSBudWxsO1xuICAgICAgaWYgKHcgPiAyICYmIGggPiAyKSB0aGlzLmNvbW1pdFJlY3RhbmdsZSh4LCB5LCB3LCBoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuZnJlZWhhbmREcmFnZ2luZykge1xuICAgICAgdGhpcy5mcmVlaGFuZERyYWdnaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmxhc3RGcmVlaGFuZFB4ID0gbnVsbDtcbiAgICAgIC8vIENsb3NlZCA9IGZyZWVmb3JtIChkcmF3Y2xvc2VkcGF0aCk7IG9wZW4gPSBwb2x5bGluZSAoZHJhd29wZW5wYXRoKS5cbiAgICAgIHRoaXMuY29tbWl0UG9seWdvbih0aGlzLm1vZGUgPT09ICdkcmF3Y2xvc2VkcGF0aCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBNb3ZlL3Jlc2l6ZSBhbHJlYWR5IGFwcGxpZWQgbGl2ZTsgZmx1c2ggdGhlIGNvYWxlc2NlZCBlZGl0cyArIGVuZCB0aGVcbiAgICAvLyBnZXN0dXJlIChrZWVwIHNlbGVjdGlvbikuXG4gICAgaWYgKHRoaXMuZWRpdCkge1xuICAgICAgdGhpcy5zdG9yZS5lbmRCYXRjaCgpO1xuICAgICAgdGhpcy5lZGl0ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gRmluaXNoIGEgcnViYmVyLWJhbmQgc2VsZWN0aW9uOiBzZWxlY3QgZXZlcnkgcmVnaW9uIHRoZSBiYW5kIGludGVyc2VjdHMuXG4gICAgaWYgKHRoaXMuYmFuZFN0YXJ0KSB7XG4gICAgICBjb25zdCBzdGFydCA9IHRoaXMuYmFuZFN0YXJ0O1xuICAgICAgY29uc3QgZW5kID0gdGhpcy5iYW5kQ3VycmVudCA/PyBzdGFydDtcbiAgICAgIHRoaXMuYmFuZFN0YXJ0ID0gdGhpcy5iYW5kQ3VycmVudCA9IG51bGw7XG4gICAgICBjb25zdCB4MCA9IE1hdGgubWluKHN0YXJ0LngsIGVuZC54KSxcbiAgICAgICAgeTAgPSBNYXRoLm1pbihzdGFydC55LCBlbmQueSk7XG4gICAgICBjb25zdCB4MSA9IE1hdGgubWF4KHN0YXJ0LngsIGVuZC54KSxcbiAgICAgICAgeTEgPSBNYXRoLm1heChzdGFydC55LCBlbmQueSk7XG4gICAgICAvLyBPbmx5IGEgcmVhbCBkcmFnIHNlbGVjdHM7IGEgY2xpY2stc2l6ZWQgYmFuZCBmYWxscyB0aHJvdWdoIHRvIG9uQ2xpY2suXG4gICAgICBpZiAodGhpcy5iYW5kRHJhZ2dlZCAmJiAoeDEgLSB4MCA+IDIgfHwgeTEgLSB5MCA+IDIpKSB7XG4gICAgICAgIHRoaXMuc3RvcmUuc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoXG4gICAgICAgICAgcmVnaW9uc0luUmVjdCh0aGlzLnN0b3JlLmdldFJlZ2lvbnMoKSwgeDAsIHkwLCB4MSwgeTEsIHsgc2tpcDogKHIpID0+IHRoaXMuaGlkZGVuKHIpIH0pLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnNlbGVjdFNvdXJjZUluKHgwLCB5MCwgeDEsIHkxKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVuZGVyT3ZlcmxheSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25DbGljayhlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnc2VsZWN0Jykge1xuICAgICAgLy8gQSBtb3ZlL3Jlc2l6ZS92ZXJ0ZXggZHJhZyBvciBhIHJ1YmJlci1iYW5kIGRyYWcgYWxzbyBlbmRzIHdpdGggYSBjbGlja1xuICAgICAgLy8gZXZlbnQg4oCUIGRvbid0IHRyZWF0IGl0IGFzIGEgcmUtc2VsZWN0aW9uLlxuICAgICAgaWYgKHRoaXMuZWRpdERyYWdnZWQpIHtcbiAgICAgICAgdGhpcy5lZGl0RHJhZ2dlZCA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5iYW5kRHJhZ2dlZCkge1xuICAgICAgICB0aGlzLmJhbmREcmFnZ2VkID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFNoaWZ0IChvciBDbWQvQ3RybCkgdG9nZ2xlcyB0aGUgY2xpY2tlZCByZWdpb24gaW4vb3V0IG9mIHRoZSBjdXJyZW50XG4gICAgICAvLyBzZWxlY3Rpb247IGEgcGxhaW4gY2xpY2sgcmVwbGFjZXMgaXQuXG4gICAgICBjb25zdCBvZSA9IGUub3JpZ2luYWxFdmVudDtcbiAgICAgIGNvbnN0IGFkZGl0aXZlID0gISFvZSAmJiAob2Uuc2hpZnRLZXkgfHwgb2UubWV0YUtleSB8fCBvZS5jdHJsS2V5KTtcbiAgICAgIHRoaXMuc2VsZWN0QXQodGhpcy50b1dvcmxkKGUucG9zaXRpb24pLCBhZGRpdGl2ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLm1vZGUgPT09ICdkcmF3cG9seWdvbicpIHtcbiAgICAgIHRoaXMub25EcmF3UG9seWdvbkNsaWNrKGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5tb2RlID09PSAnYWRkcG9pbnQnKSB7XG4gICAgICAvLyBJbnNlcnQgYSB2ZXJ0ZXggb24gdGhlIGNsaWNrZWQgZWRnZSDigJQgZXh0ZXJpb3Igb3IgYW4gaW50ZXJpb3IgcmluZy5cbiAgICAgIGNvbnN0IHNlbCA9IHRoaXMuc2VsZWN0ZWRSZWdpb25JbmZvKCk7XG4gICAgICBjb25zdCBlZGdlID0gc2VsID8gdGhpcy5oaXRFZGdlKGUucG9zaXRpb24sIHNlbC5yZWdpb24pIDogbnVsbDtcbiAgICAgIGlmIChzZWwgJiYgZWRnZSkge1xuICAgICAgICBpZiAoZWRnZS5yaW5nIDwgMCkgdGhpcy5zdG9yZS5hZGRWZXJ0ZXgoc2VsLnJlZ2lvbi5pZCwgZWRnZS5zZWdJbmRleCwgZWRnZS54LCBlZGdlLnkpO1xuICAgICAgICBlbHNlIHRoaXMuc3RvcmUuYWRkSG9sZVZlcnRleChzZWwucmVnaW9uLmlkLCBlZGdlLnJpbmcsIGVkZ2Uuc2VnSW5kZXgsIGVkZ2UueCwgZWRnZS55KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ2RlbGV0ZXBvaW50Jykge1xuICAgICAgLy8gUmVtb3ZlIHRoZSBjbGlja2VkIHZlcnRleCDigJQgZXh0ZXJpb3Igb3IgYW4gaW50ZXJpb3IgcmluZyAoaml0LXVpIzg1KS5cbiAgICAgIGNvbnN0IHNlbCA9IHRoaXMuc2VsZWN0ZWRSZWdpb25JbmZvKCk7XG4gICAgICBjb25zdCB2aCA9IHRoaXMuaGl0UG9seWdvbkhhbmRsZShlLnBvc2l0aW9uLCBmYWxzZSk7XG4gICAgICBpZiAoc2VsICYmIHZoKSB7XG4gICAgICAgIGlmICh2aC5yaW5nIDwgMCkgdGhpcy5zdG9yZS5kZWxldGVWZXJ0ZXgoc2VsLnJlZ2lvbi5pZCwgdmguaW5kZXgpO1xuICAgICAgICBlbHNlIHRoaXMuc3RvcmUuZGVsZXRlSG9sZVZlcnRleChzZWwucmVnaW9uLmlkLCB2aC5yaW5nLCB2aC5pbmRleCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsaWNrLXRvLXBsYWNlIHBvbHlnb24gKCdkcmF3cG9seWdvbicpOiB0aGUgZmlyc3QgY2xpY2sgc3RhcnRzIHRoZVxuICAgKiBwb2x5Z29uLCBlYWNoIHN1YnNlcXVlbnQgY2xpY2sgYWRkcyBhIHZlcnRleCwgYW5kIGNsaWNraW5nIG5lYXIgdGhlIGZpcnN0XG4gICAqIHZlcnRleCAod2l0aCBhdCBsZWFzdCAzIHBsYWNlZCkgY2xvc2VzIGFuZCBjb21taXRzIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBvbkRyYXdQb2x5Z29uQ2xpY2soZTogYW55KTogdm9pZCB7XG4gICAgY29uc3QgcHQgPSB0aGlzLnRvSW1hZ2UoZS5wb3NpdGlvbik7XG4gICAgaWYgKCF0aGlzLmRyYXdpbmdQb2x5Z29uKSB7XG4gICAgICB0aGlzLnBvbHlQb2ludHMgPSBbcHRdO1xuICAgICAgdGhpcy5kcmF3aW5nUG9seWdvbiA9IHRydWU7XG4gICAgICB0aGlzLnJlbmRlck92ZXJsYXkoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZmlyc3QgPSB0aGlzLnRvUHgodGhpcy5wb2x5UG9pbnRzWzBdLngsIHRoaXMucG9seVBvaW50c1swXS55KTtcbiAgICBjb25zdCBvbkZpcnN0ID0gTWF0aC5oeXBvdChlLnBvc2l0aW9uLnggLSBmaXJzdC54LCBlLnBvc2l0aW9uLnkgLSBmaXJzdC55KSA8PSBFRElUX1RPTF9QWDtcbiAgICBpZiAob25GaXJzdCAmJiB0aGlzLnBvbHlQb2ludHMubGVuZ3RoID49IDMpIHtcbiAgICAgIHRoaXMuY29tbWl0UG9seWdvbih0cnVlKTsgLy8gY2xvc2VzICsgcmVzZXRzIGluLXByb2dyZXNzIChpbmNsLiBkcmF3aW5nUG9seWdvbilcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wb2x5UG9pbnRzLnB1c2gocHQpO1xuICAgIHRoaXMucmVuZGVyT3ZlcmxheSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhvdmVyIGZlZWRiYWNrIGluIHNlbGVjdCBtb2RlOiBtb3ZlL3Jlc2l6ZSBjdXJzb3JzIG92ZXIgdGhlIHNlbGVjdGVkXG4gICAqIHJlZ2lvbidzIGJvZHkvZWRnZXMvY29ybmVycywgYSBwb2ludGVyIG92ZXIgYW55IG90aGVyIHJlZ2lvbi5cbiAgICovXG4gIHByaXZhdGUgb25Nb3ZlKGU6IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1vZGUgIT09ICdzZWxlY3QnKSByZXR1cm47XG4gICAgLy8gQSBncmFiYmFibGUgYmV6aWVyIGNvbnRyb2wgaGFuZGxlIG9yIHZlcnRleCBvZiB0aGUgc2VsZWN0ZWQgcG9seWdvbiB0YWtlc1xuICAgIC8vIHByaW9yaXR5LlxuICAgIGlmICh0aGlzLmhpdFBvbHlnb25IYW5kbGUoZS5wb3NpdGlvbikpIHtcbiAgICAgIHRoaXMudmlld2VyLmNhbnZhcy5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV6ID0gdGhpcy5lZGl0Wm9uZUF0KGUucG9zaXRpb24pO1xuICAgIGlmIChleikge1xuICAgICAgdGhpcy52aWV3ZXIuY2FudmFzLnN0eWxlLmN1cnNvciA9IFpPTkVfQ1VSU09SW2V6LnpvbmVdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwdCA9IHRoaXMudG9Xb3JsZChlLnBvc2l0aW9uKTtcbiAgICB0aGlzLnVwZGF0ZUN1cnNvcih0aGlzLnJlZ2lvbkluZGV4QXQocHQpID49IDAgfHwgISF0aGlzLnNvdXJjZUxheWVyPy5mZWF0dXJlQXQocHQueCwgcHQueSwgT1BFTl9QQVRIX1RPTF9QWCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtb3ZlL3Jlc2l6ZSB6b25lIHVuZGVyIHRoZSBjdXJzb3IgZm9yIHRoZSBjdXJyZW50bHktc2VsZWN0ZWQgcmVnaW9uXG4gICAqIChyZWN0YW5nbGVzIGdldCBlZGdlL2Nvcm5lciBoYW5kbGVzICsgYm9keTsgcG9seWdvbnMgZ2V0IGJvZHktbW92ZSBvbmx5KSxcbiAgICogb3IgbnVsbCBpZiB0aGUgY3Vyc29yIGlzbid0IG92ZXIgdGhlIHNlbGVjdGVkIHJlZ2lvbi5cbiAgICovXG4gIHByaXZhdGUgZWRpdFpvbmVBdChwb3NpdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9KTogeyB6b25lOiBFZGl0Wm9uZTsgaW5kZXg6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWQubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuc2VsZWN0ZWRbdGhpcy5zZWxlY3RlZC5sZW5ndGggLSAxXTtcbiAgICBjb25zdCByZWdpb24gPSB0aGlzLnN0b3JlLmdldFJlZ2lvbnMoKVtpbmRleF07XG4gICAgaWYgKCFyZWdpb24pIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGIgPSByZWdpb24uYm91bmRzO1xuICAgIGlmIChiIGluc3RhbmNlb2YgUmVjdGFuZ2xlKSB7XG4gICAgICBjb25zdCBhID0gdGhpcy50b1B4KGIueCwgYi55KTtcbiAgICAgIGNvbnN0IGMgPSB0aGlzLnRvUHgoYi54ICsgYi53aWR0aCwgYi55ICsgYi5oZWlnaHQpO1xuICAgICAgY29uc3Qgem9uZSA9IHJlY3Rab25lKHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHtcbiAgICAgICAgeDA6IE1hdGgubWluKGEueCwgYy54KSxcbiAgICAgICAgeTA6IE1hdGgubWluKGEueSwgYy55KSxcbiAgICAgICAgeDE6IE1hdGgubWF4KGEueCwgYy54KSxcbiAgICAgICAgeTE6IE1hdGgubWF4KGEueSwgYy55KSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHpvbmUgPyB7IHpvbmUsIGluZGV4IH0gOiBudWxsO1xuICAgIH1cbiAgICBpZiAoYiBpbnN0YW5jZW9mIFBvbHlnb24gfHwgYiBpbnN0YW5jZW9mIE11bHRpUG9seWdvbikge1xuICAgICAgLy8gUG9seWdvbnMgKyBtdWx0aS1wYXJ0IHJlZ2lvbnMgc3VwcG9ydCB3aG9sZS1yZWdpb24gbW92ZSAobm8gcmVzaXplIHpvbmVzKS5cbiAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5zUG9pbnQocmVnaW9uLCBwb3NpdGlvbikgPyB7IHpvbmU6ICdtb3ZlJywgaW5kZXggfSA6IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqIFRoZSBjdXJyZW50bHktc2VsZWN0ZWQgcmVnaW9uICh0aGUgbGFzdCBvbmUgc2VsZWN0ZWQpLCBvciBudWxsLiAqL1xuICBwcml2YXRlIHNlbGVjdGVkUmVnaW9uSW5mbygpOiB7IHJlZ2lvbjogUmVnaW9uOyBpbmRleDogbnVtYmVyIH0gfCBudWxsIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZC5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWxlY3RlZFt0aGlzLnNlbGVjdGVkLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IHJlZ2lvbiA9IHRoaXMuc3RvcmUuZ2V0UmVnaW9ucygpW2luZGV4XTtcbiAgICByZXR1cm4gcmVnaW9uID8geyByZWdpb24sIGluZGV4IH0gOiBudWxsO1xuICB9XG5cbiAgLyoqIFRoZSBiZXppZXIgY29udHJvbCBoYW5kbGUgKHdoZW4gYGJlemllcmApIG9yIHZlcnRleCBvZiB0aGUgc2VsZWN0ZWQgcG9seWdvblxuICAgKiAgdW5kZXIgdGhlIGN1cnNvciAoc2NyZWVuLXBpeGVsIHRvbGVyYW5jZSksIG9yIG51bGwuIFJlY3RhbmdsZXMgaGF2ZSBub1xuICAgKiAgZWRpdGFibGUgdmVydGljZXMgKHRoZWlyIGNvcm5lcnMgYXJlIHJlc2l6ZSB6b25lcywgc2VlIHtAbGluayByZWN0Wm9uZX0pLiAqL1xuICBwcml2YXRlIGhpdFBvbHlnb25IYW5kbGUoXG4gICAgcG9zaXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSxcbiAgICBiZXppZXIgPSB0cnVlLFxuICApOiB7IGtpbmQ6ICd2ZXJ0ZXgnIHwgJ2Jlemllcic7IHJpbmc6IG51bWJlcjsgaW5kZXg6IG51bWJlcjsgc2lkZTogJ2luJyB8ICdvdXQnIH0gfCBudWxsIHtcbiAgICBjb25zdCBzZWwgPSB0aGlzLnNlbGVjdGVkUmVnaW9uSW5mbygpO1xuICAgIGlmICghc2VsIHx8ICEoc2VsLnJlZ2lvbi5ib3VuZHMgaW5zdGFuY2VvZiBQb2x5Z29uKSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgaGl0ID0gaGl0SGFuZGxlKHNlbC5yZWdpb24sIHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHRoaXMudG9TY3JlZW4sIEVESVRfVE9MX1BYLCB7IGJlemllciB9KTtcbiAgICBpZiAoIWhpdCB8fCBoaXQua2luZCA9PT0gJ2Nvcm5lcicpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB7IGtpbmQ6IGhpdC5raW5kLCByaW5nOiBoaXQucmluZywgaW5kZXg6IGhpdC5pbmRleCwgc2lkZTogaGl0LmtpbmQgPT09ICdiZXppZXInID8gaGl0LnNpZGUgOiAnb3V0JyB9O1xuICB9XG5cbiAgLyoqIFRoZSBlZGdlIG9mIGByZWdpb25gJ3MgcG9seWdvbiBuZWFyZXN0IHRoZSBjdXJzb3IgKHdpdGhpbiB0b2xlcmFuY2UpLCB3aXRoXG4gICAqICB0aGUgY2xpY2tlZCBwb2ludCBpbiBpbWFnZSBjb29yZHMgYXMgdGhlIGluc2VydGlvbiBwb3NpdGlvbiwgb3IgbnVsbC4gKi9cbiAgcHJpdmF0ZSBoaXRFZGdlKFxuICAgIHBvc2l0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0sXG4gICAgcmVnaW9uOiBSZWdpb24sXG4gICk6IHsgcmluZzogbnVtYmVyOyBzZWdJbmRleDogbnVtYmVyOyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgY29uc3QgZWRnZSA9IG5lYXJlc3RFZGdlKHJlZ2lvbiwgcG9zaXRpb24ueCwgcG9zaXRpb24ueSwgdGhpcy50b1NjcmVlbik7XG4gICAgaWYgKCFlZGdlIHx8IGVkZ2UuZGlzdCA+IEVESVRfVE9MX1BYKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBpbWcgPSB0aGlzLnRvSW1hZ2UocG9zaXRpb24pO1xuICAgIHJldHVybiB7IHJpbmc6IGVkZ2UucmluZywgc2VnSW5kZXg6IGVkZ2Uuc2VnSW5kZXgsIHg6IGltZy54LCB5OiBpbWcueSB9O1xuICB9XG5cbiAgLyoqIFNuYXBzaG90IHRoZSBzZWxlY3RlZCByZWdpb24ncyBnZW9tZXRyeSBhdCB0aGUgc3RhcnQgb2YgYW4gZWRpdC4gKi9cbiAgcHJpdmF0ZSBzbmFwc2hvdChyZWdpb246IFJlZ2lvbik6IEVkaXRTbmFwc2hvdCB7XG4gICAgY29uc3QgYiA9IHJlZ2lvbi5ib3VuZHM7XG4gICAgaWYgKGIgaW5zdGFuY2VvZiBQb2x5Z29uIHx8IGIgaW5zdGFuY2VvZiBNdWx0aVBvbHlnb24pIHJldHVybiB7IGtpbmQ6ICdzaGFwZScsIGJvdW5kczogYiB9O1xuICAgIGlmIChiIGluc3RhbmNlb2YgUmVjdGFuZ2xlKSByZXR1cm4geyBraW5kOiAncmVjdCcsIHg6IGIueCwgeTogYi55LCB3OiBiLndpZHRoLCBoOiBiLmhlaWdodCB9O1xuICAgIHJldHVybiB7IGtpbmQ6ICdyZWN0JywgeDogMCwgeTogMCwgdzogMCwgaDogMCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IHRoZSBpbi1wcm9ncmVzcyBtb3ZlL3Jlc2l6ZSB0byB0aGUgcmVnaW9uLCBsaXZlLCB0aHJvdWdoIHRoZVxuICAgKiBSZWdpb24tbmF0aXZlIGVkaXQgQVBJLiBSZWNvbXB1dGVkIGFic29sdXRlbHkgZnJvbSB0aGUgZ2VzdHVyZS1zdGFydFxuICAgKiBzbmFwc2hvdCAoYG9yaWdgKSArIHRoZSB0b3RhbCBkZWx0YSwgc28gZWFjaCBmcmFtZSBpcyBpZGVtcG90ZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseUVkaXQoY3VySW1nOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZWRpdCkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuZWRpdC5raW5kID09PSAndmVydGV4Jykge1xuICAgICAgLy8gRHJhZyBhIHNpbmdsZSB2ZXJ0ZXggdG8gdGhlIGN1cnNvciAoYWJzb2x1dGUg4oCUIGlkZW1wb3RlbnQpLiBSb3V0ZSB0byB0aGVcbiAgICAgIC8vIGV4dGVyaW9yIG9yIHRoZSBtYXRjaGluZyBpbnRlcmlvciByaW5nIChob2xlKSDigJQgaml0LXVpIzg1LlxuICAgICAgaWYgKHRoaXMuZWRpdC5yaW5nIDwgMCkge1xuICAgICAgICB0aGlzLnN0b3JlLm1vdmVWZXJ0ZXgodGhpcy5lZGl0LmlkLCB0aGlzLmVkaXQudmVydGV4SW5kZXgsIGN1ckltZy54LCBjdXJJbWcueSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0b3JlLm1vdmVIb2xlVmVydGV4KHRoaXMuZWRpdC5pZCwgdGhpcy5lZGl0LnJpbmcsIHRoaXMuZWRpdC52ZXJ0ZXhJbmRleCwgY3VySW1nLngsIGN1ckltZy55KTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZWRpdC5raW5kID09PSAnaGFuZGxlJykge1xuICAgICAgLy8gRHJhZyBhIGJlemllciBjb250cm9sIGhhbmRsZSB0byB0aGUgY3Vyc29yIOKAlCBleHRlcmlvciAocmluZyAtMSkgb3IgYSBkb251dCBob2xlIHJpbmcuXG4gICAgICBpZiAodGhpcy5lZGl0LnJpbmcgPCAwKSB7XG4gICAgICAgIHRoaXMuc3RvcmUubW92ZUJlemllckhhbmRsZSh0aGlzLmVkaXQuaWQsIHRoaXMuZWRpdC52ZXJ0ZXhJbmRleCwgdGhpcy5lZGl0LmhhbmRsZVNpZGUsIGN1ckltZy54LCBjdXJJbWcueSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0b3JlLm1vdmVIb2xlQmV6aWVySGFuZGxlKFxuICAgICAgICAgIHRoaXMuZWRpdC5pZCxcbiAgICAgICAgICB0aGlzLmVkaXQucmluZyxcbiAgICAgICAgICB0aGlzLmVkaXQudmVydGV4SW5kZXgsXG4gICAgICAgICAgdGhpcy5lZGl0LmhhbmRsZVNpZGUsXG4gICAgICAgICAgY3VySW1nLngsXG4gICAgICAgICAgY3VySW1nLnksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLnJlZHJhdygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGR4ID0gY3VySW1nLnggLSB0aGlzLmVkaXQuc3RhcnRJbWcueDtcbiAgICBjb25zdCBkeSA9IGN1ckltZy55IC0gdGhpcy5lZGl0LnN0YXJ0SW1nLnk7XG5cbiAgICBjb25zdCBvID0gdGhpcy5lZGl0Lm9yaWc7XG4gICAgaWYgKCFvKSByZXR1cm47XG4gICAgaWYgKG8ua2luZCA9PT0gJ3JlY3QnKSB7XG4gICAgICBjb25zdCBib3ggPSByZXNpemVSZWN0KHsgeDogby54LCB5OiBvLnksIHdpZHRoOiBvLncsIGhlaWdodDogby5oIH0sIHRoaXMuZWRpdC56b25lLCBkeCwgZHkpO1xuICAgICAgdGhpcy5zdG9yZS51cGRhdGVCb3VuZHModGhpcy5lZGl0LmlkLCBPYmplY3QuYXNzaWduKG5ldyBSZWN0YW5nbGUoKSwgYm94KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFBvbHlnb24gLyBtdWx0aS1wYXJ0IHJlZ2lvbjogdHJhbnNsYXRlIGV2ZXJ5IHZlcnRleCwgaG9sZSBhbmQgcGFydCwgcm91bmRlZCB0b1xuICAgICAgLy8gd2hvbGUgcGl4ZWxzLiBCZXppZXIgaGFuZGxlIG9mZnNldHMgYXJlIHJlbGF0aXZlLCBzbyB0aGV5IGNhcnJ5IG92ZXIgdW5jaGFuZ2VkLlxuICAgICAgdGhpcy5zdG9yZS51cGRhdGVCb3VuZHModGhpcy5lZGl0LmlkLCB0cmFuc2xhdGVCb3VuZHMoby5ib3VuZHMsIGR4LCBkeSwgTWF0aC5yb3VuZCkpO1xuICAgIH1cbiAgICB0aGlzLnJlZHJhdygpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZWxlY3RBdChwdDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9LCBhZGRpdGl2ZSA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5yZWdpb25JbmRleEF0KHB0KTtcbiAgICAvLyBOb3Qgb24gYSByZWdpb246IGEgZmVhdHVyZSBvZiB0aGUgcmVnaW9uIHNvdXJjZSB0aGVyZSBpcyB0YWtlbiBpbnRvIHRoZSByZWdpb25zIGFuZFxuICAgIC8vIHNlbGVjdGVkICh0aGUgc291cmNlIGRyYXdzIGl0IHVudGlsIHRoZW4pLlxuICAgIGNvbnN0IGZlYXR1cmUgPSBpZHggPCAwID8gdGhpcy5zb3VyY2VMYXllcj8uZmVhdHVyZUF0KHB0LngsIHB0LnksIE9QRU5fUEFUSF9UT0xfUFgpIDogbnVsbDtcbiAgICBpZiAoZmVhdHVyZSAmJiB0aGlzLnN0b3JlLnNlbGVjdFNvdXJjZUZlYXR1cmVzKSB7XG4gICAgICB2b2lkIHRoaXMuc3RvcmUuc2VsZWN0U291cmNlRmVhdHVyZXMoW2ZlYXR1cmUuaWRdLCBhZGRpdGl2ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChhZGRpdGl2ZSkge1xuICAgICAgLy8gU2hpZnQtY2xpY2sgb24gZW1wdHkgc3BhY2Uga2VlcHMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLlxuICAgICAgaWYgKGlkeCA8IDApIHJldHVybjtcbiAgICAgIC8vIGB0aGlzLnNlbGVjdGVkYCBtaXJyb3JzIHRoZSBzdG9yZSdzIGN1cnJlbnQgc2VsZWN0aW9uIChrZXB0IGluIHN5bmMgdmlhXG4gICAgICAvLyB0aGUgc3Vic2NyaXB0aW9uKSwgc28gaXQncyB0aGUgc291cmNlIG9mIHRydXRoIHdpdGhvdXQgYSBzeW5jIGdldHRlci5cbiAgICAgIGNvbnN0IGN1ciA9IHRoaXMuc2VsZWN0ZWQuc2xpY2UoKTtcbiAgICAgIGNvbnN0IGF0ID0gY3VyLmluZGV4T2YoaWR4KTtcbiAgICAgIGlmIChhdCA+PSAwKVxuICAgICAgICBjdXIuc3BsaWNlKGF0LCAxKTsgLy8gdG9nZ2xlIG9mZlxuICAgICAgZWxzZSBjdXIucHVzaChpZHgpOyAvLyB0b2dnbGUgb25cbiAgICAgIHRoaXMuc3RvcmUuc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoY3VyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zdG9yZS5zZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyhpZHggPj0gMCA/IFtpZHhdIDogW10pO1xuICB9XG5cbiAgLyoqIFRha2UgdGhlIHJlZ2lvbi1zb3VyY2UgZmVhdHVyZXMgdGhlIGJhbmQgbWVldHMgaW50byB0aGUgcmVnaW9ucywgYWRkaW5nIHRoZW0gdG8gdGhlIHNlbGVjdGlvbi4gKi9cbiAgcHJpdmF0ZSBzZWxlY3RTb3VyY2VJbih4MDogbnVtYmVyLCB5MDogbnVtYmVyLCB4MTogbnVtYmVyLCB5MTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZmVhdHVyZXMgPSB0aGlzLnNvdXJjZUxheWVyPy5mZWF0dXJlc0luUmVjdCh4MCwgeTAsIHgxLCB5MSkgPz8gW107XG4gICAgaWYgKCFmZWF0dXJlcy5sZW5ndGggfHwgIXRoaXMuc3RvcmUuc2VsZWN0U291cmNlRmVhdHVyZXMpIHJldHVybjtcbiAgICBjb25zdCBpZHMgPSBmZWF0dXJlcy5zbGljZSgwLCBTT1VSQ0VfTUFSUVVFRV9MSU1JVCkubWFwKChmKSA9PiBmLmlkKTtcbiAgICB2b2lkIHRoaXMuc3RvcmUuc2VsZWN0U291cmNlRmVhdHVyZXMoaWRzLCB0cnVlKTtcbiAgfVxuXG4gIC8qKiBJbmRleCBvZiB0aGUgdG9wbW9zdCByZWdpb24gdW5kZXIgYW4gaW1hZ2UgcG9pbnQsIG9yIC0xLiAqL1xuICBwcml2YXRlIHJlZ2lvbkluZGV4QXQocHQ6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSk6IG51bWJlciB7XG4gICAgY29uc3Qgb3B0cyA9IHsgdG9TY3JlZW46IHRoaXMudG9TY3JlZW4sIHRvbFB4OiBPUEVOX1BBVEhfVE9MX1BYLCBza2lwOiAocjogUmVnaW9uKSA9PiB0aGlzLmhpZGRlbihyKSB9O1xuICAgIHJldHVybiB0b3Btb3N0UmVnaW9uQXQodGhpcy5zdG9yZS5nZXRSZWdpb25zKCksIHB0LngsIHB0LnksIG9wdHMpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgYSByZWdpb24ncyBjbGFzcyBpcyBoaWRkZW4gKG5vdCBkcmF3biwgbm90IHBpY2tlZCkuICovXG4gIHByaXZhdGUgaGlkZGVuKHJlZ2lvbjogUGljazxSZWdpb24sICdsYWJlbCc+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5zdG9yZS5pc0NsYXNzSGlkZGVuPy4ocmVnaW9uLmxhYmVsKTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZSBlbGVtZW50LXBpeGVsIGBwb3NpdGlvbmAgbGFuZHMgb24gYHJlZ2lvbmAgKHNlZSBgcmVnaW9uQ29udGFpbnNgKS4gKi9cbiAgcHJpdmF0ZSBjb250YWluc1BvaW50KHJlZ2lvbjogUmVnaW9uLCBwb3NpdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9KTogYm9vbGVhbiB7XG4gICAgY29uc3QgcHQgPSB0aGlzLnRvV29ybGQocG9zaXRpb24pO1xuICAgIHJldHVybiByZWdpb25Db250YWlucyhyZWdpb24sIHB0LngsIHB0LnksIHsgdG9TY3JlZW46IHRoaXMudG9TY3JlZW4sIHRvbFB4OiBPUEVOX1BBVEhfVE9MX1BYIH0pO1xuICB9XG5cbiAgLyoqIEFiYW5kb24gd2hhdGV2ZXIgcG9pbnRlciBnZXN0dXJlIGlzIGluIHByb2dyZXNzIChkcmF3aW5nLCBlZGl0IGRyYWcsXG4gICAqICBydWJiZXIgYmFuZCkgYW5kIGNsb3NlIGl0cyBzdG9yZSBiYXRjaC4gKi9cbiAgcHJpdmF0ZSBlbmRHZXN0dXJlKCk6IHZvaWQge1xuICAgIHRoaXMucmVzZXRJblByb2dyZXNzKCk7XG4gICAgdGhpcy5iYW5kU3RhcnQgPSB0aGlzLmJhbmRDdXJyZW50ID0gbnVsbDtcbiAgICB0aGlzLmJhbmREcmFnZ2VkID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0SW5Qcm9ncmVzcygpOiB2b2lkIHtcbiAgICB0aGlzLnJlY3RTdGFydCA9IHRoaXMucmVjdEN1cnJlbnQgPSBudWxsO1xuICAgIHRoaXMucG9seVBvaW50cyA9IFtdO1xuICAgIHRoaXMuZnJlZWhhbmREcmFnZ2luZyA9IGZhbHNlO1xuICAgIHRoaXMuZHJhd2luZ1BvbHlnb24gPSBmYWxzZTtcbiAgICB0aGlzLmxhc3RGcmVlaGFuZFB4ID0gbnVsbDtcbiAgICAvLyBDbG9zZSBhbnkgb3BlbiBlZGl0IGJhdGNoIChlLmcuIGEgbW9kZSBzd2l0Y2ggbWlkLWRyYWcpIHNvIHRoZSBzdG9yZSdzXG4gICAgLy8gZW1pdCBjb2FsZXNjaW5nIGRvZXNuJ3QgZ2V0IHN0dWNrLlxuICAgIGlmICh0aGlzLmVkaXQpIHtcbiAgICAgIHRoaXMuc3RvcmUuZW5kQmF0Y2goKTtcbiAgICAgIHRoaXMuZWRpdCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIGNvbW1pdCB0byB0aGUgc3RvcmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHByaXZhdGUgY29tbWl0UmVjdGFuZ2xlKHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIsIGg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHJlZ2lvbiA9IG5ldyBSZWdpb24oKTtcbiAgICBjb25zdCByZWN0ID0gbmV3IFJlY3RhbmdsZSgpO1xuICAgIHJlY3QueCA9IHg7XG4gICAgcmVjdC55ID0geTtcbiAgICByZWN0LndpZHRoID0gdztcbiAgICByZWN0LmhlaWdodCA9IGg7XG4gICAgcmVnaW9uLmJvdW5kcyA9IHJlY3Q7XG4gICAgcmVnaW9uLmNvbG9yID0gdGhpcy5zdG9yZS5nZXRTaGFwZUNvbG9yKCk7XG4gICAgdGhpcy5jb21taXRSZWdpb24ocmVnaW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgY29tbWl0UG9seWdvbihjbG9zZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wb2x5UG9pbnRzLmxlbmd0aCA8IChjbG9zZWQgPyAzIDogMikpIHtcbiAgICAgIHRoaXMucmVzZXRJblByb2dyZXNzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlZ2lvbiA9IG5ldyBSZWdpb24oKTtcbiAgICByZWdpb24uYm91bmRzID0gbWFrZVBvbHlnb24oXG4gICAgICB0aGlzLnBvbHlQb2ludHMubWFwKChwKSA9PiBwLngpLFxuICAgICAgdGhpcy5wb2x5UG9pbnRzLm1hcCgocCkgPT4gcC55KSxcbiAgICAgIHsgY2xvc2VkIH0sXG4gICAgKTtcbiAgICByZWdpb24uY29sb3IgPSB0aGlzLnN0b3JlLmdldFNoYXBlQ29sb3IoKTtcbiAgICB0aGlzLnJlc2V0SW5Qcm9ncmVzcygpO1xuICAgIHRoaXMuY29tbWl0UmVnaW9uKHJlZ2lvbik7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgZnJlc2hseS1kcmF3biByZWdpb24gdG8gdGhlIHNoYXJlZCBzdG9yZSBhbmQgcmVkcmF3IGltbWVkaWF0ZWx5LiBUaGVcbiAgICogc3RvcmUgbWludHMgdGhlIGlkLCBzZWxlY3RzIHRoZSBuZXcgcmVnaW9uIChzbyBpdCByZW5kZXJzIHNvbGlkL2hpZ2hsaWdodGVkXG4gICAqIHJhdGhlciB0aGFuIGFzIGEgZGFzaGVkIGluLXByb2dyZXNzIHNoYXBlKSBhbmQgZW1pdHMgdGhlIGZ1bGwgcmVnaW9uIGxpc3QgdG9cbiAgICogdGhlIFJlZ2lvbiBFZGl0b3Ig4oCUIHdlIHN0aWxsIHJlZHJhdyBsb2NhbGx5IHJhdGhlciB0aGFuIHJlbHlpbmcgc29sZWx5IG9uXG4gICAqIHRoZSBzdG9yZSdzIHVwZGF0ZSBldmVudCwgd2hpY2ggY2FuIGJlIHN3YWxsb3dlZCB3aGVuIFBsb3RseSBpc24ndCBhY3RpdmUuXG4gICAqL1xuICBwcml2YXRlIGNvbW1pdFJlZ2lvbihyZWdpb246IFJlZ2lvbik6IHZvaWQge1xuICAgIC8vIERlZmF1bHQgY2xhc3MvYW5ub3RhdGlvbiBuYW1lLCBtYXRjaGluZyB0aGUgUGxvdGx5IGJhY2tlbmQgYW5kIHRoZSBSZWdpb25cbiAgICAvLyBFZGl0b3IncyBcIkFkZFwiIGFjdGlvbnMgc28gYSBmcmVzaGx5IGRyYXduIHJlZ2lvbiBpc24ndCB1bmxhYmVsZWQuXG4gICAgaWYgKHJlZ2lvbi5sYWJlbCA9PSBudWxsKSByZWdpb24ubGFiZWwgPSAnUmVnaW9uJztcbiAgICB0aGlzLnN0b3JlLmFkZFJlZ2lvbihyZWdpb24pO1xuICAgIHRoaXMucmVkcmF3KCk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCB0aGUgc2VsZWN0ZWQgcmVnaW9uKHMpIHRvL2Zyb20gYSBiZXppZXIgY3VydmUgKHRvQmV6aWVyID0gdHJ1ZSAvXG4gICAqIHRvUG9seWdvbiA9IGZhbHNlKS4gT25lLXNob3Q7IHRoZSBhbmNob3JzIGFyZSB1bmNoYW5nZWQsXG4gICAqIG9ubHkgdGhlIHNtb290aC1jdXJ2ZSByZW5kZXJpbmcgaXMgdG9nZ2xlZC5cbiAgICovXG4gIHNldFNlbGVjdGVkQmV6aWVyKGJlemllcjogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IHJlZ2lvbnMgPSB0aGlzLnN0b3JlLmdldFJlZ2lvbnMoKTtcbiAgICBmb3IgKGNvbnN0IGlkeCBvZiB0aGlzLnNlbGVjdGVkKSB7XG4gICAgICBjb25zdCByZWdpb24gPSByZWdpb25zW2lkeF07XG4gICAgICBpZiAocmVnaW9uKSB0aGlzLnN0b3JlLnNldEJlemllcihyZWdpb24uaWQsIGJlemllcik7XG4gICAgfVxuICAgIHRoaXMucmVkcmF3KCk7XG4gIH1cbn1cbiJdfQ==
|
|
733
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3NkLXJlZ2lvbi1vdmVybGF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9pbXBsZW1lbnRhdGlvbnMvb3NkL29zZC1yZWdpb24tb3ZlcmxheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFcEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBSS9FLE9BQU8sRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTlELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzNELE9BQU8sRUFDTCxnQkFBZ0IsRUFFaEIsU0FBUyxFQUNULFdBQVcsRUFDWCxjQUFjLEVBQ2QsYUFBYSxFQUNiLGVBQWUsR0FDaEIsTUFBTSxzQ0FBc0MsQ0FBQztBQUM5QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNuRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNuRyxPQUFPLEVBQ0wsYUFBYSxFQUNiLGFBQWEsRUFDYixlQUFlLEVBQ2YsaUJBQWlCLEVBQ2pCLG9CQUFvQixFQUNwQixnQkFBZ0IsRUFDaEIsWUFBWSxHQUNiLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLFdBQVcsRUFBWSxXQUFXLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBYWhILE1B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QUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDNUIsSUFBSSxNQUFNO2dCQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdEQsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNoQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSAqIGFzIE9wZW5TZWFkcmFnb24gZnJvbSAnb3BlbnNlYWRyYWdvbic7XG5pbXBvcnQgeyBPU0QgfSBmcm9tICcuL29zZC1saWInO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFJlZ2lvbiwgUmVjdGFuZ2xlLCBQb2x5Z29uLCBNdWx0aVBvbHlnb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvcmVnaW9uJztcbmltcG9ydCB7IElSZWdpb25TdG9yZSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy92aXN1YWxpemVyLmNvbnRyYWN0JztcbmltcG9ydCB7IElSZWdpb25FZGl0QXBpLCBJUmVnaW9uU291cmNlQXBpIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3JlZ2lvbi1zdG9yZS5jb250cmFjdCc7XG5pbXBvcnQgeyBJUmVnaW9uT3ZlcmxheSwgUmVnaW9uVG9vbE1vZGUgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvcmVnaW9uLW92ZXJsYXkuY29udHJhY3QnO1xuaW1wb3J0IHsgZWxlbWVudFRvSW1hZ2UsIGltYWdlVG9FbGVtZW50IH0gZnJvbSAnLi9vc2QtY29vcmRzJztcbmltcG9ydCB7IE9zZFZpZXdlckxpa2UgfSBmcm9tICcuL29zZC12aWV3ZXItbGlrZSc7XG5pbXBvcnQgeyBPU0RfWk9PTV9QRVJfU0NST0xMIH0gZnJvbSAnLi9vc2Qtem9vbSc7XG5pbXBvcnQgeyB0cmFuc2xhdGVCb3VuZHMgfSBmcm9tICcuLi8uLi9tb2RlbHMvcG9seWdvbi1lZGl0JztcbmltcG9ydCB7IG1ha2VQb2x5Z29uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3BvbHlnb24tZmFjdG9yeSc7XG5pbXBvcnQge1xuICBPUEVOX1BBVEhfVE9MX1BYLFxuICBUb1NjcmVlbixcbiAgaGl0SGFuZGxlLFxuICBuZWFyZXN0RWRnZSxcbiAgcmVnaW9uQ29udGFpbnMsXG4gIHJlZ2lvbnNJblJlY3QsXG4gIHRvcG1vc3RSZWdpb25BdCxcbn0gZnJvbSAnLi4vLi4vcmVnaW9uLW92ZXJsYXkvcmVnaW9uLWdlb21ldHJ5JztcbmltcG9ydCB7IFN2Z1JlZ2lvblJlbmRlcmVyLCBhZmZpbmVGcm9tUHJvamVjdGlvbiB9IGZyb20gJy4uLy4uL3JlZ2lvbi1vdmVybGF5L3N2Zy1yZWdpb24tcmVuZGVyZXInO1xuaW1wb3J0IHsgUmVnaW9uU291cmNlTGF5ZXIsIFNPVVJDRV9NQVJRVUVFX0xJTUlUIH0gZnJvbSAnLi4vLi4vcmVnaW9uLW92ZXJsYXkvcmVnaW9uLXNvdXJjZS1sYXllcic7XG5pbXBvcnQge1xuICBkcmF3RHJhZnRQYXRoLFxuICBkcmF3RHJhZnRSZWN0LFxuICBkcmF3UmVnaW9uTGFiZWwsXG4gIGRyYXdTZWxlY3Rpb25CYW5kLFxuICBkcmF3U2VsZWN0aW9uSGFuZGxlcyxcbiAgc3R5bGVSZWdpb25TaGFwZSxcbiAgdmVydGV4TWFya2VyLFxufSBmcm9tICcuL29zZC1yZWdpb24tb3ZlcmxheS1kcmF3JztcbmltcG9ydCB7IEVESVRfVE9MX1BYLCBFZGl0Wm9uZSwgWk9ORV9DVVJTT1IsIHJlY3Rab25lLCByZXNpemVSZWN0IH0gZnJvbSAnLi4vLi4vcmVnaW9uLW92ZXJsYXkvcmVnaW9uLWhpdC10ZXN0JztcblxuLyoqXG4gKiBUaGUgc2hhcmVkIHJlZ2lvbiBzdG9yZSBhcyB0aGUgb3ZlcmxheSBuZWVkcyBpdDogdGhlIGNyb3NzLWJhY2tlbmRcbiAqIHtAbGluayBJUmVnaW9uU3RvcmV9IChyZWFkIHJlZ2lvbnMsIHNlbGVjdGlvbiwgY29sb3VycykgcGx1cyB0aGUgUmVnaW9uLW5hdGl2ZVxuICoge0BsaW5rIElSZWdpb25FZGl0QXBpfSAoYWRkL21vdmUvcmVzaXplL3ZlcnRleCBlZGl0cykuIFRoZSBzaGFyZWQgUmVnaW9uU3RvcmVcbiAqIHNhdGlzZmllcyBib3RoLiBUaGUgb3ZlcmxheSBlZGl0cyB0aHJvdWdoIHRoZXNlIHR5cGVkIG9wZXJhdGlvbnMgb24gdGhlXG4gKiBuZXV0cmFsIFJlZ2lvbiBtb2RlbCDigJQgaXQgbmV2ZXIgdG91Y2hlcyBhIGJhY2tlbmQncyBvd24gc2hhcGUgcmVwcmVzZW50YXRpb25cbiAqIChlLmcuIFBsb3RseSdzIGB4MC95MC94MS95MWAgLyBgTeKApkzigKZaYCBkaWN0cykuIFdpdGgge0BsaW5rIElSZWdpb25Tb3VyY2VBcGl9XG4gKiAob3B0aW9uYWwpIGl0IGFsc28gZHJhd3MgYW5kIHBpY2tzIHRoZSBpbWFnZSdzIHJlZ2lvbiBzb3VyY2UuXG4gKi9cbmV4cG9ydCB0eXBlIFJlZ2lvbkVkaXRTdG9yZSA9IElSZWdpb25TdG9yZSAmIElSZWdpb25FZGl0QXBpICYgUGFydGlhbDxJUmVnaW9uU291cmNlQXBpPjtcblxuY29uc3QgU1ZHTlMgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnO1xuXG4vKiogQSByZWdpb24ncyBnZW9tZXRyeSBhdCB0aGUgc3RhcnQgb2YgYSBtb3ZlL3Jlc2l6ZSAoc2VlIGBzbmFwc2hvdGApOiBhIHJlY3RhbmdsZSdzXG4gKiAgYm94IGZvciBhIHJlc2l6ZSwgb3IgdGhlIHBvbHlnb24vbXVsdGktcG9seWdvbiBib3VuZHMgdGhlbXNlbHZlcyBmb3IgYSBtb3ZlIOKAlCB0aGVcbiAqICBzdG9yZSBpcyBjb3B5LW9uLXdyaXRlLCBzbyB0aGUgZ2VzdHVyZS1zdGFydCBpbnN0YW5jZSBuZXZlciBjaGFuZ2VzIHVuZGVyIHRoZSBkcmFnLiAqL1xudHlwZSBFZGl0U25hcHNob3QgPVxuICB7IGtpbmQ6ICdyZWN0JzsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0gfCB7IGtpbmQ6ICdzaGFwZSc7IGJvdW5kczogUG9seWdvbiB8IE11bHRpUG9seWdvbiB9O1xuXG4vKipcbiAqIE9wZW5TZWFkcmFnb24gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElSZWdpb25PdmVybGF5fS5cbiAqXG4gKiAtIFJlbmRlcnMgdGhlIHN0b3JlJ3MgcmVnaW9ucyAocmVjdC9wb2x5Z29uKSBpbiBpbWFnZS1waXhlbCBzcGFjZSwga2VwdFxuICogICBhbGlnbmVkIG9uIGV2ZXJ5IHBhbi96b29tIHZpYSB0aGUgT1NEIHZpZXdwb3J0IEFQSS5cbiAqIC0gRHJhd3MgbmV3IHJlY3RhbmdsZSBhbmQgcG9seWdvbiByZWdpb25zIChjb21taXR0ZWQgdG8gdGhlIHNoYXJlZCBzdG9yZSkuXG4gKiAtIENsaWNrLXRvLXNlbGVjdCBpbiAnc2VsZWN0JyBtb2RlLlxuICpcbiAqIFJlYWRzL3dyaXRlcyB0aGUgc2hhcmVkIHtAbGluayBJUmVnaW9uU3RvcmV9LCBzbyByZWdpb25zIHN0YXkgaW4gc3luYyB3aXRoIHRoZVxuICogUmVnaW9uIEVkaXRvciBhbmQgdGhlIFBsb3RseSBiYWNrZW5kLiBUaGUgd2FuZCwgdmVydGV4LWVyYXNlciBhbmQgem9vbS10by1ib3hcbiAqIHRvb2xzIGFyZSBOT1QgaGFuZGxlZCBoZXJlIOKAlCB0aGV5J3JlIG93bmVkIGJ5IE9wZW5TZWFkcmFnb25WaXN1YWxpemVyU2VydmljZVxuICogKHdoaWNoIGJpbmRzIHRoZW0gdG8gT1NEIHZpYSB0aGUgc2hhcmVkIGNvb3JkaW5hdGUgdHJhbnNmb3JtICsgdmlld3BvcnQgcGl4ZWxcbiAqIHJlYWRiYWNrKSwgdGhlIHNhbWUgc2luZ2xldG9uIHRvb2wgc2VydmljZXMgdGhlIFBsb3RseSBiYWNrZW5kIHVzZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBPc2RSZWdpb25PdmVybGF5IGltcGxlbWVudHMgSVJlZ2lvbk92ZXJsYXkge1xuICBwcml2YXRlIHJlYWRvbmx5IHN2ZzogU1ZHU1ZHRWxlbWVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBzdWJzID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcml2YXRlIHNlbGVjdGVkOiBudW1iZXJbXSA9IFtdO1xuICBwcml2YXRlIG1vZGU6IFJlZ2lvblRvb2xNb2RlID0gJ25vbmUnO1xuXG4gIHByaXZhdGUgdHJhY2tlcjogT3BlblNlYWRyYWdvbi5Nb3VzZVRyYWNrZXI7XG4gIHByaXZhdGUgcmVjdFN0YXJ0OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gfCBudWxsID0gbnVsbDsgLy8gaW1hZ2UgY29vcmRzXG4gIHByaXZhdGUgcmVjdEN1cnJlbnQ6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHBvbHlQb2ludHM6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfVtdID0gW107IC8vIGltYWdlIGNvb3Jkc1xuICAvKiogVHJ1ZSB3aGlsZSBkcmFnZ2luZyBhIGZyZWVoYW5kIHBhdGggKGZyZWVmb3JtIC8gcG9seWxpbmUpLiAqL1xuICBwcml2YXRlIGZyZWVoYW5kRHJhZ2dpbmcgPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hpbGUgcGxhY2luZyBhIGNsaWNrLXRvLWFkZCBwb2x5Z29uICgnZHJhd3BvbHlnb24nIG1vZGUpLiAqL1xuICBwcml2YXRlIGRyYXdpbmdQb2x5Z29uID0gZmFsc2U7XG4gIC8qKiBMYXN0IGVsZW1lbnQtcGl4ZWwgcG9pbnQgYXBwZW5kZWQsIHRvIHRoaW4gdGhlIGZyZWVoYW5kIHBhdGguICovXG4gIHByaXZhdGUgbGFzdEZyZWVoYW5kUHg6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICAvKipcbiAgICogSW4tcHJvZ3Jlc3MgZWRpdCBvZiB0aGUgc2VsZWN0ZWQgcmVnaW9uOlxuICAgKiAgLSBraW5kICdib3VuZHMnIOKAlCByZWN0YW5nbGUgcmVzaXplL21vdmUgb3Igd2hvbGUtcmVnaW9uIG1vdmUgKHVzZXMgYHpvbmVgKTtcbiAgICogIC0ga2luZCAndmVydGV4JyDigJQgZHJhZ2dpbmcgYSBzaW5nbGUgcG9seWdvbiB2ZXJ0ZXggKHVzZXMgYHZlcnRleEluZGV4YCkuXG4gICAqL1xuICBwcml2YXRlIGVkaXQ6IHtcbiAgICBraW5kOiAnYm91bmRzJyB8ICd2ZXJ0ZXgnIHwgJ2hhbmRsZSc7XG4gICAgem9uZTogRWRpdFpvbmU7XG4gICAgdmVydGV4SW5kZXg6IG51bWJlcjtcbiAgICAvKiogV2hpY2ggcmluZyB0aGUgZHJhZ2dlZCB2ZXJ0ZXggYmVsb25ncyB0bzogLTEgPSBleHRlcmlvciwgZWxzZSBhIGhvbGVcbiAgICAgKiAgaW5kZXggaW50byBgUG9seWdvbi5ob2xlc2AgKGppdC11aSM4NSkuICovXG4gICAgcmluZzogbnVtYmVyO1xuICAgIGhhbmRsZVNpZGU6ICdpbicgfCAnb3V0JztcbiAgICBpZDogbnVtYmVyO1xuICAgIHN0YXJ0SW1nOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH07XG4gICAgLyoqIEdlc3R1cmUtc3RhcnQgZ2VvbWV0cnk7IHNldCBmb3IgJ2JvdW5kcycgZWRpdHMgb25seS4gKi9cbiAgICBvcmlnOiBFZGl0U25hcHNob3QgfCBudWxsO1xuICB9IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZWRpdERyYWdnZWQgPSBmYWxzZTtcbiAgLyoqIFJ1YmJlci1iYW5kIChtYXJxdWVlKSBtdWx0aS1zZWxlY3QgaW4gJ3NlbGVjdCcgbW9kZTogcHJlc3Mgb24gZW1wdHkgc3BhY2VcbiAgICogIGFuZCBkcmFnIHRvIHNlbGVjdCBldmVyeSByZWdpb24gdGhlIGJhbmQgaW50ZXJzZWN0cy4gSW1hZ2UgY29vcmRzLiAqL1xuICBwcml2YXRlIGJhbmRTdGFydDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYmFuZEN1cnJlbnQ6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGJhbmREcmFnZ2VkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZWFkb25seSByZWRyYXdIYW5kbGVyID0gKCkgPT4gdGhpcy5yZWRyYXcoKTtcbiAgLyoqIEEgY2FtZXJhIG1vdmUgKCd1cGRhdGUtdmlld3BvcnQnLCByYWlzZWQgb24gZXZlcnkgcmVkcmF3biBmcmFtZSwgYW5pbWF0ZWQgb25lc1xuICAgKiAgaW5jbHVkZWQ7ICdyZXNpemUnOyAncm90YXRlJykuIFRoZSByZWdpb25zIGFyZSBkcmF3biBpbiBpbWFnZSBjb29yZGluYXRlcywgc29cbiAgICogIG9ubHkgdGhlIHJlbmRlcmVyJ3MgdHJhbnNmb3JtIGFuZCBpdHMgZmV3IHNjcmVlbi1zcGFjZSBlbGVtZW50cyBmb2xsb3c7IG5vdGhpbmdcbiAgICogIGlzIHJlYnVpbHQgKE9TRC1QTE9UTFktMTEpLiBBIHRpbGUtb25seSBmcmFtZSAobG9hZGluZywgcmVjb2xvcikgbGVhdmVzIHRoZVxuICAgKiAgcHJvamVjdGlvbiwgYW5kIHNvIHRoZSBET00sIHVudG91Y2hlZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjYW1lcmFIYW5kbGVyID0gKCkgPT4gdGhpcy51cGRhdGVDYW1lcmEoKTtcbiAgcHJpdmF0ZSByZWFkb25seSByZW5kZXJlcjogU3ZnUmVnaW9uUmVuZGVyZXI7XG4gIC8qKiBUaGUgaW1hZ2UncyByZWdpb24gc291cmNlLCBkcmF3biB1bmRlciB0aGUgcmVnaW9ucyBhdCB0aGUgem9vbSdzIGxldmVsIG9mIGRldGFpbC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzb3VyY2VMYXllcjogUmVnaW9uU291cmNlTGF5ZXIgfCBudWxsO1xuICAvKiogT1NEJ3MgTW91c2VUcmFja2VyIGRyb3BzIGEgY2FuY2VsbGVkIHBvaW50ZXIgKHRvdWNoIGludGVycnVwdGVkLCBwb2ludGVyXG4gICAqICBjYXB0dXJlIGxvc3QgdG8gdGhlIGJyb3dzZXIpIHdpdGhvdXQgY2FsbGluZyByZWxlYXNlSGFuZGxlciwgc28gdGhlXG4gICAqICBnZXN0dXJlIGlzIGVuZGVkIGhlcmUgaW5zdGVhZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwb2ludGVyQ2FuY2VsSGFuZGxlciA9ICgpID0+IHtcbiAgICB0aGlzLmVuZEdlc3R1cmUoKTtcbiAgICB0aGlzLnJlZHJhdygpO1xuICB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdmlld2VyOiBPc2RWaWV3ZXJMaWtlLFxuICAgIHByaXZhdGUgc3RvcmU6IFJlZ2lvbkVkaXRTdG9yZSxcbiAgKSB7XG4gICAgdGhpcy5zdmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHTlMsICdzdmcnKSBhcyBTVkdTVkdFbGVtZW50O1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5zdmcuc3R5bGUsIHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgbGVmdDogJzAnLFxuICAgICAgdG9wOiAnMCcsXG4gICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsIC8vIE9TRCBoYW5kbGVzIG5hdmlnYXRpb24gdW5sZXNzIHdlJ3JlIGRyYXdpbmdcbiAgICB9KTtcbiAgICB0aGlzLnZpZXdlci5jYW52YXMuYXBwZW5kQ2hpbGQodGhpcy5zdmcpO1xuICAgIHRoaXMucmVuZGVyZXIgPSBuZXcgU3ZnUmVnaW9uUmVuZGVyZXIodGhpcy5zdmcsIHtcbiAgICAgIHJlY3RFbGVtZW50OiAncG9seWdvbicsXG4gICAgICBzdHlsZVNoYXBlOiAoZWwsIHJlZ2lvbiwgc2VsZWN0ZWQpID0+XG4gICAgICAgIHN0eWxlUmVnaW9uU2hhcGUoZWwsIHJlZ2lvbiwgc2VsZWN0ZWQsIHRoaXMuc3RvcmUuZ2V0U2hhcGVDb2xvcigpLCB0aGlzLnN0b3JlLmdldFJlZ2lvblN0eWxlPy4oKSksXG4gICAgICAvLyBUaGUgY2xhc3MgbGFiZWwsIHdoZW4gdGhlIFJlZ2lvbiBFZGl0b3IncyBcInNob3cgbGFiZWxzXCIgaXMgb24uXG4gICAgICBkZWNvcmF0ZTogKHJlZ2lvbiwgX2ksIF9zZWxlY3RlZCwgbGF5ZXIpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuc3RvcmUuZ2V0U2hvd1NoYXBlTGFiZWwoKSAmJiAhdGhpcy5zdG9yZS5pc0xhYmVsQ292ZXJlZD8uKHJlZ2lvbi5sYWJlbCkpIHtcbiAgICAgICAgICBkcmF3UmVnaW9uTGFiZWwobGF5ZXIsIHJlZ2lvbiwgdGhpcy5zdG9yZS5nZXRTaGFwZUNvbG9yKCksIHRoaXMuc3RvcmUuZ2V0UmVnaW9uU3R5bGU/LigpKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNraXA6IChyZWdpb24pID0+IHRoaXMuaGlkZGVuKHJlZ2lvbiksXG4gICAgfSk7XG4gICAgdGhpcy5zb3VyY2VMYXllciA9IHRoaXMuc3RvcmUuZ2V0UmVnaW9uU291cmNlVmlldyRcbiAgICAgID8gbmV3IFJlZ2lvblNvdXJjZUxheWVyKFxuICAgICAgICAgIHRoaXMuc3ZnLFxuICAgICAgICAgIHRoaXMuc3RvcmUuZ2V0RHJhd25SZWdpb25Tb3VyY2VWaWV3JD8uKCkgPz8gdGhpcy5zdG9yZS5nZXRSZWdpb25Tb3VyY2VWaWV3JCgpLFxuICAgICAgICApXG4gICAgICA6IG51bGw7XG4gICAgdGhpcy52aWV3ZXIuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLCB0aGlzLnBvaW50ZXJDYW5jZWxIYW5kbGVyKTtcblxuICAgIC8vICd1cGRhdGUtdmlld3BvcnQnIGZpcmVzIG9uIGV2ZXJ5IHJlZHJhd24gZnJhbWUsIGFuaW1hdGVkIG9uZXMgaW5jbHVkZWQg4oCUXG4gICAgLy8gYWxzbyBsaXN0ZW5pbmcgdG8gJ2FuaW1hdGlvbicgcmVidWlsdCB0aGUgd2hvbGUgU1ZHIHR3aWNlIHBlciBmcmFtZS5cbiAgICB0aGlzLnZpZXdlci5hZGRIYW5kbGVyKCd1cGRhdGUtdmlld3BvcnQnLCB0aGlzLmNhbWVyYUhhbmRsZXIpO1xuICAgIHRoaXMudmlld2VyLmFkZEhhbmRsZXIoJ3Jlc2l6ZScsIHRoaXMuY2FtZXJhSGFuZGxlcik7XG4gICAgdGhpcy52aWV3ZXIuYWRkSGFuZGxlcigncm90YXRlJywgdGhpcy5jYW1lcmFIYW5kbGVyKTtcbiAgICAvLyBLZWVwIHdoZWVsLXpvb20gYWxpdmUgd2hpbGUgYSB0b29sIGhhcyBtb3VzZS1uYXYgZGlzYWJsZWQgKHNlZSBoYW5kbGVyKS5cbiAgICB0aGlzLnZpZXdlci5lbGVtZW50Py5hZGRFdmVudExpc3RlbmVyKCd3aGVlbCcsIHRoaXMud2hlZWxab29tSGFuZGxlciwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcblxuICAgIHRoaXMudHJhY2tlciA9IG5ldyBPU0QuTW91c2VUcmFja2VyKHtcbiAgICAgIGVsZW1lbnQ6IHRoaXMudmlld2VyLmNhbnZhcyxcbiAgICAgIHByZXNzSGFuZGxlcjogKGU6IGFueSkgPT4gdGhpcy5vblByZXNzKGUpLFxuICAgICAgZHJhZ0hhbmRsZXI6IChlOiBhbnkpID0+IHRoaXMub25EcmFnKGUpLFxuICAgICAgcmVsZWFzZUhhbmRsZXI6IChlOiBhbnkpID0+IHRoaXMub25SZWxlYXNlKGUpLFxuICAgICAgY2xpY2tIYW5kbGVyOiAoZTogYW55KSA9PiB0aGlzLm9uQ2xpY2soZSksXG4gICAgICBtb3ZlSGFuZGxlcjogKGU6IGFueSkgPT4gdGhpcy5vbk1vdmUoZSksXG4gICAgfSk7XG4gICAgdGhpcy50cmFja2VyLnNldFRyYWNraW5nKGZhbHNlKTtcblxuICAgIHRoaXMuc3Vicy5hZGQodGhpcy5zdG9yZS5nZXRSZWdpb25VcGRhdGVFdmVudCgpLnN1YnNjcmliZSh0aGlzLnJlZHJhd0hhbmRsZXIpKTtcbiAgICB0aGlzLnN1YnMuYWRkKFxuICAgICAgdGhpcy5zdG9yZS5nZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyQoKS5zdWJzY3JpYmUoKGlkeCkgPT4ge1xuICAgICAgICB0aGlzLnNlbGVjdGVkID0gaWR4IHx8IFtdO1xuICAgICAgICB0aGlzLnJlZHJhdygpO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIHRoaXMucmVkcmF3KCk7XG4gIH1cblxuICAvKiogU3dpdGNoIGRyYXdpbmcvc2VsZWN0aW9uIG1vZGU7IHRvZ2dsZXMgT1NEIG5hdmlnYXRpb24gYWNjb3JkaW5nbHkuICovXG4gIHNldE1vZGUobW9kZTogUmVnaW9uVG9vbE1vZGUpOiB2b2lkIHtcbiAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICAgIHRoaXMucmVzZXRJblByb2dyZXNzKCk7XG4gICAgLy8gQW55IGFjdGl2ZSByZWdpb24gdG9vbCB0YWtlcyBvdmVyIHRoZSBwb2ludGVyIOKAlCBPU0QgcGFuL3pvb20gaXMgZGlzYWJsZWRcbiAgICAvLyBzbyBkcmFnZ2luZyBkcmF3cyAoYW5kIGNsaWNrcyBzZWxlY3QpIGluc3RlYWQgb2YgcGFubmluZy4gV2l0aCBubyB0b29sLFxuICAgIC8vIE9TRCBuYXZpZ2F0ZXMgbm9ybWFsbHkuXG4gICAgdGhpcy52aWV3ZXIuc2V0TW91c2VOYXZFbmFibGVkKG1vZGUgPT09ICdub25lJyk7XG4gICAgdGhpcy50cmFja2VyLnNldFRyYWNraW5nKG1vZGUgIT09ICdub25lJyk7XG4gICAgdGhpcy51cGRhdGVDdXJzb3IoZmFsc2UpO1xuICAgIHRoaXMucmVuZGVyT3ZlcmxheSgpO1xuICB9XG5cbiAgLyoqIERyaXZlIE9TRCB6b29tIGZyb20gdGhlIHdoZWVsIHdoaWxlIGFueSB0b29sIG93bnMgdGhlIHBvaW50ZXIuXG4gICAqXG4gICAqIE9TRCdzIG5hdGl2ZSBzY3JvbGwtem9vbSBpcyBwYXJ0IG9mIG1vdXNlLW5hdiwgc28gYHNldE1vdXNlTmF2RW5hYmxlZChmYWxzZSlgXG4gICAqICh1c2VkIGJ5IGV2ZXJ5IHJlZ2lvbiB0b29sIGFuZCBieSB0aGUgd2FuZC9icnVzaC9lcmFzZXIvU0FNIHRvb2xzKSBkaXNhYmxlc1xuICAgKiBpdC4gVGhlIGNvdmVyaW5nLWNhbnZhcyB0b29scyBhbHNvIHNpdCBhYm92ZSB0aGUgT1NEIGNhbnZhcyBhbmQgc3dhbGxvdyB0aGVcbiAgICogd2hlZWwgb3V0cmlnaHQuIFRoaXMgbGlzdGVuZXIgaXMgYm91bmQgb25jZSB0byB0aGUgdmlld2VyIGVsZW1lbnQg4oCUIGFuXG4gICAqIGFuY2VzdG9yIG9mIGJvdGggdGhlIE9TRCBjYW52YXMgYW5kIHRoZSB0b29sIG92ZXJsYXlzIOKAlCBhbmQgZm9yd2FyZHMgdGhlXG4gICAqIHdoZWVsIHRvIGEgY3Vyc29yLWNlbnRyZWQgem9vbSB3aGVuZXZlciBtb3VzZS1uYXYgaXMgb2ZmLiBXaGVuIG5hdiBpcyBvbiAobm9cbiAgICogdG9vbCBhY3RpdmUpIGl0IGRvZXMgbm90aGluZyBhbmQgT1NEIHpvb21zIG5hdGl2ZWx5LiAoaml0LXVpIzk0KSAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHdoZWVsWm9vbUhhbmRsZXIgPSAoZTogV2hlZWxFdmVudCkgPT4ge1xuICAgIGNvbnN0IHZwID0gdGhpcy52aWV3ZXI/LnZpZXdwb3J0O1xuICAgIGNvbnN0IGVsID0gdGhpcy52aWV3ZXI/LmVsZW1lbnQ7XG4gICAgLy8gTmF2IG9uIOKGkiBubyB0b29sIGFjdGl2ZSDihpIgbGV0IE9TRCBoYW5kbGUgc2Nyb2xsLXpvb20gbmF0aXZlbHkuXG4gICAgaWYgKCF2cCB8fCAhZWwgfHwgZS5kZWx0YVkgPT09IDAgfHwgdGhpcy52aWV3ZXIuaXNNb3VzZU5hdkVuYWJsZWQoKSkgcmV0dXJuO1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgcmVmUG9pbnQgPSB2cC5wb2ludEZyb21QaXhlbChuZXcgT1NELlBvaW50KGUuY2xpZW50WCAtIHJlY3QubGVmdCwgZS5jbGllbnRZIC0gcmVjdC50b3ApKTtcbiAgICB2cC56b29tQnkoZS5kZWx0YVkgPCAwID8gT1NEX1pPT01fUEVSX1NDUk9MTCA6IDEgLyBPU0RfWk9PTV9QRVJfU0NST0xMLCByZWZQb2ludCk7XG4gICAgdnAuYXBwbHlDb25zdHJhaW50cygpO1xuICB9O1xuXG4gIC8qKiBDdXJzb3IgZmVlZGJhY2sgcGVyIG1vZGUgKGNyb3NzaGFpciB3aGlsZSBkcmF3aW5nOyBwb2ludGVyIG92ZXIgYSByZWdpb25cbiAgICogIGluIHNlbGVjdCBtb2RlKS4gKi9cbiAgcHJpdmF0ZSB1cGRhdGVDdXJzb3Iob3ZlclJlZ2lvbjogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMudmlld2VyLmNhbnZhcztcbiAgICBpZiAoXG4gICAgICB0aGlzLm1vZGUgPT09ICdkcmF3cmVjdCcgfHxcbiAgICAgIHRoaXMubW9kZSA9PT0gJ2RyYXdjbG9zZWRwYXRoJyB8fFxuICAgICAgdGhpcy5tb2RlID09PSAnZHJhd29wZW5wYXRoJyB8fFxuICAgICAgdGhpcy5tb2RlID09PSAnZHJhd3BvbHlnb24nIHx8XG4gICAgICB0aGlzLm1vZGUgPT09ICdhZGRwb2ludCcgfHxcbiAgICAgIHRoaXMubW9kZSA9PT0gJ2RlbGV0ZXBvaW50J1xuICAgICkge1xuICAgICAgY2FudmFzLnN0eWxlLmN1cnNvciA9ICdjcm9zc2hhaXInO1xuICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlID09PSAnbW92ZScpIHtcbiAgICAgIGNhbnZhcy5zdHlsZS5jdXJzb3IgPSAnbW92ZSc7XG4gICAgfSBlbHNlIGlmICh0aGlzLm1vZGUgPT09ICdzZWxlY3QnKSB7XG4gICAgICBjYW52YXMuc3R5bGUuY3Vyc29yID0gb3ZlclJlZ2lvbiA/ICdwb2ludGVyJyA6ICdkZWZhdWx0JztcbiAgICB9IGVsc2Uge1xuICAgICAgY2FudmFzLnN0eWxlLmN1cnNvciA9ICcnOyAvLyBPU0QgZGVmYXVsdCAoZ3JhYilcbiAgICB9XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgc2VsZWN0ZWQgcmVnaW9uJ3MgdmVydGljZXMvaGFuZGxlcyBzaG91bGQgYmUgZHJhd24uIFNob3duXG4gICAqICB3aGVuZXZlciBhIHJlZ2lvbiBpcyBzZWxlY3RlZCDigJQgaW5jbHVkaW5nIGBub25lYCAoZGlzcGxheSkgbW9kZSBhbmQgd2hpbGVcbiAgICogIGFub3RoZXIgdG9vbCAod2FuZCwgYnJ1c2gsIFNBTeKApikgaXMgYWN0aXZlIOKAlCBzbyBhIHNlbGVjdGlvbiBhbHdheXMgcmV2ZWFsc1xuICAgKiAgaXRzIHZlcnRpY2VzLiBTdXBwcmVzc2VkIG9ubHkgd2hpbGUgYWN0aXZlbHkgZHJhd2luZyBhIGJyYW5kLW5ldyBzaGFwZSxcbiAgICogIHdoZXJlIHN0cmF5IGhhbmRsZXMgd291bGQgYmUgbm9pc2UuICovXG4gIHByaXZhdGUgZ2V0IHNob3dzU2VsZWN0ZWRWZXJ0aWNlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5tb2RlICE9PSAnZHJhd3JlY3QnICYmXG4gICAgICB0aGlzLm1vZGUgIT09ICdkcmF3cG9seWdvbicgJiZcbiAgICAgIHRoaXMubW9kZSAhPT0gJ2RyYXdjbG9zZWRwYXRoJyAmJlxuICAgICAgdGhpcy5tb2RlICE9PSAnZHJhd29wZW5wYXRoJ1xuICAgICk7XG4gIH1cblxuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIC8vIENsb3NlIGEgZ2VzdHVyZSBpbiBmbGlnaHQgZmlyc3Q6IGEgZHJhZydzIG9wZW4gc3RvcmUgYmF0Y2ggd291bGRcbiAgICAvLyBvdGhlcndpc2Ugc3VwcHJlc3MgZXZlcnkgbGF0ZXIgcmVnaW9uLXVwZGF0ZSBlbWlzc2lvbiBhcHAtd2lkZS5cbiAgICB0aGlzLmVuZEdlc3R1cmUoKTtcbiAgICB0aGlzLnZpZXdlci5jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIHRoaXMucG9pbnRlckNhbmNlbEhhbmRsZXIpO1xuICAgIHRoaXMuc3Vicy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMudmlld2VyLmVsZW1lbnQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3doZWVsJywgdGhpcy53aGVlbFpvb21IYW5kbGVyKTtcbiAgICB0aGlzLnZpZXdlci5yZW1vdmVIYW5kbGVyKCd1cGRhdGUtdmlld3BvcnQnLCB0aGlzLmNhbWVyYUhhbmRsZXIpO1xuICAgIHRoaXMudmlld2VyLnJlbW92ZUhhbmRsZXIoJ3Jlc2l6ZScsIHRoaXMuY2FtZXJhSGFuZGxlcik7XG4gICAgdGhpcy52aWV3ZXIucmVtb3ZlSGFuZGxlcigncm90YXRlJywgdGhpcy5jYW1lcmFIYW5kbGVyKTtcbiAgICBpZiAodGhpcy50cmFja2VyKSB0aGlzLnRyYWNrZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuc291cmNlTGF5ZXI/LmRlc3Ryb3koKTtcbiAgICBpZiAodGhpcy5zdmcucGFyZW50Tm9kZSkgdGhpcy5zdmcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnN2Zyk7XG4gIH1cblxuICAvLyDilIDilIAgY29vcmRpbmF0ZSBoZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvKiogSW1hZ2UtcGl4ZWwgcG9pbnQgLT4gZWxlbWVudCBwaXhlbCBwb2ludC4gKi9cbiAgcHJpdmF0ZSB0b1B4KGltZ1g6IG51bWJlciwgaW1nWTogbnVtYmVyKTogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHtcbiAgICByZXR1cm4gaW1hZ2VUb0VsZW1lbnQodGhpcy52aWV3ZXIsIGltZ1gsIGltZ1kpO1xuICB9XG4gIC8qKiBFbGVtZW50IHBpeGVsIHBvaW50IChmcm9tIGEgTW91c2VUcmFja2VyIGV2ZW50KSAtPiBpbWFnZS1waXhlbCBwb2ludCwgcm91bmRlZFxuICAgKiAgdG8gd2hvbGUgcGl4ZWxzICh3aGVyZSBhIGRyYXduIHZlcnRleCBsYW5kcykuICovXG4gIHByaXZhdGUgdG9JbWFnZShwb3M6IGFueSk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB7XG4gICAgY29uc3QgcCA9IGVsZW1lbnRUb0ltYWdlKHRoaXMudmlld2VyLCBwb3MueCwgcG9zLnkpO1xuICAgIHJldHVybiB7IHg6IE1hdGgucm91bmQocC54KSwgeTogTWF0aC5yb3VuZChwLnkpIH07XG4gIH1cbiAgLyoqIEVsZW1lbnQgcGl4ZWwgcG9pbnQgLT4gZXhhY3QgaW1hZ2UgcG9pbnQsIGZvciBoaXQgdGVzdHMuICovXG4gIHByaXZhdGUgdG9Xb3JsZChwb3M6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB7XG4gICAgcmV0dXJuIGVsZW1lbnRUb0ltYWdlKHRoaXMudmlld2VyLCBwb3MueCwgcG9zLnkpO1xuICB9XG4gIC8qKiBJbWFnZSBwb2ludCAtPiBlbGVtZW50IHB4LCBhcyB0aGUgc2hhcmVkIHJlZ2lvbiBnZW9tZXRyeSB3YW50cyBpdC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSB0b1NjcmVlbjogVG9TY3JlZW4gPSAoeCwgeSkgPT4ge1xuICAgIGNvbnN0IHEgPSB0aGlzLnRvUHgoeCwgeSk7XG4gICAgcmV0dXJuIFtxLngsIHEueV07XG4gIH07XG5cbiAgLy8g4pSA4pSAIHJlbmRlcmluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLyoqIEZvbGxvdyB0aGUgY3VycmVudCBpbWFnZeKGkmVsZW1lbnQgcHJvamVjdGlvbjogdGhlIHJlbmRlcmVyIHJld3JpdGVzIG9uZSB0cmFuc2Zvcm1cbiAgICogIGFuZCByZS1wb3NpdGlvbnMgaXRzIHNjcmVlbi1zcGFjZSBlbGVtZW50cywgb3IgZG9lcyBub3RoaW5nIHdoZW4gaXQgZGlkIG5vdCBtb3ZlLiAqL1xuICBwcml2YXRlIHVwZGF0ZUNhbWVyYSgpOiB2b2lkIHtcbiAgICBjb25zdCBhZmZpbmUgPSBhZmZpbmVGcm9tUHJvamVjdGlvbih0aGlzLnRvU2NyZWVuKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldENhbWVyYShhZmZpbmUpO1xuICAgIHRoaXMuc291cmNlTGF5ZXI/LnNldENhbWVyYShhZmZpbmUpO1xuICB9XG5cbiAgLyoqIFJlYnVpbGQgZXZlcnl0aGluZzogdGhlIHJlZ2lvbnMgKGluIGltYWdlIGNvb3JkaW5hdGVzKSwgdGhlaXIgbGFiZWxzIGFuZCB0aGUgb3ZlcmxheS4gKi9cbiAgcmVkcmF3KCk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlQ2FtZXJhKCk7XG4gICAgdGhpcy5yZW5kZXJlci5yZW5kZXIodGhpcy5zdG9yZS5nZXRSZWdpb25zKCksIHRoaXMuc2VsZWN0ZWQpO1xuICAgIHRoaXMucmVuZGVyT3ZlcmxheSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYnVpbGQgdGhlIHNjcmVlbi1zcGFjZSBvdmVybGF5IG9ubHk6IHRoZSBzZWxlY3RlZCByZWdpb24ncyBoYW5kbGVzLCB0aGUgcnViYmVyIGJhbmRcbiAgICogYW5kIGFueSBpbi1wcm9ncmVzcyBkcmF3aW5nLiBEcmF3aW5nIGFuZCBtYXJxdWVlIGRyYWdzIGNhbGwgdGhpcyByYXRoZXIgdGhhblxuICAgKiB7QGxpbmsgcmVkcmF3fSwgc28gdGhlIHJlZ2lvbnMgYXJlIG5vdCByZWJ1aWx0IHBlciBwb2ludGVyIG1vdmUuXG4gICAqL1xuICBwcml2YXRlIHJlbmRlck92ZXJsYXkoKTogdm9pZCB7XG4gICAgY29uc3Qgc2hhcGVDb2xvciA9IHRoaXMuc3RvcmUuZ2V0U2hhcGVDb2xvcigpO1xuICAgIHRoaXMucmVuZGVyZXIucmVuZGVyT3ZlcmxheSgobGF5ZXIpID0+IHtcbiAgICAgIC8vIEhhbmRsZXMgb24gdGhlIHNlbGVjdGVkIHJlZ2lvbiwgc28gdGhlIHVzZXIgY2FuIGdyYWIvaW5zZXJ0L2RlbGV0ZVxuICAgICAgLy8gdmVydGljZXMg4oCUIGluIHRoZSByZWdpb24ncyBvd24gY29sb3VyLCBzbyB0aGV5IG1hdGNoIHRoZSBzaGFwZS5cbiAgICAgIGNvbnN0IHNlbCA9IHRoaXMuc2hvd3NTZWxlY3RlZFZlcnRpY2VzID8gdGhpcy5zZWxlY3RlZFJlZ2lvbkluZm8oKSA6IG51bGw7XG4gICAgICBpZiAoc2VsKSBkcmF3U2VsZWN0aW9uSGFuZGxlcyhsYXllciwgc2VsLnJlZ2lvbiwgc2VsLnJlZ2lvbi5jb2xvciB8fCBzaGFwZUNvbG9yKTtcbiAgICAgIC8vIFJ1YmJlci1iYW5kIChtYXJxdWVlKSBzZWxlY3Rpb24gcHJldmlldy5cbiAgICAgIGlmICh0aGlzLm1vZGUgPT09ICdzZWxlY3QnICYmIHRoaXMuYmFuZFN0YXJ0ICYmIHRoaXMuYmFuZEN1cnJlbnQpIHtcbiAgICAgICAgZHJhd1NlbGVjdGlvbkJhbmQobGF5ZXIsIHRoaXMuYmFuZFN0YXJ0LCB0aGlzLmJhbmRDdXJyZW50KTtcbiAgICAgIH1cbiAgICAgIC8vIEluLXByb2dyZXNzIGRyYXdpbmcgcHJldmlldy5cbiAgICAgIGlmICh0aGlzLm1vZGUgPT09ICdkcmF3cmVjdCcgJiYgdGhpcy5yZWN0U3RhcnQgJiYgdGhpcy5yZWN0Q3VycmVudCkge1xuICAgICAgICBkcmF3RHJhZnRSZWN0KGxheWVyLCB0aGlzLnJlY3RTdGFydCwgdGhpcy5yZWN0Q3VycmVudCwgc2hhcGVDb2xvcik7XG4gICAgICB9XG4gICAgICBpZiAoKHRoaXMubW9kZSA9PT0gJ2RyYXdjbG9zZWRwYXRoJyB8fCB0aGlzLm1vZGUgPT09ICdkcmF3b3BlbnBhdGgnKSAmJiB0aGlzLnBvbHlQb2ludHMubGVuZ3RoKSB7XG4gICAgICAgIGRyYXdEcmFmdFBhdGgobGF5ZXIsIHRoaXMucG9seVBvaW50cywgc2hhcGVDb2xvcik7XG4gICAgICB9XG4gICAgICAvLyBDbGljay10by1wbGFjZSBwb2x5Z29uIHByZXZpZXc6IHRoZSBwb2x5bGluZSBzbyBmYXIgKyBhIG1hcmtlciBvbiB0aGVcbiAgICAgIC8vIGZpcnN0IHZlcnRleCAoY2xpY2sgaXQgdG8gY2xvc2UpLlxuICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ2RyYXdwb2x5Z29uJyAmJiB0aGlzLnBvbHlQb2ludHMubGVuZ3RoKSB7XG4gICAgICAgIGRyYXdEcmFmdFBhdGgobGF5ZXIsIHRoaXMucG9seVBvaW50cywgc2hhcGVDb2xvcik7XG4gICAgICAgIHZlcnRleE1hcmtlcihsYXllciwgdGhpcy5wb2x5UG9pbnRzWzBdLngsIHRoaXMucG9seVBvaW50c1swXS55LCB0cnVlLCBzaGFwZUNvbG9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBpbnRlcmFjdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgcHJpdmF0ZSBnZXQgaXNGcmVlaGFuZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSAnZHJhd2Nsb3NlZHBhdGgnIHx8IHRoaXMubW9kZSA9PT0gJ2RyYXdvcGVucGF0aCc7XG4gIH1cblxuICBwcml2YXRlIG9uUHJlc3MoZTogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ2RyYXdyZWN0Jykge1xuICAgICAgdGhpcy5yZWN0U3RhcnQgPSB0aGlzLnRvSW1hZ2UoZS5wb3NpdGlvbik7XG4gICAgICB0aGlzLnJlY3RDdXJyZW50ID0gdGhpcy5yZWN0U3RhcnQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmlzRnJlZWhhbmQpIHtcbiAgICAgIC8vIEZyZWVoYW5kIGRyYXcgKG1hdGNoZXMgUGxvdGx5IGRyYXdjbG9zZWRwYXRoL2RyYXdvcGVucGF0aCk6IHByZXNzIHRvXG4gICAgICAvLyBzdGFydCwgZHJhZyB0byB0cmFjZSwgcmVsZWFzZSB0byBjb21taXQuXG4gICAgICB0aGlzLmZyZWVoYW5kRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5wb2x5UG9pbnRzID0gW3RoaXMudG9JbWFnZShlLnBvc2l0aW9uKV07XG4gICAgICB0aGlzLmxhc3RGcmVlaGFuZFB4ID0geyB4OiBlLnBvc2l0aW9uLngsIHk6IGUucG9zaXRpb24ueSB9O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5tb2RlID09PSAnbW92ZScpIHtcbiAgICAgIC8vIFdob2xlLXJlZ2lvbiBkcmFnICgnbW92ZScgbW9kZSk6IHByZXNzIGluc2lkZSB0aGUgc2VsZWN0ZWQgcmVnaW9uXG4gICAgICAvLyB0byB0cmFuc2xhdGUgaXQsIGlnbm9yaW5nIHZlcnRpY2VzL2VkZ2VzLlxuICAgICAgY29uc3Qgc2VsID0gdGhpcy5zZWxlY3RlZFJlZ2lvbkluZm8oKTtcbiAgICAgIGlmIChzZWwgJiYgdGhpcy5jb250YWluc1BvaW50KHNlbC5yZWdpb24sIGUucG9zaXRpb24pKSB7XG4gICAgICAgIHRoaXMuc3RhcnRFZGl0KCdib3VuZHMnLCAnbW92ZScsIC0xLCBzZWwucmVnaW9uLCB0aGlzLnRvSW1hZ2UoZS5wb3NpdGlvbikpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5tb2RlID09PSAnc2VsZWN0Jykge1xuICAgICAgLy8gQSBiZXppZXIgY29udHJvbCBoYW5kbGUgdGFrZXMgdG9wIHByaW9yaXR5IChpdCBzaXRzIG9mZiB0aGUgYW5jaG9yKSwgdGhlblxuICAgICAgLy8gZHJhZ2dpbmcgYSBzaW5nbGUgcG9seWdvbiB2ZXJ0ZXggKG92ZXIgYm9keS1tb3ZlL3Jlc2l6ZSkuXG4gICAgICBjb25zdCBoaXQgPSB0aGlzLmhpdFBvbHlnb25IYW5kbGUoZS5wb3NpdGlvbik7XG4gICAgICBpZiAoaGl0KSB7XG4gICAgICAgIGNvbnN0IHJlZ2lvbiA9IHRoaXMuc3RvcmUuZ2V0UmVnaW9ucygpW3RoaXMuc2VsZWN0ZWRbdGhpcy5zZWxlY3RlZC5sZW5ndGggLSAxXV07XG4gICAgICAgIGlmIChoaXQua2luZCA9PT0gJ2JlemllcicpIHtcbiAgICAgICAgICB0aGlzLnN0YXJ0RWRpdCgnaGFuZGxlJywgJ21vdmUnLCBoaXQuaW5kZXgsIHJlZ2lvbiwgdGhpcy50b0ltYWdlKGUucG9zaXRpb24pLCBoaXQuc2lkZSwgaGl0LnJpbmcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc3RhcnRFZGl0KCd2ZXJ0ZXgnLCAnbW92ZScsIGhpdC5pbmRleCwgcmVnaW9uLCB0aGlzLnRvSW1hZ2UoZS5wb3NpdGlvbiksICdvdXQnLCBoaXQucmluZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gT3RoZXJ3aXNlIHN0YXJ0IGEgbW92ZS9yZXNpemUgd2hlbiBwcmVzc2luZyB0aGUgc2VsZWN0ZWQgcmVnaW9uJ3NcbiAgICAgIC8vIGJvZHkvaGFuZGxlcy5cbiAgICAgIGNvbnN0IGV6ID0gdGhpcy5lZGl0Wm9uZUF0KGUucG9zaXRpb24pO1xuICAgICAgaWYgKGV6KSB7XG4gICAgICAgIHRoaXMuc3RhcnRFZGl0KCdib3VuZHMnLCBlei56b25lLCAtMSwgdGhpcy5zdG9yZS5nZXRSZWdpb25zKClbZXouaW5kZXhdLCB0aGlzLnRvSW1hZ2UoZS5wb3NpdGlvbikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBQcmVzcyBvbiBlbXB0eSBzcGFjZSAvIGEgbm9uLXNlbGVjdGVkIHJlZ2lvbjogYmVnaW4gYSBydWJiZXItYmFuZFxuICAgICAgLy8gbXVsdGktc2VsZWN0LiBBIHBsYWluIGNsaWNrIChubyBkcmFnKSBmYWxscyB0aHJvdWdoIHRvIG9uQ2xpY2ssIHdoaWNoXG4gICAgICAvLyBzaW5nbGUtc2VsZWN0cyBvciBjbGVhcnMuXG4gICAgICB0aGlzLmJhbmRTdGFydCA9IHRoaXMudG9JbWFnZShlLnBvc2l0aW9uKTtcbiAgICAgIHRoaXMuYmFuZEN1cnJlbnQgPSB0aGlzLmJhbmRTdGFydDtcbiAgICAgIHRoaXMuYmFuZERyYWdnZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKiogQmVnaW4gYW4gZWRpdCBnZXN0dXJlIChtb3ZlL3Jlc2l6ZSBvciBzaW5nbGUtdmVydGV4IGRyYWcpIGFuZCBvcGVuIGEgc3RvcmVcbiAgICogIGJhdGNoIHNvIHRoZSBsaXZlIGRyYWcgZW1pdHMgb25jZSBvbiByZWxlYXNlLiAqL1xuICBwcml2YXRlIHN0YXJ0RWRpdChcbiAgICBraW5kOiAnYm91bmRzJyB8ICd2ZXJ0ZXgnIHwgJ2hhbmRsZScsXG4gICAgem9uZTogRWRpdFpvbmUsXG4gICAgdmVydGV4SW5kZXg6IG51bWJlcixcbiAgICByZWdpb246IFJlZ2lvbixcbiAgICBzdGFydEltZzogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9LFxuICAgIGhhbmRsZVNpZGU6ICdpbicgfCAnb3V0JyA9ICdvdXQnLFxuICAgIHJpbmcgPSAtMSxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0ID0ge1xuICAgICAga2luZCxcbiAgICAgIHpvbmUsXG4gICAgICB2ZXJ0ZXhJbmRleCxcbiAgICAgIHJpbmcsXG4gICAgICBoYW5kbGVTaWRlLFxuICAgICAgaWQ6IHJlZ2lvbi5pZCxcbiAgICAgIHN0YXJ0SW1nLFxuICAgICAgb3JpZzoga2luZCA9PT0gJ2JvdW5kcycgPyB0aGlzLnNuYXBzaG90KHJlZ2lvbikgOiBudWxsLFxuICAgIH07XG4gICAgdGhpcy5lZGl0RHJhZ2dlZCA9IGZhbHNlO1xuICAgIHRoaXMuc3RvcmUuYmVnaW5CYXRjaCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkRyYWcoZTogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ2RyYXdyZWN0JyAmJiB0aGlzLnJlY3RTdGFydCkge1xuICAgICAgdGhpcy5yZWN0Q3VycmVudCA9IHRoaXMudG9JbWFnZShlLnBvc2l0aW9uKTtcbiAgICAgIHRoaXMucmVuZGVyT3ZlcmxheSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5mcmVlaGFuZERyYWdnaW5nICYmIHRoaXMuaXNGcmVlaGFuZCkge1xuICAgICAgLy8gVGhpbiB0aGUgcGF0aDogb25seSBzYW1wbGUgb25jZSB0aGUgY3Vyc29yIGhhcyBtb3ZlZCBhIGZldyBzY3JlZW4gcHguXG4gICAgICBjb25zdCBsYXN0ID0gdGhpcy5sYXN0RnJlZWhhbmRQeDtcbiAgICAgIGlmICghbGFzdCB8fCBNYXRoLmh5cG90KGUucG9zaXRpb24ueCAtIGxhc3QueCwgZS5wb3NpdGlvbi55IC0gbGFzdC55KSA+PSA0KSB7XG4gICAgICAgIHRoaXMucG9seVBvaW50cy5wdXNoKHRoaXMudG9JbWFnZShlLnBvc2l0aW9uKSk7XG4gICAgICAgIHRoaXMubGFzdEZyZWVoYW5kUHggPSB7IHg6IGUucG9zaXRpb24ueCwgeTogZS5wb3NpdGlvbi55IH07XG4gICAgICAgIHRoaXMucmVuZGVyT3ZlcmxheSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5lZGl0KSB7XG4gICAgICB0aGlzLmVkaXREcmFnZ2VkID0gdHJ1ZTtcbiAgICAgIHRoaXMuYXBwbHlFZGl0KHRoaXMudG9JbWFnZShlLnBvc2l0aW9uKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmJhbmRTdGFydCkge1xuICAgICAgdGhpcy5iYW5kQ3VycmVudCA9IHRoaXMudG9JbWFnZShlLnBvc2l0aW9uKTtcbiAgICAgIHRoaXMuYmFuZERyYWdnZWQgPSB0cnVlO1xuICAgICAgdGhpcy5yZW5kZXJPdmVybGF5KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvblJlbGVhc2UoZTogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ2RyYXdyZWN0JyAmJiB0aGlzLnJlY3RTdGFydCkge1xuICAgICAgY29uc3QgZW5kID0gdGhpcy50b0ltYWdlKGUucG9zaXRpb24pO1xuICAgICAgY29uc3QgeCA9IE1hdGgubWluKHRoaXMucmVjdFN0YXJ0LngsIGVuZC54KTtcbiAgICAgIGNvbnN0IHkgPSBNYXRoLm1pbih0aGlzLnJlY3RTdGFydC55LCBlbmQueSk7XG4gICAgICBjb25zdCB3ID0gTWF0aC5hYnMoZW5kLnggLSB0aGlzLnJlY3RTdGFydC54KTtcbiAgICAgIGNvbnN0IGggPSBNYXRoLmFicyhlbmQueSAtIHRoaXMucmVjdFN0YXJ0LnkpO1xuICAgICAgdGhpcy5yZWN0U3RhcnQgPSB0aGlzLnJlY3RDdXJyZW50ID0gbnVsbDtcbiAgICAgIGlmICh3ID4gMiAmJiBoID4gMikgdGhpcy5jb21taXRSZWN0YW5nbGUoeCwgeSwgdywgaCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmZyZWVoYW5kRHJhZ2dpbmcpIHtcbiAgICAgIHRoaXMuZnJlZWhhbmREcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgdGhpcy5sYXN0RnJlZWhhbmRQeCA9IG51bGw7XG4gICAgICAvLyBDbG9zZWQgPSBmcmVlZm9ybSAoZHJhd2Nsb3NlZHBhdGgpOyBvcGVuID0gcG9seWxpbmUgKGRyYXdvcGVucGF0aCkuXG4gICAgICB0aGlzLmNvbW1pdFBvbHlnb24odGhpcy5tb2RlID09PSAnZHJhd2Nsb3NlZHBhdGgnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gTW92ZS9yZXNpemUgYWxyZWFkeSBhcHBsaWVkIGxpdmU7IGZsdXNoIHRoZSBjb2FsZXNjZWQgZWRpdHMgKyBlbmQgdGhlXG4gICAgLy8gZ2VzdHVyZSAoa2VlcCBzZWxlY3Rpb24pLlxuICAgIGlmICh0aGlzLmVkaXQpIHtcbiAgICAgIHRoaXMuc3RvcmUuZW5kQmF0Y2goKTtcbiAgICAgIHRoaXMuZWRpdCA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEZpbmlzaCBhIHJ1YmJlci1iYW5kIHNlbGVjdGlvbjogc2VsZWN0IGV2ZXJ5IHJlZ2lvbiB0aGUgYmFuZCBpbnRlcnNlY3RzLlxuICAgIGlmICh0aGlzLmJhbmRTdGFydCkge1xuICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLmJhbmRTdGFydDtcbiAgICAgIGNvbnN0IGVuZCA9IHRoaXMuYmFuZEN1cnJlbnQgPz8gc3RhcnQ7XG4gICAgICB0aGlzLmJhbmRTdGFydCA9IHRoaXMuYmFuZEN1cnJlbnQgPSBudWxsO1xuICAgICAgY29uc3QgeDAgPSBNYXRoLm1pbihzdGFydC54LCBlbmQueCksXG4gICAgICAgIHkwID0gTWF0aC5taW4oc3RhcnQueSwgZW5kLnkpO1xuICAgICAgY29uc3QgeDEgPSBNYXRoLm1heChzdGFydC54LCBlbmQueCksXG4gICAgICAgIHkxID0gTWF0aC5tYXgoc3RhcnQueSwgZW5kLnkpO1xuICAgICAgLy8gT25seSBhIHJlYWwgZHJhZyBzZWxlY3RzOyBhIGNsaWNrLXNpemVkIGJhbmQgZmFsbHMgdGhyb3VnaCB0byBvbkNsaWNrLlxuICAgICAgaWYgKHRoaXMuYmFuZERyYWdnZWQgJiYgKHgxIC0geDAgPiAyIHx8IHkxIC0geTAgPiAyKSkge1xuICAgICAgICB0aGlzLnN0b3JlLnNldFNlbGVjdGVkU2hhcGVJbmRpY2VzKFxuICAgICAgICAgIHJlZ2lvbnNJblJlY3QodGhpcy5zdG9yZS5nZXRSZWdpb25zKCksIHgwLCB5MCwgeDEsIHkxLCB7IHNraXA6IChyKSA9PiB0aGlzLmhpZGRlbihyKSB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zZWxlY3RTb3VyY2VJbih4MCwgeTAsIHgxLCB5MSk7XG4gICAgICB9XG4gICAgICB0aGlzLnJlbmRlck92ZXJsYXkoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uQ2xpY2soZTogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ3NlbGVjdCcpIHtcbiAgICAgIC8vIEEgbW92ZS9yZXNpemUvdmVydGV4IGRyYWcgb3IgYSBydWJiZXItYmFuZCBkcmFnIGFsc28gZW5kcyB3aXRoIGEgY2xpY2tcbiAgICAgIC8vIGV2ZW50IOKAlCBkb24ndCB0cmVhdCBpdCBhcyBhIHJlLXNlbGVjdGlvbi5cbiAgICAgIGlmICh0aGlzLmVkaXREcmFnZ2VkKSB7XG4gICAgICAgIHRoaXMuZWRpdERyYWdnZWQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuYmFuZERyYWdnZWQpIHtcbiAgICAgICAgdGhpcy5iYW5kRHJhZ2dlZCA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBTaGlmdCAob3IgQ21kL0N0cmwpIHRvZ2dsZXMgdGhlIGNsaWNrZWQgcmVnaW9uIGluL291dCBvZiB0aGUgY3VycmVudFxuICAgICAgLy8gc2VsZWN0aW9uOyBhIHBsYWluIGNsaWNrIHJlcGxhY2VzIGl0LlxuICAgICAgY29uc3Qgb2UgPSBlLm9yaWdpbmFsRXZlbnQ7XG4gICAgICBjb25zdCBhZGRpdGl2ZSA9ICEhb2UgJiYgKG9lLnNoaWZ0S2V5IHx8IG9lLm1ldGFLZXkgfHwgb2UuY3RybEtleSk7XG4gICAgICB0aGlzLnNlbGVjdEF0KHRoaXMudG9Xb3JsZChlLnBvc2l0aW9uKSwgYWRkaXRpdmUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5tb2RlID09PSAnZHJhd3BvbHlnb24nKSB7XG4gICAgICB0aGlzLm9uRHJhd1BvbHlnb25DbGljayhlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ2FkZHBvaW50Jykge1xuICAgICAgLy8gSW5zZXJ0IGEgdmVydGV4IG9uIHRoZSBjbGlja2VkIGVkZ2Ug4oCUIGV4dGVyaW9yIG9yIGFuIGludGVyaW9yIHJpbmcuXG4gICAgICBjb25zdCBzZWwgPSB0aGlzLnNlbGVjdGVkUmVnaW9uSW5mbygpO1xuICAgICAgY29uc3QgZWRnZSA9IHNlbCA/IHRoaXMuaGl0RWRnZShlLnBvc2l0aW9uLCBzZWwucmVnaW9uKSA6IG51bGw7XG4gICAgICBpZiAoc2VsICYmIGVkZ2UpIHtcbiAgICAgICAgaWYgKGVkZ2UucmluZyA8IDApIHRoaXMuc3RvcmUuYWRkVmVydGV4KHNlbC5yZWdpb24uaWQsIGVkZ2Uuc2VnSW5kZXgsIGVkZ2UueCwgZWRnZS55KTtcbiAgICAgICAgZWxzZSB0aGlzLnN0b3JlLmFkZEhvbGVWZXJ0ZXgoc2VsLnJlZ2lvbi5pZCwgZWRnZS5yaW5nLCBlZGdlLnNlZ0luZGV4LCBlZGdlLngsIGVkZ2UueSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLm1vZGUgPT09ICdkZWxldGVwb2ludCcpIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgY2xpY2tlZCB2ZXJ0ZXgg4oCUIGV4dGVyaW9yIG9yIGFuIGludGVyaW9yIHJpbmcgKGppdC11aSM4NSkuXG4gICAgICBjb25zdCBzZWwgPSB0aGlzLnNlbGVjdGVkUmVnaW9uSW5mbygpO1xuICAgICAgY29uc3QgdmggPSB0aGlzLmhpdFBvbHlnb25IYW5kbGUoZS5wb3NpdGlvbiwgZmFsc2UpO1xuICAgICAgaWYgKHNlbCAmJiB2aCkge1xuICAgICAgICBpZiAodmgucmluZyA8IDApIHRoaXMuc3RvcmUuZGVsZXRlVmVydGV4KHNlbC5yZWdpb24uaWQsIHZoLmluZGV4KTtcbiAgICAgICAgZWxzZSB0aGlzLnN0b3JlLmRlbGV0ZUhvbGVWZXJ0ZXgoc2VsLnJlZ2lvbi5pZCwgdmgucmluZywgdmguaW5kZXgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGljay10by1wbGFjZSBwb2x5Z29uICgnZHJhd3BvbHlnb24nKTogdGhlIGZpcnN0IGNsaWNrIHN0YXJ0cyB0aGVcbiAgICogcG9seWdvbiwgZWFjaCBzdWJzZXF1ZW50IGNsaWNrIGFkZHMgYSB2ZXJ0ZXgsIGFuZCBjbGlja2luZyBuZWFyIHRoZSBmaXJzdFxuICAgKiB2ZXJ0ZXggKHdpdGggYXQgbGVhc3QgMyBwbGFjZWQpIGNsb3NlcyBhbmQgY29tbWl0cyBpdC5cbiAgICovXG4gIHByaXZhdGUgb25EcmF3UG9seWdvbkNsaWNrKGU6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IHB0ID0gdGhpcy50b0ltYWdlKGUucG9zaXRpb24pO1xuICAgIGlmICghdGhpcy5kcmF3aW5nUG9seWdvbikge1xuICAgICAgdGhpcy5wb2x5UG9pbnRzID0gW3B0XTtcbiAgICAgIHRoaXMuZHJhd2luZ1BvbHlnb24gPSB0cnVlO1xuICAgICAgdGhpcy5yZW5kZXJPdmVybGF5KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZpcnN0ID0gdGhpcy50b1B4KHRoaXMucG9seVBvaW50c1swXS54LCB0aGlzLnBvbHlQb2ludHNbMF0ueSk7XG4gICAgY29uc3Qgb25GaXJzdCA9IE1hdGguaHlwb3QoZS5wb3NpdGlvbi54IC0gZmlyc3QueCwgZS5wb3NpdGlvbi55IC0gZmlyc3QueSkgPD0gRURJVF9UT0xfUFg7XG4gICAgaWYgKG9uRmlyc3QgJiYgdGhpcy5wb2x5UG9pbnRzLmxlbmd0aCA+PSAzKSB7XG4gICAgICB0aGlzLmNvbW1pdFBvbHlnb24odHJ1ZSk7IC8vIGNsb3NlcyArIHJlc2V0cyBpbi1wcm9ncmVzcyAoaW5jbC4gZHJhd2luZ1BvbHlnb24pXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucG9seVBvaW50cy5wdXNoKHB0KTtcbiAgICB0aGlzLnJlbmRlck92ZXJsYXkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIb3ZlciBmZWVkYmFjayBpbiBzZWxlY3QgbW9kZTogbW92ZS9yZXNpemUgY3Vyc29ycyBvdmVyIHRoZSBzZWxlY3RlZFxuICAgKiByZWdpb24ncyBib2R5L2VkZ2VzL2Nvcm5lcnMsIGEgcG9pbnRlciBvdmVyIGFueSBvdGhlciByZWdpb24uXG4gICAqL1xuICBwcml2YXRlIG9uTW92ZShlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb2RlICE9PSAnc2VsZWN0JykgcmV0dXJuO1xuICAgIC8vIEEgZ3JhYmJhYmxlIGJlemllciBjb250cm9sIGhhbmRsZSBvciB2ZXJ0ZXggb2YgdGhlIHNlbGVjdGVkIHBvbHlnb24gdGFrZXNcbiAgICAvLyBwcmlvcml0eS5cbiAgICBpZiAodGhpcy5oaXRQb2x5Z29uSGFuZGxlKGUucG9zaXRpb24pKSB7XG4gICAgICB0aGlzLnZpZXdlci5jYW52YXMuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBleiA9IHRoaXMuZWRpdFpvbmVBdChlLnBvc2l0aW9uKTtcbiAgICBpZiAoZXopIHtcbiAgICAgIHRoaXMudmlld2VyLmNhbnZhcy5zdHlsZS5jdXJzb3IgPSBaT05FX0NVUlNPUltlei56b25lXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcHQgPSB0aGlzLnRvV29ybGQoZS5wb3NpdGlvbik7XG4gICAgdGhpcy51cGRhdGVDdXJzb3IodGhpcy5yZWdpb25JbmRleEF0KHB0KSA+PSAwIHx8ICEhdGhpcy5zb3VyY2VMYXllcj8uZmVhdHVyZUF0KHB0LngsIHB0LnksIE9QRU5fUEFUSF9UT0xfUFgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbW92ZS9yZXNpemUgem9uZSB1bmRlciB0aGUgY3Vyc29yIGZvciB0aGUgY3VycmVudGx5LXNlbGVjdGVkIHJlZ2lvblxuICAgKiAocmVjdGFuZ2xlcyBnZXQgZWRnZS9jb3JuZXIgaGFuZGxlcyArIGJvZHk7IHBvbHlnb25zIGdldCBib2R5LW1vdmUgb25seSksXG4gICAqIG9yIG51bGwgaWYgdGhlIGN1cnNvciBpc24ndCBvdmVyIHRoZSBzZWxlY3RlZCByZWdpb24uXG4gICAqL1xuICBwcml2YXRlIGVkaXRab25lQXQocG9zaXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSk6IHsgem9uZTogRWRpdFpvbmU7IGluZGV4OiBudW1iZXIgfSB8IG51bGwge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnNlbGVjdGVkW3RoaXMuc2VsZWN0ZWQubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgcmVnaW9uID0gdGhpcy5zdG9yZS5nZXRSZWdpb25zKClbaW5kZXhdO1xuICAgIGlmICghcmVnaW9uKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBiID0gcmVnaW9uLmJvdW5kcztcbiAgICBpZiAoYiBpbnN0YW5jZW9mIFJlY3RhbmdsZSkge1xuICAgICAgY29uc3QgYSA9IHRoaXMudG9QeChiLngsIGIueSk7XG4gICAgICBjb25zdCBjID0gdGhpcy50b1B4KGIueCArIGIud2lkdGgsIGIueSArIGIuaGVpZ2h0KTtcbiAgICAgIGNvbnN0IHpvbmUgPSByZWN0Wm9uZShwb3NpdGlvbi54LCBwb3NpdGlvbi55LCB7XG4gICAgICAgIHgwOiBNYXRoLm1pbihhLngsIGMueCksXG4gICAgICAgIHkwOiBNYXRoLm1pbihhLnksIGMueSksXG4gICAgICAgIHgxOiBNYXRoLm1heChhLngsIGMueCksXG4gICAgICAgIHkxOiBNYXRoLm1heChhLnksIGMueSksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB6b25lID8geyB6b25lLCBpbmRleCB9IDogbnVsbDtcbiAgICB9XG4gICAgaWYgKGIgaW5zdGFuY2VvZiBQb2x5Z29uIHx8IGIgaW5zdGFuY2VvZiBNdWx0aVBvbHlnb24pIHtcbiAgICAgIC8vIFBvbHlnb25zICsgbXVsdGktcGFydCByZWdpb25zIHN1cHBvcnQgd2hvbGUtcmVnaW9uIG1vdmUgKG5vIHJlc2l6ZSB6b25lcykuXG4gICAgICByZXR1cm4gdGhpcy5jb250YWluc1BvaW50KHJlZ2lvbiwgcG9zaXRpb24pID8geyB6b25lOiAnbW92ZScsIGluZGV4IH0gOiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKiBUaGUgY3VycmVudGx5LXNlbGVjdGVkIHJlZ2lvbiAodGhlIGxhc3Qgb25lIHNlbGVjdGVkKSwgb3IgbnVsbC4gKi9cbiAgcHJpdmF0ZSBzZWxlY3RlZFJlZ2lvbkluZm8oKTogeyByZWdpb246IFJlZ2lvbjsgaW5kZXg6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWQubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuc2VsZWN0ZWRbdGhpcy5zZWxlY3RlZC5sZW5ndGggLSAxXTtcbiAgICBjb25zdCByZWdpb24gPSB0aGlzLnN0b3JlLmdldFJlZ2lvbnMoKVtpbmRleF07XG4gICAgcmV0dXJuIHJlZ2lvbiA/IHsgcmVnaW9uLCBpbmRleCB9IDogbnVsbDtcbiAgfVxuXG4gIC8qKiBUaGUgYmV6aWVyIGNvbnRyb2wgaGFuZGxlICh3aGVuIGBiZXppZXJgKSBvciB2ZXJ0ZXggb2YgdGhlIHNlbGVjdGVkIHBvbHlnb25cbiAgICogIHVuZGVyIHRoZSBjdXJzb3IgKHNjcmVlbi1waXhlbCB0b2xlcmFuY2UpLCBvciBudWxsLiBSZWN0YW5nbGVzIGhhdmUgbm9cbiAgICogIGVkaXRhYmxlIHZlcnRpY2VzICh0aGVpciBjb3JuZXJzIGFyZSByZXNpemUgem9uZXMsIHNlZSB7QGxpbmsgcmVjdFpvbmV9KS4gKi9cbiAgcHJpdmF0ZSBoaXRQb2x5Z29uSGFuZGxlKFxuICAgIHBvc2l0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0sXG4gICAgYmV6aWVyID0gdHJ1ZSxcbiAgKTogeyBraW5kOiAndmVydGV4JyB8ICdiZXppZXInOyByaW5nOiBudW1iZXI7IGluZGV4OiBudW1iZXI7IHNpZGU6ICdpbicgfCAnb3V0JyB9IHwgbnVsbCB7XG4gICAgY29uc3Qgc2VsID0gdGhpcy5zZWxlY3RlZFJlZ2lvbkluZm8oKTtcbiAgICBpZiAoIXNlbCB8fCAhKHNlbC5yZWdpb24uYm91bmRzIGluc3RhbmNlb2YgUG9seWdvbikpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGhpdCA9IGhpdEhhbmRsZShzZWwucmVnaW9uLCBwb3NpdGlvbi54LCBwb3NpdGlvbi55LCB0aGlzLnRvU2NyZWVuLCBFRElUX1RPTF9QWCwgeyBiZXppZXIgfSk7XG4gICAgaWYgKCFoaXQgfHwgaGl0LmtpbmQgPT09ICdjb3JuZXInKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4geyBraW5kOiBoaXQua2luZCwgcmluZzogaGl0LnJpbmcsIGluZGV4OiBoaXQuaW5kZXgsIHNpZGU6IGhpdC5raW5kID09PSAnYmV6aWVyJyA/IGhpdC5zaWRlIDogJ291dCcgfTtcbiAgfVxuXG4gIC8qKiBUaGUgZWRnZSBvZiBgcmVnaW9uYCdzIHBvbHlnb24gbmVhcmVzdCB0aGUgY3Vyc29yICh3aXRoaW4gdG9sZXJhbmNlKSwgd2l0aFxuICAgKiAgdGhlIGNsaWNrZWQgcG9pbnQgaW4gaW1hZ2UgY29vcmRzIGFzIHRoZSBpbnNlcnRpb24gcG9zaXRpb24sIG9yIG51bGwuICovXG4gIHByaXZhdGUgaGl0RWRnZShcbiAgICBwb3NpdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9LFxuICAgIHJlZ2lvbjogUmVnaW9uLFxuICApOiB7IHJpbmc6IG51bWJlcjsgc2VnSW5kZXg6IG51bWJlcjsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB8IG51bGwge1xuICAgIGNvbnN0IGVkZ2UgPSBuZWFyZXN0RWRnZShyZWdpb24sIHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHRoaXMudG9TY3JlZW4pO1xuICAgIGlmICghZWRnZSB8fCBlZGdlLmRpc3QgPiBFRElUX1RPTF9QWCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgaW1nID0gdGhpcy50b0ltYWdlKHBvc2l0aW9uKTtcbiAgICByZXR1cm4geyByaW5nOiBlZGdlLnJpbmcsIHNlZ0luZGV4OiBlZGdlLnNlZ0luZGV4LCB4OiBpbWcueCwgeTogaW1nLnkgfTtcbiAgfVxuXG4gIC8qKiBTbmFwc2hvdCB0aGUgc2VsZWN0ZWQgcmVnaW9uJ3MgZ2VvbWV0cnkgYXQgdGhlIHN0YXJ0IG9mIGFuIGVkaXQuICovXG4gIHByaXZhdGUgc25hcHNob3QocmVnaW9uOiBSZWdpb24pOiBFZGl0U25hcHNob3Qge1xuICAgIGNvbnN0IGIgPSByZWdpb24uYm91bmRzO1xuICAgIGlmIChiIGluc3RhbmNlb2YgUG9seWdvbiB8fCBiIGluc3RhbmNlb2YgTXVsdGlQb2x5Z29uKSByZXR1cm4geyBraW5kOiAnc2hhcGUnLCBib3VuZHM6IGIgfTtcbiAgICBpZiAoYiBpbnN0YW5jZW9mIFJlY3RhbmdsZSkgcmV0dXJuIHsga2luZDogJ3JlY3QnLCB4OiBiLngsIHk6IGIueSwgdzogYi53aWR0aCwgaDogYi5oZWlnaHQgfTtcbiAgICByZXR1cm4geyBraW5kOiAncmVjdCcsIHg6IDAsIHk6IDAsIHc6IDAsIGg6IDAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSB0aGUgaW4tcHJvZ3Jlc3MgbW92ZS9yZXNpemUgdG8gdGhlIHJlZ2lvbiwgbGl2ZSwgdGhyb3VnaCB0aGVcbiAgICogUmVnaW9uLW5hdGl2ZSBlZGl0IEFQSS4gUmVjb21wdXRlZCBhYnNvbHV0ZWx5IGZyb20gdGhlIGdlc3R1cmUtc3RhcnRcbiAgICogc25hcHNob3QgKGBvcmlnYCkgKyB0aGUgdG90YWwgZGVsdGEsIHNvIGVhY2ggZnJhbWUgaXMgaWRlbXBvdGVudC5cbiAgICovXG4gIHByaXZhdGUgYXBwbHlFZGl0KGN1ckltZzogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVkaXQpIHJldHVybjtcblxuICAgIGlmICh0aGlzLmVkaXQua2luZCA9PT0gJ3ZlcnRleCcpIHtcbiAgICAgIC8vIERyYWcgYSBzaW5nbGUgdmVydGV4IHRvIHRoZSBjdXJzb3IgKGFic29sdXRlIOKAlCBpZGVtcG90ZW50KS4gUm91dGUgdG8gdGhlXG4gICAgICAvLyBleHRlcmlvciBvciB0aGUgbWF0Y2hpbmcgaW50ZXJpb3IgcmluZyAoaG9sZSkg4oCUIGppdC11aSM4NS5cbiAgICAgIGlmICh0aGlzLmVkaXQucmluZyA8IDApIHtcbiAgICAgICAgdGhpcy5zdG9yZS5tb3ZlVmVydGV4KHRoaXMuZWRpdC5pZCwgdGhpcy5lZGl0LnZlcnRleEluZGV4LCBjdXJJbWcueCwgY3VySW1nLnkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdG9yZS5tb3ZlSG9sZVZlcnRleCh0aGlzLmVkaXQuaWQsIHRoaXMuZWRpdC5yaW5nLCB0aGlzLmVkaXQudmVydGV4SW5kZXgsIGN1ckltZy54LCBjdXJJbWcueSk7XG4gICAgICB9XG4gICAgICB0aGlzLnJlZHJhdygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmVkaXQua2luZCA9PT0gJ2hhbmRsZScpIHtcbiAgICAgIC8vIERyYWcgYSBiZXppZXIgY29udHJvbCBoYW5kbGUgdG8gdGhlIGN1cnNvciDigJQgZXh0ZXJpb3IgKHJpbmcgLTEpIG9yIGEgZG9udXQgaG9sZSByaW5nLlxuICAgICAgaWYgKHRoaXMuZWRpdC5yaW5nIDwgMCkge1xuICAgICAgICB0aGlzLnN0b3JlLm1vdmVCZXppZXJIYW5kbGUodGhpcy5lZGl0LmlkLCB0aGlzLmVkaXQudmVydGV4SW5kZXgsIHRoaXMuZWRpdC5oYW5kbGVTaWRlLCBjdXJJbWcueCwgY3VySW1nLnkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdG9yZS5tb3ZlSG9sZUJlemllckhhbmRsZShcbiAgICAgICAgICB0aGlzLmVkaXQuaWQsXG4gICAgICAgICAgdGhpcy5lZGl0LnJpbmcsXG4gICAgICAgICAgdGhpcy5lZGl0LnZlcnRleEluZGV4LFxuICAgICAgICAgIHRoaXMuZWRpdC5oYW5kbGVTaWRlLFxuICAgICAgICAgIGN1ckltZy54LFxuICAgICAgICAgIGN1ckltZy55LFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5yZWRyYXcoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkeCA9IGN1ckltZy54IC0gdGhpcy5lZGl0LnN0YXJ0SW1nLng7XG4gICAgY29uc3QgZHkgPSBjdXJJbWcueSAtIHRoaXMuZWRpdC5zdGFydEltZy55O1xuXG4gICAgY29uc3QgbyA9IHRoaXMuZWRpdC5vcmlnO1xuICAgIGlmICghbykgcmV0dXJuO1xuICAgIGlmIChvLmtpbmQgPT09ICdyZWN0Jykge1xuICAgICAgY29uc3QgYm94ID0gcmVzaXplUmVjdCh7IHg6IG8ueCwgeTogby55LCB3aWR0aDogby53LCBoZWlnaHQ6IG8uaCB9LCB0aGlzLmVkaXQuem9uZSwgZHgsIGR5KTtcbiAgICAgIHRoaXMuc3RvcmUudXBkYXRlQm91bmRzKHRoaXMuZWRpdC5pZCwgT2JqZWN0LmFzc2lnbihuZXcgUmVjdGFuZ2xlKCksIGJveCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBQb2x5Z29uIC8gbXVsdGktcGFydCByZWdpb246IHRyYW5zbGF0ZSBldmVyeSB2ZXJ0ZXgsIGhvbGUgYW5kIHBhcnQsIHJvdW5kZWQgdG9cbiAgICAgIC8vIHdob2xlIHBpeGVscy4gQmV6aWVyIGhhbmRsZSBvZmZzZXRzIGFyZSByZWxhdGl2ZSwgc28gdGhleSBjYXJyeSBvdmVyIHVuY2hhbmdlZC5cbiAgICAgIHRoaXMuc3RvcmUudXBkYXRlQm91bmRzKHRoaXMuZWRpdC5pZCwgdHJhbnNsYXRlQm91bmRzKG8uYm91bmRzLCBkeCwgZHksIE1hdGgucm91bmQpKTtcbiAgICB9XG4gICAgdGhpcy5yZWRyYXcoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2VsZWN0QXQocHQ6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSwgYWRkaXRpdmUgPSBmYWxzZSk6IHZvaWQge1xuICAgIGNvbnN0IGlkeCA9IHRoaXMucmVnaW9uSW5kZXhBdChwdCk7XG4gICAgLy8gTm90IG9uIGEgcmVnaW9uOiBhIGZlYXR1cmUgb2YgdGhlIHJlZ2lvbiBzb3VyY2UgdGhlcmUgaXMgdGFrZW4gaW50byB0aGUgcmVnaW9ucyBhbmRcbiAgICAvLyBzZWxlY3RlZCAodGhlIHNvdXJjZSBkcmF3cyBpdCB1bnRpbCB0aGVuKS5cbiAgICBjb25zdCBmZWF0dXJlID0gaWR4IDwgMCA/IHRoaXMuc291cmNlTGF5ZXI/LmZlYXR1cmVBdChwdC54LCBwdC55LCBPUEVOX1BBVEhfVE9MX1BYKSA6IG51bGw7XG4gICAgaWYgKGZlYXR1cmUgJiYgdGhpcy5zdG9yZS5zZWxlY3RTb3VyY2VGZWF0dXJlcykge1xuICAgICAgdm9pZCB0aGlzLnN0b3JlLnNlbGVjdFNvdXJjZUZlYXR1cmVzKFtmZWF0dXJlLmlkXSwgYWRkaXRpdmUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoYWRkaXRpdmUpIHtcbiAgICAgIC8vIFNoaWZ0LWNsaWNrIG9uIGVtcHR5IHNwYWNlIGtlZXBzIHRoZSBjdXJyZW50IHNlbGVjdGlvbi5cbiAgICAgIGlmIChpZHggPCAwKSByZXR1cm47XG4gICAgICAvLyBgdGhpcy5zZWxlY3RlZGAgbWlycm9ycyB0aGUgc3RvcmUncyBjdXJyZW50IHNlbGVjdGlvbiAoa2VwdCBpbiBzeW5jIHZpYVxuICAgICAgLy8gdGhlIHN1YnNjcmlwdGlvbiksIHNvIGl0J3MgdGhlIHNvdXJjZSBvZiB0cnV0aCB3aXRob3V0IGEgc3luYyBnZXR0ZXIuXG4gICAgICBjb25zdCBjdXIgPSB0aGlzLnNlbGVjdGVkLnNsaWNlKCk7XG4gICAgICBjb25zdCBhdCA9IGN1ci5pbmRleE9mKGlkeCk7XG4gICAgICBpZiAoYXQgPj0gMClcbiAgICAgICAgY3VyLnNwbGljZShhdCwgMSk7IC8vIHRvZ2dsZSBvZmZcbiAgICAgIGVsc2UgY3VyLnB1c2goaWR4KTsgLy8gdG9nZ2xlIG9uXG4gICAgICB0aGlzLnN0b3JlLnNldFNlbGVjdGVkU2hhcGVJbmRpY2VzKGN1cik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3RvcmUuc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoaWR4ID49IDAgPyBbaWR4XSA6IFtdKTtcbiAgfVxuXG4gIC8qKiBUYWtlIHRoZSByZWdpb24tc291cmNlIGZlYXR1cmVzIHRoZSBiYW5kIG1lZXRzIGludG8gdGhlIHJlZ2lvbnMsIGFkZGluZyB0aGVtIHRvIHRoZSBzZWxlY3Rpb24uICovXG4gIHByaXZhdGUgc2VsZWN0U291cmNlSW4oeDA6IG51bWJlciwgeTA6IG51bWJlciwgeDE6IG51bWJlciwgeTE6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGZlYXR1cmVzID0gdGhpcy5zb3VyY2VMYXllcj8uZmVhdHVyZXNJblJlY3QoeDAsIHkwLCB4MSwgeTEpID8/IFtdO1xuICAgIGlmICghZmVhdHVyZXMubGVuZ3RoIHx8ICF0aGlzLnN0b3JlLnNlbGVjdFNvdXJjZUZlYXR1cmVzKSByZXR1cm47XG4gICAgY29uc3QgaWRzID0gZmVhdHVyZXMuc2xpY2UoMCwgU09VUkNFX01BUlFVRUVfTElNSVQpLm1hcCgoZikgPT4gZi5pZCk7XG4gICAgdm9pZCB0aGlzLnN0b3JlLnNlbGVjdFNvdXJjZUZlYXR1cmVzKGlkcywgdHJ1ZSk7XG4gIH1cblxuICAvKiogSW5kZXggb2YgdGhlIHRvcG1vc3QgcmVnaW9uIHVuZGVyIGFuIGltYWdlIHBvaW50LCBvciAtMS4gKi9cbiAgcHJpdmF0ZSByZWdpb25JbmRleEF0KHB0OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0pOiBudW1iZXIge1xuICAgIGNvbnN0IG9wdHMgPSB7IHRvU2NyZWVuOiB0aGlzLnRvU2NyZWVuLCB0b2xQeDogT1BFTl9QQVRIX1RPTF9QWCwgc2tpcDogKHI6IFJlZ2lvbikgPT4gdGhpcy5oaWRkZW4ocikgfTtcbiAgICByZXR1cm4gdG9wbW9zdFJlZ2lvbkF0KHRoaXMuc3RvcmUuZ2V0UmVnaW9ucygpLCBwdC54LCBwdC55LCBvcHRzKTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIGEgcmVnaW9uJ3MgY2xhc3MgaXMgaGlkZGVuIChub3QgZHJhd24sIG5vdCBwaWNrZWQpLiAqL1xuICBwcml2YXRlIGhpZGRlbihyZWdpb246IFBpY2s8UmVnaW9uLCAnbGFiZWwnPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuc3RvcmUuaXNDbGFzc0hpZGRlbj8uKHJlZ2lvbi5sYWJlbCk7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgZWxlbWVudC1waXhlbCBgcG9zaXRpb25gIGxhbmRzIG9uIGByZWdpb25gIChzZWUgYHJlZ2lvbkNvbnRhaW5zYCkuICovXG4gIHByaXZhdGUgY29udGFpbnNQb2ludChyZWdpb246IFJlZ2lvbiwgcG9zaXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHB0ID0gdGhpcy50b1dvcmxkKHBvc2l0aW9uKTtcbiAgICByZXR1cm4gcmVnaW9uQ29udGFpbnMocmVnaW9uLCBwdC54LCBwdC55LCB7IHRvU2NyZWVuOiB0aGlzLnRvU2NyZWVuLCB0b2xQeDogT1BFTl9QQVRIX1RPTF9QWCB9KTtcbiAgfVxuXG4gIC8qKiBBYmFuZG9uIHdoYXRldmVyIHBvaW50ZXIgZ2VzdHVyZSBpcyBpbiBwcm9ncmVzcyAoZHJhd2luZywgZWRpdCBkcmFnLFxuICAgKiAgcnViYmVyIGJhbmQpIGFuZCBjbG9zZSBpdHMgc3RvcmUgYmF0Y2guICovXG4gIHByaXZhdGUgZW5kR2VzdHVyZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2V0SW5Qcm9ncmVzcygpO1xuICAgIHRoaXMuYmFuZFN0YXJ0ID0gdGhpcy5iYW5kQ3VycmVudCA9IG51bGw7XG4gICAgdGhpcy5iYW5kRHJhZ2dlZCA9IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldEluUHJvZ3Jlc3MoKTogdm9pZCB7XG4gICAgdGhpcy5yZWN0U3RhcnQgPSB0aGlzLnJlY3RDdXJyZW50ID0gbnVsbDtcbiAgICB0aGlzLnBvbHlQb2ludHMgPSBbXTtcbiAgICB0aGlzLmZyZWVoYW5kRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmRyYXdpbmdQb2x5Z29uID0gZmFsc2U7XG4gICAgdGhpcy5sYXN0RnJlZWhhbmRQeCA9IG51bGw7XG4gICAgLy8gQ2xvc2UgYW55IG9wZW4gZWRpdCBiYXRjaCAoZS5nLiBhIG1vZGUgc3dpdGNoIG1pZC1kcmFnKSBzbyB0aGUgc3RvcmUnc1xuICAgIC8vIGVtaXQgY29hbGVzY2luZyBkb2Vzbid0IGdldCBzdHVjay5cbiAgICBpZiAodGhpcy5lZGl0KSB7XG4gICAgICB0aGlzLnN0b3JlLmVuZEJhdGNoKCk7XG4gICAgICB0aGlzLmVkaXQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBjb21taXQgdG8gdGhlIHN0b3JlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBwcml2YXRlIGNvbW1pdFJlY3RhbmdsZSh4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyLCBoOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCByZWdpb24gPSBuZXcgUmVnaW9uKCk7XG4gICAgY29uc3QgcmVjdCA9IG5ldyBSZWN0YW5nbGUoKTtcbiAgICByZWN0LnggPSB4O1xuICAgIHJlY3QueSA9IHk7XG4gICAgcmVjdC53aWR0aCA9IHc7XG4gICAgcmVjdC5oZWlnaHQgPSBoO1xuICAgIHJlZ2lvbi5ib3VuZHMgPSByZWN0O1xuICAgIHJlZ2lvbi5jb2xvciA9IHRoaXMuc3RvcmUuZ2V0U2hhcGVDb2xvcigpO1xuICAgIHRoaXMuY29tbWl0UmVnaW9uKHJlZ2lvbik7XG4gIH1cblxuICBwcml2YXRlIGNvbW1pdFBvbHlnb24oY2xvc2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucG9seVBvaW50cy5sZW5ndGggPCAoY2xvc2VkID8gMyA6IDIpKSB7XG4gICAgICB0aGlzLnJlc2V0SW5Qcm9ncmVzcygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZWdpb24gPSBuZXcgUmVnaW9uKCk7XG4gICAgcmVnaW9uLmJvdW5kcyA9IG1ha2VQb2x5Z29uKFxuICAgICAgdGhpcy5wb2x5UG9pbnRzLm1hcCgocCkgPT4gcC54KSxcbiAgICAgIHRoaXMucG9seVBvaW50cy5tYXAoKHApID0+IHAueSksXG4gICAgICB7IGNsb3NlZCB9LFxuICAgICk7XG4gICAgcmVnaW9uLmNvbG9yID0gdGhpcy5zdG9yZS5nZXRTaGFwZUNvbG9yKCk7XG4gICAgdGhpcy5yZXNldEluUHJvZ3Jlc3MoKTtcbiAgICB0aGlzLmNvbW1pdFJlZ2lvbihyZWdpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGZyZXNobHktZHJhd24gcmVnaW9uIHRvIHRoZSBzaGFyZWQgc3RvcmUgYW5kIHJlZHJhdyBpbW1lZGlhdGVseS4gVGhlXG4gICAqIHN0b3JlIG1pbnRzIHRoZSBpZCwgc2VsZWN0cyB0aGUgbmV3IHJlZ2lvbiAoc28gaXQgcmVuZGVycyBzb2xpZC9oaWdobGlnaHRlZFxuICAgKiByYXRoZXIgdGhhbiBhcyBhIGRhc2hlZCBpbi1wcm9ncmVzcyBzaGFwZSkgYW5kIGVtaXRzIHRoZSBmdWxsIHJlZ2lvbiBsaXN0IHRvXG4gICAqIHRoZSBSZWdpb24gRWRpdG9yIOKAlCB3ZSBzdGlsbCByZWRyYXcgbG9jYWxseSByYXRoZXIgdGhhbiByZWx5aW5nIHNvbGVseSBvblxuICAgKiB0aGUgc3RvcmUncyB1cGRhdGUgZXZlbnQsIHdoaWNoIGNhbiBiZSBzd2FsbG93ZWQgd2hlbiBQbG90bHkgaXNuJ3QgYWN0aXZlLlxuICAgKi9cbiAgcHJpdmF0ZSBjb21taXRSZWdpb24ocmVnaW9uOiBSZWdpb24pOiB2b2lkIHtcbiAgICAvLyBEZWZhdWx0IGNsYXNzL2Fubm90YXRpb24gbmFtZSwgbWF0Y2hpbmcgdGhlIFBsb3RseSBiYWNrZW5kIGFuZCB0aGUgUmVnaW9uXG4gICAgLy8gRWRpdG9yJ3MgXCJBZGRcIiBhY3Rpb25zIHNvIGEgZnJlc2hseSBkcmF3biByZWdpb24gaXNuJ3QgdW5sYWJlbGVkLlxuICAgIGlmIChyZWdpb24ubGFiZWwgPT0gbnVsbCkgcmVnaW9uLmxhYmVsID0gJ1JlZ2lvbic7XG4gICAgdGhpcy5zdG9yZS5hZGRSZWdpb24ocmVnaW9uKTtcbiAgICB0aGlzLnJlZHJhdygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgdGhlIHNlbGVjdGVkIHJlZ2lvbihzKSB0by9mcm9tIGEgYmV6aWVyIGN1cnZlICh0b0JlemllciA9IHRydWUgL1xuICAgKiB0b1BvbHlnb24gPSBmYWxzZSkuIE9uZS1zaG90OyB0aGUgYW5jaG9ycyBhcmUgdW5jaGFuZ2VkLFxuICAgKiBvbmx5IHRoZSBzbW9vdGgtY3VydmUgcmVuZGVyaW5nIGlzIHRvZ2dsZWQuXG4gICAqL1xuICBzZXRTZWxlY3RlZEJlemllcihiZXppZXI6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCByZWdpb25zID0gdGhpcy5zdG9yZS5nZXRSZWdpb25zKCk7XG4gICAgZm9yIChjb25zdCBpZHggb2YgdGhpcy5zZWxlY3RlZCkge1xuICAgICAgY29uc3QgcmVnaW9uID0gcmVnaW9uc1tpZHhdO1xuICAgICAgaWYgKHJlZ2lvbikgdGhpcy5zdG9yZS5zZXRCZXppZXIocmVnaW9uLmlkLCBiZXppZXIpO1xuICAgIH1cbiAgICB0aGlzLnJlZHJhdygpO1xuICB9XG59XG4iXX0=
|