@jax-data-science/sci-image-visualizer 0.17.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 +3 -2
- package/esm2022/lib/contracts/image.contract.mjs +1 -1
- package/esm2022/lib/contracts/ports/spatial-data.port.mjs +1 -1
- package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
- package/esm2022/lib/contracts/region-store.contract.mjs +1 -1
- package/esm2022/lib/contracts/spatial-dataset.contract.mjs +1 -1
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/geometry/cell-meshes.mjs +37 -0
- package/esm2022/lib/geometry/place.mjs +47 -0
- package/esm2022/lib/implementations/napari-js/napari-camera-depth.mjs +93 -0
- package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +2 -2
- package/esm2022/lib/implementations/napari-js/napari-scene.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +81 -15
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-cells.mjs +746 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +325 -18
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-transcripts.mjs +182 -24
- package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +95 -5
- package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +15 -1
- package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +30 -2
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +40 -1
- package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +111 -28
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +14 -2
- package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +180 -48
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +28 -8
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +2 -2
- package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +10 -1
- package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +30 -3
- package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +15 -3
- package/esm2022/lib/region-editor/region-editor.component.mjs +24 -4
- package/esm2022/lib/region-source/region-source-ops.mjs +7 -1
- package/esm2022/lib/region-source/region-tiles.mjs +1 -1
- package/esm2022/lib/region-source/worker-region-source.mjs +24 -1
- package/esm2022/lib/routing-visualizer.service.mjs +404 -7
- package/esm2022/lib/spatial/observations-in-selection.mjs +83 -0
- package/esm2022/lib/spatial/plane-cells.mjs +119 -0
- package/esm2022/lib/spatial/spatial-controls.facade.mjs +298 -5
- package/esm2022/lib/spatial/spatial-encoding.mjs +35 -3
- package/esm2022/lib/spatial/spatial-hover.mjs +34 -1
- package/esm2022/lib/spatial/spatial-planes.mjs +49 -0
- package/esm2022/lib/spatial/spatial-selection.mjs +2 -2
- package/esm2022/lib/spatial/spatial-tile-merge.mjs +38 -1
- package/esm2022/lib/spatial/transcripts-in-selection.mjs +208 -0
- package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +42 -65
- package/esm2022/lib/spatial-controls/spatial-color-by/spatial-color-by.component.mjs +187 -0
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +47 -12
- package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +38 -10
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +79 -57
- package/esm2022/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.mjs +101 -0
- package/esm2022/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.mjs +94 -0
- package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +9 -3
- package/esm2022/lib/store/region-source-scope.mjs +10 -1
- package/esm2022/lib/store/region-store.service.mjs +33 -2
- package/esm2022/lib/toolbar/toolbar.component.mjs +10 -3
- package/esm2022/lib/visualizer/spatial-region-set.mjs +95 -0
- package/esm2022/lib/visualizer.component.mjs +40 -4
- package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DHrHO2ay.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CBiLcnE6.mjs} +4521 -759
- 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-CKEUwNta.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-CKEUwNta.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 +90 -4
- package/lib/contracts/image.contract.d.ts +6 -0
- package/lib/contracts/ports/spatial-data.port.d.ts +7 -0
- package/lib/contracts/region-editor-api.contract.d.ts +9 -0
- package/lib/contracts/region-store.contract.d.ts +6 -0
- package/lib/contracts/spatial-dataset.contract.d.ts +7 -1
- package/lib/contracts/visualizer.contract.d.ts +43 -1
- package/lib/geometry/cell-meshes.d.ts +27 -0
- package/lib/geometry/place.d.ts +45 -0
- package/lib/implementations/napari-js/napari-camera-depth.d.ts +23 -0
- package/lib/implementations/napari-js/napari-loading-state.d.ts +1 -1
- package/lib/implementations/napari-js/napari-scene.d.ts +12 -0
- package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +19 -3
- package/lib/implementations/napari-js/napari-spatial-3d-cells.d.ts +141 -0
- package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +87 -0
- package/lib/implementations/napari-js/napari-spatial-3d-transcripts.d.ts +49 -8
- package/lib/implementations/napari-js/napari-spatial-hover.d.ts +22 -0
- package/lib/implementations/napari-js/napari-spatial-scene.d.ts +12 -0
- package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +15 -0
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +27 -1
- package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +38 -19
- package/lib/implementations/napari-js/napari-volume-scene.d.ts +2 -0
- package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +53 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +11 -2
- package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +7 -0
- package/lib/region-editor/class-tree/class-tree.component.d.ts +16 -1
- package/lib/region-editor/classes-panel/classes-panel.component.d.ts +10 -1
- package/lib/region-editor/region-editor.component.d.ts +4 -0
- package/lib/region-source/region-source-ops.d.ts +12 -0
- package/lib/region-source/region-tiles.d.ts +8 -0
- package/lib/region-source/worker-region-source.d.ts +18 -0
- package/lib/routing-visualizer.service.d.ts +140 -1
- package/lib/spatial/observations-in-selection.d.ts +43 -0
- package/lib/spatial/plane-cells.d.ts +37 -0
- package/lib/spatial/spatial-controls.facade.d.ts +59 -0
- package/lib/spatial/spatial-encoding.d.ts +14 -1
- package/lib/spatial/spatial-hover.d.ts +23 -0
- package/lib/spatial/spatial-planes.d.ts +22 -0
- package/lib/spatial/spatial-selection.d.ts +2 -1
- package/lib/spatial/spatial-tile-merge.d.ts +9 -0
- package/lib/spatial/transcripts-in-selection.d.ts +95 -0
- package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +19 -28
- package/lib/spatial-controls/spatial-color-by/spatial-color-by.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-controls.component.d.ts +17 -2
- package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +16 -6
- package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +26 -23
- package/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.d.ts +48 -0
- package/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.d.ts +43 -0
- package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +3 -1
- package/lib/store/region-source-scope.d.ts +4 -0
- package/lib/store/region-store.service.d.ts +21 -0
- package/lib/toolbar/toolbar.component.d.ts +6 -1
- package/lib/visualizer/spatial-region-set.d.ts +55 -0
- package/lib/visualizer.component.d.ts +14 -0
- package/package.json +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DHrHO2ay.mjs.map +0 -1
|
@@ -147,6 +147,29 @@ export async function openGeoJsonRegionSource(text, client = sharedRegionSourceC
|
|
|
147
147
|
const { handle, info } = opened.result;
|
|
148
148
|
return new WorkerRegionSource(client, text, handle, opened.generation, info);
|
|
149
149
|
}
|
|
150
|
+
let cellsClient = null;
|
|
151
|
+
/**
|
|
152
|
+
* The worker client cells are meshed on: a worker of its own, so a few thousand cells meshing does
|
|
153
|
+
* not hold up the region tiles the 2D views read from the shared one.
|
|
154
|
+
*/
|
|
155
|
+
export function cellsWorkerClient() {
|
|
156
|
+
return (cellsClient ??= new RegionSourceWorkerClient());
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* A 3D segmentation's cells, each meshed by itself (see `geometry/cell-meshes`), in the cells'
|
|
160
|
+
* worker (on the main thread where there is none). Batch them: one call meshes its cells in one go.
|
|
161
|
+
*/
|
|
162
|
+
export function reconstructCellsInWorker(cells, options, client = cellsWorkerClient()) {
|
|
163
|
+
return client.call({ op: 'cells', cells, options });
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* A mesh's vertices placed in a 3D view's world (see `geometry/place`), in the cells' worker: a
|
|
167
|
+
* class's surface has hundreds of thousands, and placing every surface on the main thread held it
|
|
168
|
+
* for seconds.
|
|
169
|
+
*/
|
|
170
|
+
export function placeInWorker(vertices, frame, client = cellsWorkerClient()) {
|
|
171
|
+
return client.call({ op: 'place', vertices, frame });
|
|
172
|
+
}
|
|
150
173
|
/**
|
|
151
174
|
* The 3D reconstruction of a region from its outlines on a stack (see `geometry/reconstruct`),
|
|
152
175
|
* meshed in the region-source worker (on the main thread where there is none).
|
|
@@ -226,4 +249,4 @@ class WorkerRegionSource {
|
|
|
226
249
|
return this.reopening;
|
|
227
250
|
}
|
|
228
251
|
}
|
|
229
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2VyLXJlZ2lvbi1zb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlZ2lvbi1zb3VyY2Uvd29ya2VyLXJlZ2lvbi1zb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUNILE9BQU8sRUFBZ0IsZUFBZSxFQUFpQixTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxRixPQUFPLEVBS0wsa0JBQWtCLEdBQ25CLE1BQU0scUJBQXFCLENBQUM7QUFlN0IsNEVBQTRFO0FBQzVFLE1BQU0sZUFBZ0IsU0FBUSxLQUFLO0lBQ2pDO1FBQ0UsS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQztJQUNoQyxDQUFDO0NBQ0Y7QUFPRCxtRUFBbUU7QUFDbkUsTUFBTSxPQUFPLHdCQUF3QjtJQVVuQzs7OztPQUlHO0lBQ0gsWUFBNkIsT0FBbUM7UUFBbkMsWUFBTyxHQUFQLE9BQU8sQ0FBNEI7UUFkeEQsV0FBTSxHQUFrQixJQUFJLENBQUM7UUFDN0IsYUFBUSxHQUFrQyxJQUFJLENBQUM7UUFDL0MsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDcEIsV0FBTSxHQUFHLENBQUMsQ0FBQztRQUNGLFlBQU8sR0FBRyxJQUFJLEdBQUcsRUFBdUIsQ0FBQztRQUMxRCx1REFBdUQ7UUFDL0MsVUFBSyxHQUE4QixJQUFJLENBQUM7UUFDeEMsV0FBTSxHQUFHLENBQUMsQ0FBQztJQU9nRCxDQUFDO0lBRXBFLGdEQUFnRDtJQUNoRCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRUQsK0RBQStEO0lBQy9ELEtBQUssQ0FBQyxJQUFJLENBQWdDLE9BQVU7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SUFDSCxDQUFDO0lBRUQsaUdBQWlHO0lBQ3pGLE1BQU07UUFDWixJQUFJLENBQUMsU0FBUyxLQUFLLElBQUksQ0FBQyxNQUFNO2FBQzNCLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUNwQyxJQUFJLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFO1lBQy9CLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUM1QixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUMvQixDQUFDLENBQUM7YUFDRCxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDMUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSB7QGxpbmsgUmVnaW9uU291cmNlfSBvdmVyIGEgR2VvSlNPTiBzdHJpbmcsIHBhcnNlZCBhbmQgdGlsZWQgaW4gdGhlIHJlZ2lvbi1zb3VyY2UgV2ViIFdvcmtlci5cbiAqXG4gKiBPbmUgd29ya2VyIHNlcnZlcyBldmVyeSBvcGVuIHNvdXJjZS4gV2hlcmUgbm8gd29ya2VyIGNhbiBzdGFydCAoanNkb20sIFNTUiwgYSBibG9ja2VkIHdvcmtlclxuICogVVJMKSB0aGUgc2FtZSB0YWJsZXMgcnVuIG9uIHRoZSBtYWluIHRocmVhZDsgaWYgdGhlIHdvcmtlciBkaWVzLCBlYWNoIHNvdXJjZSByZS1vcGVucyBpdHNlbGZcbiAqIHRoZXJlIGZyb20gaXRzIHRleHQgKHdoaWNoIHRoZSBob3N0IGhvbGRzIGFueXdheTogaXQgaGFuZGVkIGl0IG92ZXIpIGFuZCBjYXJyaWVzIG9uIOKAlCB3aGV0aGVyXG4gKiBpdCBoYWQgYSBjYWxsIGluIGZsaWdodCB0aGVuIG9yIG5vdCAoc2VlIHtAbGluayBSZWdpb25Tb3VyY2VXb3JrZXJDbGllbnQuZ2VuZXJhdGlvbn0pLlxuICovXG5pbXBvcnQgeyBSZWdpb25Tb3VyY2UsIFJlZ2lvblRpbGVDYWNoZSwgU291cmNlRmVhdHVyZSwgYWJvcnRhYmxlIH0gZnJvbSAnLi9yZWdpb24tc291cmNlJztcbmltcG9ydCB7XG4gIFJlZ2lvblNvdXJjZU1lc3NhZ2UsXG4gIFJlZ2lvblNvdXJjZVJlcGx5LFxuICBSZWdpb25Tb3VyY2VSZXF1ZXN0LFxuICBSZWdpb25Tb3VyY2VSZXN1bHRzLFxuICBSZWdpb25Tb3VyY2VUYWJsZXMsXG59IGZyb20gJy4vcmVnaW9uLXNvdXJjZS1vcHMnO1xuaW1wb3J0IHR5cGUge1xuICBDbGFzc091dGxpbmVzLFxuICBSZWdpb25JbmRleFBhZ2UsXG4gIFJlZ2lvbkluZGV4UXVlcnksXG4gIFJlZ2lvblNvdXJjZUluZm8sXG4gIFJlZ2lvblRpbGUsXG4gIFJlZ2lvblRpbGVLZXksXG59IGZyb20gJy4vcmVnaW9uLXRpbGVzJztcbmltcG9ydCB0eXBlIHsgUmVjb25zdHJ1Y3RPcHRpb25zLCBTbGljZU91dGxpbmVzIH0gZnJvbSAnLi4vZ2VvbWV0cnkvcmVjb25zdHJ1Y3QnO1xuaW1wb3J0IHR5cGUgeyBNZXNoIH0gZnJvbSAnbmFwYXJpLWpzL2dlb21ldHJ5JztcblxuLyoqIE1ha2VzIHRoZSB3b3JrZXI7IG1heSBiZSBhc3luYywgYXMgdGhlIGRlZmF1bHQgb25lIGlzIChpdCBpbXBvcnRzIHRoZSBmYWN0b3J5IG9uIGRlbWFuZCkuICovXG5leHBvcnQgdHlwZSBSZWdpb25Tb3VyY2VXb3JrZXJGYWN0b3J5ID0gKCkgPT4gV29ya2VyIHwgUHJvbWlzZTxXb3JrZXI+O1xuXG4vKiogVGhlIHdvcmtlciBkaWVkIHVuZGVyIGEgY2FsbDsgdGhlIGNhbGxlciByZS1vcGVucyBvbiB0aGUgbWFpbiB0aHJlYWQuICovXG5jbGFzcyBXb3JrZXJMb3N0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCdUaGUgcmVnaW9uLXNvdXJjZSB3b3JrZXIgc3RvcHBlZC4nKTtcbiAgICB0aGlzLm5hbWUgPSAnV29ya2VyTG9zdEVycm9yJztcbiAgfVxufVxuXG5pbnRlcmZhY2UgUGVuZGluZ0NhbGwge1xuICByZXNvbHZlOiAodmFsdWU6IHVua25vd24pID0+IHZvaWQ7XG4gIHJlamVjdDogKHJlYXNvbjogdW5rbm93bikgPT4gdm9pZDtcbn1cblxuLyoqIE93bnMgdGhlIHJlZ2lvbi1zb3VyY2Ugd29ya2VyIGFuZCB0aGUgY2FsbHMgaW4gZmxpZ2h0IG9uIGl0LiAqL1xuZXhwb3J0IGNsYXNzIFJlZ2lvblNvdXJjZVdvcmtlckNsaWVudCB7XG4gIHByaXZhdGUgd29ya2VyOiBXb3JrZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzdGFydGluZzogUHJvbWlzZTxXb3JrZXIgfCBudWxsPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHVuYXZhaWxhYmxlID0gZmFsc2U7XG4gIHByaXZhdGUgbmV4dElkID0gMTtcbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nID0gbmV3IE1hcDxudW1iZXIsIFBlbmRpbmdDYWxsPigpO1xuICAvKiogVGhlIG1haW4tdGhyZWFkIHRhYmxlcywgb25jZSBhbnl0aGluZyBydW5zIGhlcmUuICovXG4gIHByaXZhdGUgbG9jYWw6IFJlZ2lvblNvdXJjZVRhYmxlcyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHRhYmxlcyA9IDA7XG5cbiAgLyoqXG4gICAqIGBmYWN0b3J5YCBpcyBvcHRpb25hbDogd2l0aG91dCBvbmUgdGhlIHJlYWwgd29ya2VyIG1vZHVsZSBpcyBpbXBvcnRlZCBvbiBkZW1hbmQg4oCUXG4gICAqIGR5bmFtaWNhbGx5LCBiZWNhdXNlIGl0IGhvbGRzIGFuIGBpbXBvcnQubWV0YS51cmxgIHRoYXQgdHMtamVzdCdzIENvbW1vbkpTIGNvbXBpbGVcbiAgICogcmVqZWN0cy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZmFjdG9yeT86IFJlZ2lvblNvdXJjZVdvcmtlckZhY3RvcnkpIHt9XG5cbiAgLyoqIFdoZXRoZXIgY2FsbHMgbm93IHJ1biBvbiB0aGUgbWFpbiB0aHJlYWQuICovXG4gIGdldCBpblRocmVhZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy51bmF2YWlsYWJsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGljaCB0YWJsZSBzZXQgY2FsbHMgcnVuIG9uOiBidW1wZWQgd2hlbiB0aGUgd29ya2VyIGlzIGxvc3QuIEEgaGFuZGxlIG9wZW5lZCB1bmRlciBhbm90aGVyXG4gICAqIG5hbWVzIGEgdGFibGUgdGhhdCBpcyBnb25lIChvciwgaGVyZSwgYW5vdGhlciBzb3VyY2UncyksIHNvIGl0cyBzb3VyY2UgbXVzdCBvcGVuIGFnYWluLlxuICAgKi9cbiAgZ2V0IGdlbmVyYXRpb24oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy50YWJsZXM7XG4gIH1cblxuICAvKiogUnVuIGByZXF1ZXN0YCBpbiB0aGUgd29ya2VyLCBvciBoZXJlIHdoZW4gdGhlcmUgaXMgbm9uZS4gKi9cbiAgYXN5bmMgY2FsbDxSIGV4dGVuZHMgUmVnaW9uU291cmNlUmVxdWVzdD4ocmVxdWVzdDogUik6IFByb21pc2U8UmVnaW9uU291cmNlUmVzdWx0c1tSWydvcCddXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5ydW4ocmVxdWVzdCkpLnJlc3VsdDtcbiAgfVxuXG4gIC8qKiB7QGxpbmsgY2FsbH0sIHdpdGggdGhlIHtAbGluayBnZW5lcmF0aW9ufSB0aGUgcmVxdWVzdCByYW4gb24uICovXG4gIGFzeW5jIHJ1bjxSIGV4dGVuZHMgUmVnaW9uU291cmNlUmVxdWVzdD4oXG4gICAgcmVxdWVzdDogUixcbiAgKTogUHJvbWlzZTx7IHJlc3VsdDogUmVnaW9uU291cmNlUmVzdWx0c1tSWydvcCddXTsgZ2VuZXJhdGlvbjogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBzdGFydGVkID0gYXdhaXQgdGhpcy5lbnN1cmVXb3JrZXIoKTtcbiAgICAvLyBUaGUgd29ya2VyIG1heSBoYXZlIGJlZW4gbG9zdCB3aGlsZSB0aGlzIHdhaXRlZCBmb3IgaXQuXG4gICAgY29uc3Qgd29ya2VyID0gc3RhcnRlZCA9PT0gdGhpcy53b3JrZXIgPyBzdGFydGVkIDogbnVsbDtcbiAgICBjb25zdCBnZW5lcmF0aW9uID0gdGhpcy50YWJsZXM7XG4gICAgaWYgKCF3b3JrZXIpIHJldHVybiB7IHJlc3VsdDogKHRoaXMubG9jYWwgPz89IG5ldyBSZWdpb25Tb3VyY2VUYWJsZXMoKSkucnVuKHJlcXVlc3QpLCBnZW5lcmF0aW9uIH07XG4gICAgY29uc3QgaWQgPSB0aGlzLm5leHRJZCsrO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG5ldyBQcm9taXNlPFJlZ2lvblNvdXJjZVJlc3VsdHNbUlsnb3AnXV0+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMucGVuZGluZy5zZXQoaWQsIHsgcmVzb2x2ZTogcmVzb2x2ZSBhcyAodjogdW5rbm93bikgPT4gdm9pZCwgcmVqZWN0IH0pO1xuICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHsgLi4ucmVxdWVzdCwgaWQgfSBhcyBSZWdpb25Tb3VyY2VNZXNzYWdlKTtcbiAgICB9KTtcbiAgICByZXR1cm4geyByZXN1bHQsIGdlbmVyYXRpb24gfTtcbiAgfVxuXG4gIC8qKiBUZXJtaW5hdGUgdGhlIHdvcmtlcjsgY2FsbHMgaW4gZmxpZ2h0IHJlamVjdC4gKi9cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmxvc2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlV29ya2VyKCk6IFByb21pc2U8V29ya2VyIHwgbnVsbD4ge1xuICAgIGlmICh0aGlzLndvcmtlcikgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLndvcmtlcik7XG4gICAgaWYgKHRoaXMudW5hdmFpbGFibGUgfHwgKCF0aGlzLmZhY3RvcnkgJiYgdHlwZW9mIFdvcmtlciA9PT0gJ3VuZGVmaW5lZCcpKSB7XG4gICAgICB0aGlzLnVuYXZhaWxhYmxlID0gdHJ1ZTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5zdGFydGluZykge1xuICAgICAgY29uc3Qgc3RhcnRpbmcgPSB0aGlzLnN0YXJ0V29ya2VyKCk7XG4gICAgICB0aGlzLnN0YXJ0aW5nID0gc3RhcnRpbmc7XG4gICAgICB2b2lkIHN0YXJ0aW5nLnRoZW4oKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5zdGFydGluZyA9PT0gc3RhcnRpbmcpIHRoaXMuc3RhcnRpbmcgPSBudWxsO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YXJ0aW5nO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzdGFydFdvcmtlcigpOiBQcm9taXNlPFdvcmtlciB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbWFkZSA9IHRoaXMuZmFjdG9yeVxuICAgICAgICA/IHRoaXMuZmFjdG9yeSgpXG4gICAgICAgIDogaW1wb3J0KCcuL3JlZ2lvbi1zb3VyY2Utd29ya2VyJykudGhlbigobSkgPT4gbS5jcmVhdGVSZWdpb25Tb3VyY2VXb3JrZXIoKSk7XG4gICAgICBjb25zdCB3b3JrZXIgPSBtYWRlIGluc3RhbmNlb2YgUHJvbWlzZSA/IGF3YWl0IG1hZGUgOiBtYWRlO1xuICAgICAgd29ya2VyLm9ubWVzc2FnZSA9IChldmVudDogTWVzc2FnZUV2ZW50PFJlZ2lvblNvdXJjZVJlcGx5PikgPT4gdGhpcy5vblJlcGx5KGV2ZW50LmRhdGEpO1xuICAgICAgd29ya2VyLm9uZXJyb3IgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0Py4oKTtcbiAgICAgICAgaWYgKHdvcmtlciA9PT0gdGhpcy53b3JrZXIpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1tyZWdpb24tc291cmNlXSB3b3JrZXIgZmFpbGVkOyB0aWxpbmcgb24gdGhlIG1haW4gdGhyZWFkJyk7XG4gICAgICAgICAgdGhpcy5sb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB0aGlzLndvcmtlciA9IHdvcmtlcjtcbiAgICAgIHJldHVybiB3b3JrZXI7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tyZWdpb24tc291cmNlXSB3b3JrZXIgdW5hdmFpbGFibGU7IHRpbGluZyBvbiB0aGUgbWFpbiB0aHJlYWQnLCBlcnIpO1xuICAgICAgdGhpcy51bmF2YWlsYWJsZSA9IHRydWU7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uUmVwbHkocmVwbHk6IFJlZ2lvblNvdXJjZVJlcGx5KTogdm9pZCB7XG4gICAgY29uc3QgY2FsbCA9IHRoaXMucGVuZGluZy5nZXQocmVwbHkuaWQpO1xuICAgIGlmICghY2FsbCkgcmV0dXJuO1xuICAgIHRoaXMucGVuZGluZy5kZWxldGUocmVwbHkuaWQpO1xuICAgIGlmIChyZXBseS5vaykgY2FsbC5yZXNvbHZlKHJlcGx5LnJlc3VsdCk7XG4gICAgZWxzZSBjYWxsLnJlamVjdChuZXcgRXJyb3IocmVwbHkuZXJyb3IpKTtcbiAgfVxuXG4gIC8qKiBTdG9wIHRoZSB3b3JrZXIgZm9yIGdvb2Q6IGV2ZXJ5IGxhdGVyIGNhbGwgcnVucyBoZXJlLCBldmVyeSBjYWxsIGluIGZsaWdodCBpcyBsb3N0LiAqL1xuICBwcml2YXRlIGxvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMud29ya2VyKSB0aGlzLnRhYmxlcysrO1xuICAgIHRoaXMudW5hdmFpbGFibGUgPSB0cnVlO1xuICAgIHRoaXMud29ya2VyPy50ZXJtaW5hdGUoKTtcbiAgICB0aGlzLndvcmtlciA9IG51bGw7XG4gICAgY29uc3QgY2FsbHMgPSBbLi4udGhpcy5wZW5kaW5nLnZhbHVlcygpXTtcbiAgICB0aGlzLnBlbmRpbmcuY2xlYXIoKTtcbiAgICBmb3IgKGNvbnN0IGNhbGwgb2YgY2FsbHMpIGNhbGwucmVqZWN0KG5ldyBXb3JrZXJMb3N0RXJyb3IoKSk7XG4gIH1cbn1cblxubGV0IHNoYXJlZDogUmVnaW9uU291cmNlV29ya2VyQ2xpZW50IHwgbnVsbCA9IG51bGw7XG5cbi8qKiBUaGUgd29ya2VyIGNsaWVudCBldmVyeSBHZW9KU09OIHNvdXJjZSBzaGFyZXMuICovXG5leHBvcnQgZnVuY3Rpb24gc2hhcmVkUmVnaW9uU291cmNlQ2xpZW50KCk6IFJlZ2lvblNvdXJjZVdvcmtlckNsaWVudCB7XG4gIHJldHVybiAoc2hhcmVkID8/PSBuZXcgUmVnaW9uU291cmNlV29ya2VyQ2xpZW50KCkpO1xufVxuXG4vKipcbiAqIE9wZW4gYSBHZW9KU09OIEZlYXR1cmVDb2xsZWN0aW9uIHN0cmluZyBhcyBhIHRpbGVkIHJlZ2lvbiBzb3VyY2UuIFJlamVjdHMgb24gaW52YWxpZCBKU09OIG9yXG4gKiBhIGNvbGxlY3Rpb24gd2l0aG91dCBgZmVhdHVyZXNgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb3Blbkdlb0pzb25SZWdpb25Tb3VyY2UoXG4gIHRleHQ6IHN0cmluZyxcbiAgY2xpZW50OiBSZWdpb25Tb3VyY2VXb3JrZXJDbGllbnQgPSBzaGFyZWRSZWdpb25Tb3VyY2VDbGllbnQoKSxcbik6IFByb21pc2U8UmVnaW9uU291cmNlPiB7XG4gIC8vIFRoZSB3b3JrZXIgbG9zdCB1bmRlciB0aGUgb3Blbjogb3BlbiBvbiB0aGUgbWFpbiB0aHJlYWQgaW5zdGVhZC5cbiAgY29uc3Qgb3BlbmVkID0gYXdhaXQgY2xpZW50XG4gICAgLnJ1bih7IG9wOiAnb3BlbicsIHRleHQgfSlcbiAgICAuY2F0Y2goKGVycikgPT4gKGVyciBpbnN0YW5jZW9mIFdvcmtlckxvc3RFcnJvciA/IGNsaWVudC5ydW4oeyBvcDogJ29wZW4nLCB0ZXh0IH0pIDogUHJvbWlzZS5yZWplY3QoZXJyKSkpO1xuICBjb25zdCB7IGhhbmRsZSwgaW5mbyB9ID0gb3BlbmVkLnJlc3VsdDtcbiAgcmV0dXJuIG5ldyBXb3JrZXJSZWdpb25Tb3VyY2UoY2xpZW50LCB0ZXh0LCBoYW5kbGUsIG9wZW5lZC5nZW5lcmF0aW9uLCBpbmZvKTtcbn1cblxuLyoqXG4gKiBUaGUgM0QgcmVjb25zdHJ1Y3Rpb24gb2YgYSByZWdpb24gZnJvbSBpdHMgb3V0bGluZXMgb24gYSBzdGFjayAoc2VlIGBnZW9tZXRyeS9yZWNvbnN0cnVjdGApLFxuICogbWVzaGVkIGluIHRoZSByZWdpb24tc291cmNlIHdvcmtlciAob24gdGhlIG1haW4gdGhyZWFkIHdoZXJlIHRoZXJlIGlzIG5vbmUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb25zdHJ1Y3RJbldvcmtlcihcbiAgc2xpY2VzOiByZWFkb25seSBTbGljZU91dGxpbmVzW10sXG4gIG9wdGlvbnM/OiBSZWNvbnN0cnVjdE9wdGlvbnMsXG4gIGNsaWVudDogUmVnaW9uU291cmNlV29ya2VyQ2xpZW50ID0gc2hhcmVkUmVnaW9uU291cmNlQ2xpZW50KCksXG4pOiBQcm9taXNlPE1lc2g+IHtcbiAgcmV0dXJuIGNsaWVudC5jYWxsKHsgb3A6ICdtZXNoJywgc2xpY2VzLCBvcHRpb25zIH0pO1xufVxuXG5jbGFzcyBXb3JrZXJSZWdpb25Tb3VyY2UgaW1wbGVtZW50cyBSZWdpb25Tb3VyY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGNhY2hlID0gbmV3IFJlZ2lvblRpbGVDYWNoZSgpO1xuICBwcml2YXRlIGRpc3Bvc2VkID0gZmFsc2U7XG4gIC8qKiBUaGUgbWFpbi10aHJlYWQgcmUtb3BlbiBhZnRlciB0aGUgd29ya2VyIGRpZWQsIHNoYXJlZCBieSBldmVyeSBjYWxsIHRoYXQgZmluZHMgaXQgc28uICovXG4gIHByaXZhdGUgcmVvcGVuaW5nOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ6IFJlZ2lvblNvdXJjZVdvcmtlckNsaWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRleHQ6IHN0cmluZyxcbiAgICBwcml2YXRlIGhhbmRsZTogbnVtYmVyLFxuICAgIC8qKiBUaGUgY2xpZW50J3Mge0BsaW5rIFJlZ2lvblNvdXJjZVdvcmtlckNsaWVudC5nZW5lcmF0aW9ufSB7QGxpbmsgaGFuZGxlfSB3YXMgb3BlbmVkIHVuZGVyLiAqL1xuICAgIHByaXZhdGUgZ2VuZXJhdGlvbjogbnVtYmVyLFxuICAgIHJlYWRvbmx5IGluZm86IFJlZ2lvblNvdXJjZUluZm8sXG4gICkge31cblxuICBnZXRUaWxlKHo6IG51bWJlciwga2V5OiBSZWdpb25UaWxlS2V5LCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8UmVnaW9uVGlsZT4ge1xuICAgIGNvbnN0IHRpbGUgPSB0aGlzLmNhY2hlLmdldCh6LCBrZXksICgpID0+XG4gICAgICB0aGlzLmNhbGwoKGhhbmRsZSkgPT4gKHsgb3A6ICd0aWxlJywgaGFuZGxlLCB6LCBsZXZlbDoga2V5LmxldmVsLCBneDoga2V5Lmd4LCBneToga2V5Lmd5IH0pKSxcbiAgICApO1xuICAgIHJldHVybiBhYm9ydGFibGUodGlsZSwgc2lnbmFsKTtcbiAgfVxuXG4gIGdldEZlYXR1cmVzKGlkczogcmVhZG9ubHkgc3RyaW5nW10pOiBQcm9taXNlPFNvdXJjZUZlYXR1cmVbXT4ge1xuICAgIHJldHVybiB0aGlzLmNhbGwoKGhhbmRsZSkgPT4gKHsgb3A6ICdmZWF0dXJlcycsIGhhbmRsZSwgaWRzIH0pKTtcbiAgfVxuXG4gIGdldEluZGV4KHo6IG51bWJlciwgcXVlcnk6IFJlZ2lvbkluZGV4UXVlcnkpOiBQcm9taXNlPFJlZ2lvbkluZGV4UGFnZT4ge1xuICAgIHJldHVybiB0aGlzLmNhbGwoKGhhbmRsZSkgPT4gKHsgb3A6ICdpbmRleCcsIGhhbmRsZSwgeiwgcXVlcnkgfSkpO1xuICB9XG5cbiAgZ2V0Q2xhc3NPdXRsaW5lcyhcbiAgICBjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSB8IG51bGwsXG4gICAgbGV2ZWw6IG51bWJlcixcbiAgICBleGNsdWRlPzogcmVhZG9ubHkgc3RyaW5nW10sXG4gICk6IFByb21pc2U8Q2xhc3NPdXRsaW5lc1tdPiB7XG4gICAgcmV0dXJuIHRoaXMuY2FsbCgoaGFuZGxlKSA9PiAoeyBvcDogJ291dGxpbmVzJywgaGFuZGxlLCBjbGFzc2VzLCBsZXZlbCwgZXhjbHVkZSB9KSk7XG4gIH1cblxuICBnZXRDbGFzc0NvdW50cyh6OiBudW1iZXIgfCBudWxsLCBleGNsdWRlPzogcmVhZG9ubHkgc3RyaW5nW10pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIG51bWJlcj4+IHtcbiAgICByZXR1cm4gdGhpcy5jYWxsKChoYW5kbGUpID0+ICh7IG9wOiAnY2xhc3NlcycsIGhhbmRsZSwgeiwgZXhjbHVkZSB9KSk7XG4gIH1cblxuICBleHBvcnRHZW9Kc29uKGV4Y2x1ZGU6IHJlYWRvbmx5IHN0cmluZ1tdLCBleHRyYTogcmVhZG9ubHkgb2JqZWN0W10pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmNhbGwoKGhhbmRsZSkgPT4gKHsgb3A6ICdleHBvcnQnLCBoYW5kbGUsIGV4Y2x1ZGUsIGV4dHJhIH0pKTtcbiAgfVxuXG4gIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcbiAgICB0aGlzLmRpc3Bvc2VkID0gdHJ1ZTtcbiAgICB0aGlzLmNhY2hlLmNsZWFyKCk7XG4gICAgLy8gQSBoYW5kbGUgZnJvbSBhIGxvc3Qgd29ya2VyJ3MgdGFibGVzIG5hbWVzIG5vdGhpbmcgaGVyZSwgb3IgYW5vdGhlciBzb3VyY2UncyB0YWJsZS5cbiAgICBpZiAodGhpcy5nZW5lcmF0aW9uICE9PSB0aGlzLmNsaWVudC5nZW5lcmF0aW9uKSByZXR1cm47XG4gICAgdm9pZCB0aGlzLmNsaWVudC5jYWxsKHsgb3A6ICdjbG9zZScsIGhhbmRsZTogdGhpcy5oYW5kbGUgfSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gYSByZXF1ZXN0IG9uIHRoaXMgc291cmNlJ3MgdGFibGU7IHdoZW4gdGhlIHdvcmtlciBkaWVkICh1bmRlciB0aGlzIGNhbGwgb3IgYmVmb3JlIGl0KSxcbiAgICogcmUtb3BlbiBoZXJlIGFuZCBydW4gaXQgdGhlcmUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNhbGw8UiBleHRlbmRzIFJlZ2lvblNvdXJjZVJlcXVlc3Q+KFxuICAgIG1ha2U6IChoYW5kbGU6IG51bWJlcikgPT4gUixcbiAgKTogUHJvbWlzZTxSZWdpb25Tb3VyY2VSZXN1bHRzW1JbJ29wJ11dPiB7XG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IDsgYXR0ZW1wdCsrKSB7XG4gICAgICBpZiAodGhpcy5nZW5lcmF0aW9uICE9PSB0aGlzLmNsaWVudC5nZW5lcmF0aW9uKSBhd2FpdCB0aGlzLnJlb3BlbigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwobWFrZSh0aGlzLmhhbmRsZSkpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmICghKGVyciBpbnN0YW5jZW9mIFdvcmtlckxvc3RFcnJvcikgfHwgYXR0ZW1wdCA+IDApIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogT3BlbiB0aGlzIHNvdXJjZSdzIHRleHQgYWdhaW4gb24gdGhlIGNsaWVudCdzIGN1cnJlbnQgdGFibGVzLCBvbmNlIGZvciBldmVyeSBjYWxsIHdhaXRpbmcuICovXG4gIHByaXZhdGUgcmVvcGVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucmVvcGVuaW5nID8/PSB0aGlzLmNsaWVudFxuICAgICAgLnJ1bih7IG9wOiAnb3BlbicsIHRleHQ6IHRoaXMudGV4dCB9KVxuICAgICAgLnRoZW4oKHsgcmVzdWx0LCBnZW5lcmF0aW9uIH0pID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGUgPSByZXN1bHQuaGFuZGxlO1xuICAgICAgICB0aGlzLmdlbmVyYXRpb24gPSBnZW5lcmF0aW9uO1xuICAgICAgfSlcbiAgICAgIC5maW5hbGx5KCgpID0+ICh0aGlzLnJlb3BlbmluZyA9IG51bGwpKTtcbiAgICByZXR1cm4gdGhpcy5yZW9wZW5pbmc7XG4gIH1cbn1cbiJdfQ==
|
|
252
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2VyLXJlZ2lvbi1zb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlZ2lvbi1zb3VyY2Uvd29ya2VyLXJlZ2lvbi1zb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUNILE9BQU8sRUFBZ0IsZUFBZSxFQUFpQixTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxRixPQUFPLEVBS0wsa0JBQWtCLEdBQ25CLE1BQU0scUJBQXFCLENBQUM7QUFpQjdCLDRFQUE0RTtBQUM1RSxNQUFNLGVBQWdCLFNBQVEsS0FBSztJQUNqQztRQUNFLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxJQUFJLEdBQUcsaUJBQWlCLENBQUM7SUFDaEMsQ0FBQztDQUNGO0FBT0QsbUVBQW1FO0FBQ25FLE1BQU0sT0FBTyx3QkFBd0I7SUFVbkM7Ozs7T0FJRztJQUNILFlBQTZCLE9BQW1DO1FBQW5DLFlBQU8sR0FBUCxPQUFPLENBQTRCO1FBZHhELFdBQU0sR0FBa0IsSUFBSSxDQUFDO1FBQzdCLGFBQVEsR0FBa0MsSUFBSSxDQUFDO1FBQy9DLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLFdBQU0sR0FBRyxDQUFDLENBQUM7UUFDRixZQUFPLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7UUFDMUQsdURBQXVEO1FBQy9DLFVBQUssR0FBOEIsSUFBSSxDQUFDO1FBQ3hDLFdBQU0sR0FBRyxDQUFDLENBQUM7SUFPZ0QsQ0FBQztJQUVwRSxnREFBZ0Q7SUFDaEQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUVELCtEQUErRDtJQUMvRCxLQUFLLENBQUMsSUFBSSxDQUFnQyxPQUFV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eEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBIHtAbGluayBSZWdpb25Tb3VyY2V9IG92ZXIgYSBHZW9KU09OIHN0cmluZywgcGFyc2VkIGFuZCB0aWxlZCBpbiB0aGUgcmVnaW9uLXNvdXJjZSBXZWIgV29ya2VyLlxuICpcbiAqIE9uZSB3b3JrZXIgc2VydmVzIGV2ZXJ5IG9wZW4gc291cmNlLiBXaGVyZSBubyB3b3JrZXIgY2FuIHN0YXJ0IChqc2RvbSwgU1NSLCBhIGJsb2NrZWQgd29ya2VyXG4gKiBVUkwpIHRoZSBzYW1lIHRhYmxlcyBydW4gb24gdGhlIG1haW4gdGhyZWFkOyBpZiB0aGUgd29ya2VyIGRpZXMsIGVhY2ggc291cmNlIHJlLW9wZW5zIGl0c2VsZlxuICogdGhlcmUgZnJvbSBpdHMgdGV4dCAod2hpY2ggdGhlIGhvc3QgaG9sZHMgYW55d2F5OiBpdCBoYW5kZWQgaXQgb3ZlcikgYW5kIGNhcnJpZXMgb24g4oCUIHdoZXRoZXJcbiAqIGl0IGhhZCBhIGNhbGwgaW4gZmxpZ2h0IHRoZW4gb3Igbm90IChzZWUge0BsaW5rIFJlZ2lvblNvdXJjZVdvcmtlckNsaWVudC5nZW5lcmF0aW9ufSkuXG4gKi9cbmltcG9ydCB7IFJlZ2lvblNvdXJjZSwgUmVnaW9uVGlsZUNhY2hlLCBTb3VyY2VGZWF0dXJlLCBhYm9ydGFibGUgfSBmcm9tICcuL3JlZ2lvbi1zb3VyY2UnO1xuaW1wb3J0IHtcbiAgUmVnaW9uU291cmNlTWVzc2FnZSxcbiAgUmVnaW9uU291cmNlUmVwbHksXG4gIFJlZ2lvblNvdXJjZVJlcXVlc3QsXG4gIFJlZ2lvblNvdXJjZVJlc3VsdHMsXG4gIFJlZ2lvblNvdXJjZVRhYmxlcyxcbn0gZnJvbSAnLi9yZWdpb24tc291cmNlLW9wcyc7XG5pbXBvcnQgdHlwZSB7XG4gIENsYXNzT3V0bGluZXMsXG4gIFJlZ2lvbkluZGV4UGFnZSxcbiAgUmVnaW9uSW5kZXhRdWVyeSxcbiAgUmVnaW9uU291cmNlSW5mbyxcbiAgUmVnaW9uVGlsZSxcbiAgUmVnaW9uVGlsZUtleSxcbn0gZnJvbSAnLi9yZWdpb24tdGlsZXMnO1xuaW1wb3J0IHR5cGUgeyBSZWNvbnN0cnVjdE9wdGlvbnMsIFNsaWNlT3V0bGluZXMgfSBmcm9tICcuLi9nZW9tZXRyeS9yZWNvbnN0cnVjdCc7XG5pbXBvcnQgdHlwZSB7IENlbGxPdXRsaW5lcywgQ2VsbHNNZXNoIH0gZnJvbSAnLi4vZ2VvbWV0cnkvY2VsbC1tZXNoZXMnO1xuaW1wb3J0IHR5cGUgeyBWb2x1bWVGcmFtZSB9IGZyb20gJy4uL2dlb21ldHJ5L3BsYWNlJztcbmltcG9ydCB0eXBlIHsgTWVzaCB9IGZyb20gJ25hcGFyaS1qcy9nZW9tZXRyeSc7XG5cbi8qKiBNYWtlcyB0aGUgd29ya2VyOyBtYXkgYmUgYXN5bmMsIGFzIHRoZSBkZWZhdWx0IG9uZSBpcyAoaXQgaW1wb3J0cyB0aGUgZmFjdG9yeSBvbiBkZW1hbmQpLiAqL1xuZXhwb3J0IHR5cGUgUmVnaW9uU291cmNlV29ya2VyRmFjdG9yeSA9ICgpID0+IFdvcmtlciB8IFByb21pc2U8V29ya2VyPjtcblxuLyoqIFRoZSB3b3JrZXIgZGllZCB1bmRlciBhIGNhbGw7IHRoZSBjYWxsZXIgcmUtb3BlbnMgb24gdGhlIG1haW4gdGhyZWFkLiAqL1xuY2xhc3MgV29ya2VyTG9zdEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcignVGhlIHJlZ2lvbi1zb3VyY2Ugd29ya2VyIHN0b3BwZWQuJyk7XG4gICAgdGhpcy5uYW1lID0gJ1dvcmtlckxvc3RFcnJvcic7XG4gIH1cbn1cblxuaW50ZXJmYWNlIFBlbmRpbmdDYWxsIHtcbiAgcmVzb2x2ZTogKHZhbHVlOiB1bmtub3duKSA9PiB2b2lkO1xuICByZWplY3Q6IChyZWFzb246IHVua25vd24pID0+IHZvaWQ7XG59XG5cbi8qKiBPd25zIHRoZSByZWdpb24tc291cmNlIHdvcmtlciBhbmQgdGhlIGNhbGxzIGluIGZsaWdodCBvbiBpdC4gKi9cbmV4cG9ydCBjbGFzcyBSZWdpb25Tb3VyY2VXb3JrZXJDbGllbnQge1xuICBwcml2YXRlIHdvcmtlcjogV29ya2VyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3RhcnRpbmc6IFByb21pc2U8V29ya2VyIHwgbnVsbD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB1bmF2YWlsYWJsZSA9IGZhbHNlO1xuICBwcml2YXRlIG5leHRJZCA9IDE7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVuZGluZyA9IG5ldyBNYXA8bnVtYmVyLCBQZW5kaW5nQ2FsbD4oKTtcbiAgLyoqIFRoZSBtYWluLXRocmVhZCB0YWJsZXMsIG9uY2UgYW55dGhpbmcgcnVucyBoZXJlLiAqL1xuICBwcml2YXRlIGxvY2FsOiBSZWdpb25Tb3VyY2VUYWJsZXMgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB0YWJsZXMgPSAwO1xuXG4gIC8qKlxuICAgKiBgZmFjdG9yeWAgaXMgb3B0aW9uYWw6IHdpdGhvdXQgb25lIHRoZSByZWFsIHdvcmtlciBtb2R1bGUgaXMgaW1wb3J0ZWQgb24gZGVtYW5kIOKAlFxuICAgKiBkeW5hbWljYWxseSwgYmVjYXVzZSBpdCBob2xkcyBhbiBgaW1wb3J0Lm1ldGEudXJsYCB0aGF0IHRzLWplc3QncyBDb21tb25KUyBjb21waWxlXG4gICAqIHJlamVjdHMuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGZhY3Rvcnk/OiBSZWdpb25Tb3VyY2VXb3JrZXJGYWN0b3J5KSB7fVxuXG4gIC8qKiBXaGV0aGVyIGNhbGxzIG5vdyBydW4gb24gdGhlIG1haW4gdGhyZWFkLiAqL1xuICBnZXQgaW5UaHJlYWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudW5hdmFpbGFibGU7XG4gIH1cblxuICAvKipcbiAgICogV2hpY2ggdGFibGUgc2V0IGNhbGxzIHJ1biBvbjogYnVtcGVkIHdoZW4gdGhlIHdvcmtlciBpcyBsb3N0LiBBIGhhbmRsZSBvcGVuZWQgdW5kZXIgYW5vdGhlclxuICAgKiBuYW1lcyBhIHRhYmxlIHRoYXQgaXMgZ29uZSAob3IsIGhlcmUsIGFub3RoZXIgc291cmNlJ3MpLCBzbyBpdHMgc291cmNlIG11c3Qgb3BlbiBhZ2Fpbi5cbiAgICovXG4gIGdldCBnZW5lcmF0aW9uKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMudGFibGVzO1xuICB9XG5cbiAgLyoqIFJ1biBgcmVxdWVzdGAgaW4gdGhlIHdvcmtlciwgb3IgaGVyZSB3aGVuIHRoZXJlIGlzIG5vbmUuICovXG4gIGFzeW5jIGNhbGw8UiBleHRlbmRzIFJlZ2lvblNvdXJjZVJlcXVlc3Q+KHJlcXVlc3Q6IFIpOiBQcm9taXNlPFJlZ2lvblNvdXJjZVJlc3VsdHNbUlsnb3AnXV0+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMucnVuKHJlcXVlc3QpKS5yZXN1bHQ7XG4gIH1cblxuICAvKioge0BsaW5rIGNhbGx9LCB3aXRoIHRoZSB7QGxpbmsgZ2VuZXJhdGlvbn0gdGhlIHJlcXVlc3QgcmFuIG9uLiAqL1xuICBhc3luYyBydW48UiBleHRlbmRzIFJlZ2lvblNvdXJjZVJlcXVlc3Q+KFxuICAgIHJlcXVlc3Q6IFIsXG4gICk6IFByb21pc2U8eyByZXN1bHQ6IFJlZ2lvblNvdXJjZVJlc3VsdHNbUlsnb3AnXV07IGdlbmVyYXRpb246IG51bWJlciB9PiB7XG4gICAgY29uc3Qgc3RhcnRlZCA9IGF3YWl0IHRoaXMuZW5zdXJlV29ya2VyKCk7XG4gICAgLy8gVGhlIHdvcmtlciBtYXkgaGF2ZSBiZWVuIGxvc3Qgd2hpbGUgdGhpcyB3YWl0ZWQgZm9yIGl0LlxuICAgIGNvbnN0IHdvcmtlciA9IHN0YXJ0ZWQgPT09IHRoaXMud29ya2VyID8gc3RhcnRlZCA6IG51bGw7XG4gICAgY29uc3QgZ2VuZXJhdGlvbiA9IHRoaXMudGFibGVzO1xuICAgIGlmICghd29ya2VyKSByZXR1cm4geyByZXN1bHQ6ICh0aGlzLmxvY2FsID8/PSBuZXcgUmVnaW9uU291cmNlVGFibGVzKCkpLnJ1bihyZXF1ZXN0KSwgZ2VuZXJhdGlvbiB9O1xuICAgIGNvbnN0IGlkID0gdGhpcy5uZXh0SWQrKztcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBuZXcgUHJvbWlzZTxSZWdpb25Tb3VyY2VSZXN1bHRzW1JbJ29wJ11dPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnBlbmRpbmcuc2V0KGlkLCB7IHJlc29sdmU6IHJlc29sdmUgYXMgKHY6IHVua25vd24pID0+IHZvaWQsIHJlamVjdCB9KTtcbiAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7IC4uLnJlcXVlc3QsIGlkIH0gYXMgUmVnaW9uU291cmNlTWVzc2FnZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHsgcmVzdWx0LCBnZW5lcmF0aW9uIH07XG4gIH1cblxuICAvKiogVGVybWluYXRlIHRoZSB3b3JrZXI7IGNhbGxzIGluIGZsaWdodCByZWplY3QuICovXG4gIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5sb3NlKCk7XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZVdvcmtlcigpOiBQcm9taXNlPFdvcmtlciB8IG51bGw+IHtcbiAgICBpZiAodGhpcy53b3JrZXIpIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy53b3JrZXIpO1xuICAgIGlmICh0aGlzLnVuYXZhaWxhYmxlIHx8ICghdGhpcy5mYWN0b3J5ICYmIHR5cGVvZiBXb3JrZXIgPT09ICd1bmRlZmluZWQnKSkge1xuICAgICAgdGhpcy51bmF2YWlsYWJsZSA9IHRydWU7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuc3RhcnRpbmcpIHtcbiAgICAgIGNvbnN0IHN0YXJ0aW5nID0gdGhpcy5zdGFydFdvcmtlcigpO1xuICAgICAgdGhpcy5zdGFydGluZyA9IHN0YXJ0aW5nO1xuICAgICAgdm9pZCBzdGFydGluZy50aGVuKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuc3RhcnRpbmcgPT09IHN0YXJ0aW5nKSB0aGlzLnN0YXJ0aW5nID0gbnVsbDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zdGFydGluZztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc3RhcnRXb3JrZXIoKTogUHJvbWlzZTxXb3JrZXIgfCBudWxsPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1hZGUgPSB0aGlzLmZhY3RvcnlcbiAgICAgICAgPyB0aGlzLmZhY3RvcnkoKVxuICAgICAgICA6IGltcG9ydCgnLi9yZWdpb24tc291cmNlLXdvcmtlcicpLnRoZW4oKG0pID0+IG0uY3JlYXRlUmVnaW9uU291cmNlV29ya2VyKCkpO1xuICAgICAgY29uc3Qgd29ya2VyID0gbWFkZSBpbnN0YW5jZW9mIFByb21pc2UgPyBhd2FpdCBtYWRlIDogbWFkZTtcbiAgICAgIHdvcmtlci5vbm1lc3NhZ2UgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudDxSZWdpb25Tb3VyY2VSZXBseT4pID0+IHRoaXMub25SZXBseShldmVudC5kYXRhKTtcbiAgICAgIHdvcmtlci5vbmVycm9yID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdD8uKCk7XG4gICAgICAgIGlmICh3b3JrZXIgPT09IHRoaXMud29ya2VyKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdbcmVnaW9uLXNvdXJjZV0gd29ya2VyIGZhaWxlZDsgdGlsaW5nIG9uIHRoZSBtYWluIHRocmVhZCcpO1xuICAgICAgICAgIHRoaXMubG9zZSgpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdGhpcy53b3JrZXIgPSB3b3JrZXI7XG4gICAgICByZXR1cm4gd29ya2VyO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKCdbcmVnaW9uLXNvdXJjZV0gd29ya2VyIHVuYXZhaWxhYmxlOyB0aWxpbmcgb24gdGhlIG1haW4gdGhyZWFkJywgZXJyKTtcbiAgICAgIHRoaXMudW5hdmFpbGFibGUgPSB0cnVlO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvblJlcGx5KHJlcGx5OiBSZWdpb25Tb3VyY2VSZXBseSk6IHZvaWQge1xuICAgIGNvbnN0IGNhbGwgPSB0aGlzLnBlbmRpbmcuZ2V0KHJlcGx5LmlkKTtcbiAgICBpZiAoIWNhbGwpIHJldHVybjtcbiAgICB0aGlzLnBlbmRpbmcuZGVsZXRlKHJlcGx5LmlkKTtcbiAgICBpZiAocmVwbHkub2spIGNhbGwucmVzb2x2ZShyZXBseS5yZXN1bHQpO1xuICAgIGVsc2UgY2FsbC5yZWplY3QobmV3IEVycm9yKHJlcGx5LmVycm9yKSk7XG4gIH1cblxuICAvKiogU3RvcCB0aGUgd29ya2VyIGZvciBnb29kOiBldmVyeSBsYXRlciBjYWxsIHJ1bnMgaGVyZSwgZXZlcnkgY2FsbCBpbiBmbGlnaHQgaXMgbG9zdC4gKi9cbiAgcHJpdmF0ZSBsb3NlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLndvcmtlcikgdGhpcy50YWJsZXMrKztcbiAgICB0aGlzLnVuYXZhaWxhYmxlID0gdHJ1ZTtcbiAgICB0aGlzLndvcmtlcj8udGVybWluYXRlKCk7XG4gICAgdGhpcy53b3JrZXIgPSBudWxsO1xuICAgIGNvbnN0IGNhbGxzID0gWy4uLnRoaXMucGVuZGluZy52YWx1ZXMoKV07XG4gICAgdGhpcy5wZW5kaW5nLmNsZWFyKCk7XG4gICAgZm9yIChjb25zdCBjYWxsIG9mIGNhbGxzKSBjYWxsLnJlamVjdChuZXcgV29ya2VyTG9zdEVycm9yKCkpO1xuICB9XG59XG5cbmxldCBzaGFyZWQ6IFJlZ2lvblNvdXJjZVdvcmtlckNsaWVudCB8IG51bGwgPSBudWxsO1xuXG4vKiogVGhlIHdvcmtlciBjbGllbnQgZXZlcnkgR2VvSlNPTiBzb3VyY2Ugc2hhcmVzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNoYXJlZFJlZ2lvblNvdXJjZUNsaWVudCgpOiBSZWdpb25Tb3VyY2VXb3JrZXJDbGllbnQge1xuICByZXR1cm4gKHNoYXJlZCA/Pz0gbmV3IFJlZ2lvblNvdXJjZVdvcmtlckNsaWVudCgpKTtcbn1cblxuLyoqXG4gKiBPcGVuIGEgR2VvSlNPTiBGZWF0dXJlQ29sbGVjdGlvbiBzdHJpbmcgYXMgYSB0aWxlZCByZWdpb24gc291cmNlLiBSZWplY3RzIG9uIGludmFsaWQgSlNPTiBvclxuICogYSBjb2xsZWN0aW9uIHdpdGhvdXQgYGZlYXR1cmVzYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5HZW9Kc29uUmVnaW9uU291cmNlKFxuICB0ZXh0OiBzdHJpbmcsXG4gIGNsaWVudDogUmVnaW9uU291cmNlV29ya2VyQ2xpZW50ID0gc2hhcmVkUmVnaW9uU291cmNlQ2xpZW50KCksXG4pOiBQcm9taXNlPFJlZ2lvblNvdXJjZT4ge1xuICAvLyBUaGUgd29ya2VyIGxvc3QgdW5kZXIgdGhlIG9wZW46IG9wZW4gb24gdGhlIG1haW4gdGhyZWFkIGluc3RlYWQuXG4gIGNvbnN0IG9wZW5lZCA9IGF3YWl0IGNsaWVudFxuICAgIC5ydW4oeyBvcDogJ29wZW4nLCB0ZXh0IH0pXG4gICAgLmNhdGNoKChlcnIpID0+IChlcnIgaW5zdGFuY2VvZiBXb3JrZXJMb3N0RXJyb3IgPyBjbGllbnQucnVuKHsgb3A6ICdvcGVuJywgdGV4dCB9KSA6IFByb21pc2UucmVqZWN0KGVycikpKTtcbiAgY29uc3QgeyBoYW5kbGUsIGluZm8gfSA9IG9wZW5lZC5yZXN1bHQ7XG4gIHJldHVybiBuZXcgV29ya2VyUmVnaW9uU291cmNlKGNsaWVudCwgdGV4dCwgaGFuZGxlLCBvcGVuZWQuZ2VuZXJhdGlvbiwgaW5mbyk7XG59XG5cbmxldCBjZWxsc0NsaWVudDogUmVnaW9uU291cmNlV29ya2VyQ2xpZW50IHwgbnVsbCA9IG51bGw7XG5cbi8qKlxuICogVGhlIHdvcmtlciBjbGllbnQgY2VsbHMgYXJlIG1lc2hlZCBvbjogYSB3b3JrZXIgb2YgaXRzIG93biwgc28gYSBmZXcgdGhvdXNhbmQgY2VsbHMgbWVzaGluZyBkb2VzXG4gKiBub3QgaG9sZCB1cCB0aGUgcmVnaW9uIHRpbGVzIHRoZSAyRCB2aWV3cyByZWFkIGZyb20gdGhlIHNoYXJlZCBvbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjZWxsc1dvcmtlckNsaWVudCgpOiBSZWdpb25Tb3VyY2VXb3JrZXJDbGllbnQge1xuICByZXR1cm4gKGNlbGxzQ2xpZW50ID8/PSBuZXcgUmVnaW9uU291cmNlV29ya2VyQ2xpZW50KCkpO1xufVxuXG4vKipcbiAqIEEgM0Qgc2VnbWVudGF0aW9uJ3MgY2VsbHMsIGVhY2ggbWVzaGVkIGJ5IGl0c2VsZiAoc2VlIGBnZW9tZXRyeS9jZWxsLW1lc2hlc2ApLCBpbiB0aGUgY2VsbHMnXG4gKiB3b3JrZXIgKG9uIHRoZSBtYWluIHRocmVhZCB3aGVyZSB0aGVyZSBpcyBub25lKS4gQmF0Y2ggdGhlbTogb25lIGNhbGwgbWVzaGVzIGl0cyBjZWxscyBpbiBvbmUgZ28uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvbnN0cnVjdENlbGxzSW5Xb3JrZXIoXG4gIGNlbGxzOiByZWFkb25seSBDZWxsT3V0bGluZXNbXSxcbiAgb3B0aW9ucz86IFJlY29uc3RydWN0T3B0aW9ucyxcbiAgY2xpZW50OiBSZWdpb25Tb3VyY2VXb3JrZXJDbGllbnQgPSBjZWxsc1dvcmtlckNsaWVudCgpLFxuKTogUHJvbWlzZTxDZWxsc01lc2g+IHtcbiAgcmV0dXJuIGNsaWVudC5jYWxsKHsgb3A6ICdjZWxscycsIGNlbGxzLCBvcHRpb25zIH0pO1xufVxuXG4vKipcbiAqIEEgbWVzaCdzIHZlcnRpY2VzIHBsYWNlZCBpbiBhIDNEIHZpZXcncyB3b3JsZCAoc2VlIGBnZW9tZXRyeS9wbGFjZWApLCBpbiB0aGUgY2VsbHMnIHdvcmtlcjogYVxuICogY2xhc3MncyBzdXJmYWNlIGhhcyBodW5kcmVkcyBvZiB0aG91c2FuZHMsIGFuZCBwbGFjaW5nIGV2ZXJ5IHN1cmZhY2Ugb24gdGhlIG1haW4gdGhyZWFkIGhlbGQgaXRcbiAqIGZvciBzZWNvbmRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGxhY2VJbldvcmtlcihcbiAgdmVydGljZXM6IEZsb2F0MzJBcnJheSxcbiAgZnJhbWU6IFZvbHVtZUZyYW1lLFxuICBjbGllbnQ6IFJlZ2lvblNvdXJjZVdvcmtlckNsaWVudCA9IGNlbGxzV29ya2VyQ2xpZW50KCksXG4pOiBQcm9taXNlPEZsb2F0MzJBcnJheT4ge1xuICByZXR1cm4gY2xpZW50LmNhbGwoeyBvcDogJ3BsYWNlJywgdmVydGljZXMsIGZyYW1lIH0pO1xufVxuXG4vKipcbiAqIFRoZSAzRCByZWNvbnN0cnVjdGlvbiBvZiBhIHJlZ2lvbiBmcm9tIGl0cyBvdXRsaW5lcyBvbiBhIHN0YWNrIChzZWUgYGdlb21ldHJ5L3JlY29uc3RydWN0YCksXG4gKiBtZXNoZWQgaW4gdGhlIHJlZ2lvbi1zb3VyY2Ugd29ya2VyIChvbiB0aGUgbWFpbiB0aHJlYWQgd2hlcmUgdGhlcmUgaXMgbm9uZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvbnN0cnVjdEluV29ya2VyKFxuICBzbGljZXM6IHJlYWRvbmx5IFNsaWNlT3V0bGluZXNbXSxcbiAgb3B0aW9ucz86IFJlY29uc3RydWN0T3B0aW9ucyxcbiAgY2xpZW50OiBSZWdpb25Tb3VyY2VXb3JrZXJDbGllbnQgPSBzaGFyZWRSZWdpb25Tb3VyY2VDbGllbnQoKSxcbik6IFByb21pc2U8TWVzaD4ge1xuICByZXR1cm4gY2xpZW50LmNhbGwoeyBvcDogJ21lc2gnLCBzbGljZXMsIG9wdGlvbnMgfSk7XG59XG5cbmNsYXNzIFdvcmtlclJlZ2lvblNvdXJjZSBpbXBsZW1lbnRzIFJlZ2lvblNvdXJjZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FjaGUgPSBuZXcgUmVnaW9uVGlsZUNhY2hlKCk7XG4gIHByaXZhdGUgZGlzcG9zZWQgPSBmYWxzZTtcbiAgLyoqIFRoZSBtYWluLXRocmVhZCByZS1vcGVuIGFmdGVyIHRoZSB3b3JrZXIgZGllZCwgc2hhcmVkIGJ5IGV2ZXJ5IGNhbGwgdGhhdCBmaW5kcyBpdCBzby4gKi9cbiAgcHJpdmF0ZSByZW9wZW5pbmc6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNsaWVudDogUmVnaW9uU291cmNlV29ya2VyQ2xpZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGV4dDogc3RyaW5nLFxuICAgIHByaXZhdGUgaGFuZGxlOiBudW1iZXIsXG4gICAgLyoqIFRoZSBjbGllbnQncyB7QGxpbmsgUmVnaW9uU291cmNlV29ya2VyQ2xpZW50LmdlbmVyYXRpb259IHtAbGluayBoYW5kbGV9IHdhcyBvcGVuZWQgdW5kZXIuICovXG4gICAgcHJpdmF0ZSBnZW5lcmF0aW9uOiBudW1iZXIsXG4gICAgcmVhZG9ubHkgaW5mbzogUmVnaW9uU291cmNlSW5mbyxcbiAgKSB7fVxuXG4gIGdldFRpbGUoejogbnVtYmVyLCBrZXk6IFJlZ2lvblRpbGVLZXksIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxSZWdpb25UaWxlPiB7XG4gICAgY29uc3QgdGlsZSA9IHRoaXMuY2FjaGUuZ2V0KHosIGtleSwgKCkgPT5cbiAgICAgIHRoaXMuY2FsbCgoaGFuZGxlKSA9PiAoeyBvcDogJ3RpbGUnLCBoYW5kbGUsIHosIGxldmVsOiBrZXkubGV2ZWwsIGd4OiBrZXkuZ3gsIGd5OiBrZXkuZ3kgfSkpLFxuICAgICk7XG4gICAgcmV0dXJuIGFib3J0YWJsZSh0aWxlLCBzaWduYWwpO1xuICB9XG5cbiAgZ2V0RmVhdHVyZXMoaWRzOiByZWFkb25seSBzdHJpbmdbXSk6IFByb21pc2U8U291cmNlRmVhdHVyZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuY2FsbCgoaGFuZGxlKSA9PiAoeyBvcDogJ2ZlYXR1cmVzJywgaGFuZGxlLCBpZHMgfSkpO1xuICB9XG5cbiAgZ2V0SW5kZXgoejogbnVtYmVyLCBxdWVyeTogUmVnaW9uSW5kZXhRdWVyeSk6IFByb21pc2U8UmVnaW9uSW5kZXhQYWdlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2FsbCgoaGFuZGxlKSA9PiAoeyBvcDogJ2luZGV4JywgaGFuZGxlLCB6LCBxdWVyeSB9KSk7XG4gIH1cblxuICBnZXRDbGFzc091dGxpbmVzKFxuICAgIGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdIHwgbnVsbCxcbiAgICBsZXZlbDogbnVtYmVyLFxuICAgIGV4Y2x1ZGU/OiByZWFkb25seSBzdHJpbmdbXSxcbiAgKTogUHJvbWlzZTxDbGFzc091dGxpbmVzW10+IHtcbiAgICByZXR1cm4gdGhpcy5jYWxsKChoYW5kbGUpID0+ICh7IG9wOiAnb3V0bGluZXMnLCBoYW5kbGUsIGNsYXNzZXMsIGxldmVsLCBleGNsdWRlIH0pKTtcbiAgfVxuXG4gIGdldENsYXNzQ291bnRzKHo6IG51bWJlciB8IG51bGwsIGV4Y2x1ZGU/OiByZWFkb25seSBzdHJpbmdbXSk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4ge1xuICAgIHJldHVybiB0aGlzLmNhbGwoKGhhbmRsZSkgPT4gKHsgb3A6ICdjbGFzc2VzJywgaGFuZGxlLCB6LCBleGNsdWRlIH0pKTtcbiAgfVxuXG4gIGV4cG9ydEdlb0pzb24oZXhjbHVkZTogcmVhZG9ubHkgc3RyaW5nW10sIGV4dHJhOiByZWFkb25seSBvYmplY3RbXSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuY2FsbCgoaGFuZGxlKSA9PiAoeyBvcDogJ2V4cG9ydCcsIGhhbmRsZSwgZXhjbHVkZSwgZXh0cmEgfSkpO1xuICB9XG5cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuO1xuICAgIHRoaXMuZGlzcG9zZWQgPSB0cnVlO1xuICAgIHRoaXMuY2FjaGUuY2xlYXIoKTtcbiAgICAvLyBBIGhhbmRsZSBmcm9tIGEgbG9zdCB3b3JrZXIncyB0YWJsZXMgbmFtZXMgbm90aGluZyBoZXJlLCBvciBhbm90aGVyIHNvdXJjZSdzIHRhYmxlLlxuICAgIGlmICh0aGlzLmdlbmVyYXRpb24gIT09IHRoaXMuY2xpZW50LmdlbmVyYXRpb24pIHJldHVybjtcbiAgICB2b2lkIHRoaXMuY2xpZW50LmNhbGwoeyBvcDogJ2Nsb3NlJywgaGFuZGxlOiB0aGlzLmhhbmRsZSB9KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biBhIHJlcXVlc3Qgb24gdGhpcyBzb3VyY2UncyB0YWJsZTsgd2hlbiB0aGUgd29ya2VyIGRpZWQgKHVuZGVyIHRoaXMgY2FsbCBvciBiZWZvcmUgaXQpLFxuICAgKiByZS1vcGVuIGhlcmUgYW5kIHJ1biBpdCB0aGVyZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY2FsbDxSIGV4dGVuZHMgUmVnaW9uU291cmNlUmVxdWVzdD4oXG4gICAgbWFrZTogKGhhbmRsZTogbnVtYmVyKSA9PiBSLFxuICApOiBQcm9taXNlPFJlZ2lvblNvdXJjZVJlc3VsdHNbUlsnb3AnXV0+IHtcbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgOyBhdHRlbXB0KyspIHtcbiAgICAgIGlmICh0aGlzLmdlbmVyYXRpb24gIT09IHRoaXMuY2xpZW50LmdlbmVyYXRpb24pIGF3YWl0IHRoaXMucmVvcGVuKCk7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChtYWtlKHRoaXMuaGFuZGxlKSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKCEoZXJyIGluc3RhbmNlb2YgV29ya2VyTG9zdEVycm9yKSB8fCBhdHRlbXB0ID4gMCkgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBPcGVuIHRoaXMgc291cmNlJ3MgdGV4dCBhZ2FpbiBvbiB0aGUgY2xpZW50J3MgY3VycmVudCB0YWJsZXMsIG9uY2UgZm9yIGV2ZXJ5IGNhbGwgd2FpdGluZy4gKi9cbiAgcHJpdmF0ZSByZW9wZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5yZW9wZW5pbmcgPz89IHRoaXMuY2xpZW50XG4gICAgICAucnVuKHsgb3A6ICdvcGVuJywgdGV4dDogdGhpcy50ZXh0IH0pXG4gICAgICAudGhlbigoeyByZXN1bHQsIGdlbmVyYXRpb24gfSkgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZSA9IHJlc3VsdC5oYW5kbGU7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGlvbiA9IGdlbmVyYXRpb247XG4gICAgICB9KVxuICAgICAgLmZpbmFsbHkoKCkgPT4gKHRoaXMucmVvcGVuaW5nID0gbnVsbCkpO1xuICAgIHJldHVybiB0aGlzLnJlb3BlbmluZztcbiAgfVxufVxuIl19
|