@jax-data-science/sci-image-visualizer 0.3.2 → 0.4.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.
Files changed (93) hide show
  1. package/README.md +215 -11
  2. package/esm2022/index.mjs +20 -1
  3. package/esm2022/lib/contracts/display-types.mjs +20 -2
  4. package/esm2022/lib/contracts/image.contract.mjs +1 -1
  5. package/esm2022/lib/contracts/plot-type.mjs +36 -1
  6. package/esm2022/lib/contracts/ports/spatial-data.port.mjs +3 -0
  7. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +45 -0
  8. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  9. package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +10 -19
  10. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +71 -7
  11. package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +1 -1
  12. package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +96 -0
  13. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +1934 -55
  14. package/esm2022/lib/implementations/napari-js/napari-zoom.mjs +18 -0
  15. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +5 -3
  16. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +3 -4
  17. package/esm2022/lib/implementations/osd/osd-zoom.mjs +20 -0
  18. package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +555 -0
  19. package/esm2022/lib/implementations/plotly/plotly.service.mjs +13 -7
  20. package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +304 -0
  21. package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +179 -0
  22. package/esm2022/lib/routing-visualizer.service.mjs +223 -12
  23. package/esm2022/lib/spatial/embedding-compute.mjs +142 -0
  24. package/esm2022/lib/spatial/gene-search.mjs +77 -0
  25. package/esm2022/lib/spatial/spatial-density.mjs +224 -0
  26. package/esm2022/lib/spatial/spatial-encoding.mjs +232 -0
  27. package/esm2022/lib/spatial/spatial-expression.mjs +257 -0
  28. package/esm2022/lib/spatial/spatial-framing.mjs +60 -0
  29. package/esm2022/lib/spatial/spatial-heatmap.mjs +185 -0
  30. package/esm2022/lib/spatial/spatial-hover.mjs +79 -0
  31. package/esm2022/lib/spatial/spatial-sections.mjs +96 -0
  32. package/esm2022/lib/spatial/spatial-selection.mjs +264 -0
  33. package/esm2022/lib/spatial/spatial-volume-image.mjs +163 -0
  34. package/esm2022/lib/spatial/tsne-worker.mjs +10 -0
  35. package/esm2022/lib/spatial/world-grid.mjs +77 -0
  36. package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +1278 -0
  37. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +621 -0
  38. package/esm2022/lib/store/spatial-selection.service.mjs +47 -0
  39. package/esm2022/lib/store/visualizer-store.service.mjs +23 -1
  40. package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +2 -2
  41. package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +9 -9
  42. package/esm2022/lib/toolbar/toolbar.component.mjs +30 -7
  43. package/esm2022/lib/visualization.module.mjs +23 -5
  44. package/esm2022/lib/visualizer.component.mjs +283 -22
  45. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-ci1q0xnJ.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs} +6 -4
  46. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-ci1q0xnJ.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map} +1 -1
  47. package/fesm2022/jax-data-science-sci-image-visualizer-tsne-worker-B_nXDGf0.mjs +12 -0
  48. package/fesm2022/jax-data-science-sci-image-visualizer-tsne-worker-B_nXDGf0.mjs.map +1 -0
  49. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +15282 -7829
  50. package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
  51. package/fesm2022/tsne.worker.js +19091 -0
  52. package/index.d.ts +15 -0
  53. package/lib/contracts/display-types.d.ts +131 -0
  54. package/lib/contracts/image.contract.d.ts +7 -0
  55. package/lib/contracts/plot-type.d.ts +42 -2
  56. package/lib/contracts/ports/spatial-data.port.d.ts +90 -0
  57. package/lib/contracts/spatial-dataset.contract.d.ts +281 -0
  58. package/lib/contracts/visualizer.contract.d.ts +99 -1
  59. package/lib/implementations/napari-js/napari-axes-labels.d.ts +9 -7
  60. package/lib/implementations/napari-js/napari-region-overlay.d.ts +38 -4
  61. package/lib/implementations/napari-js/napari-scale-bar.d.ts +7 -3
  62. package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +32 -0
  63. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +497 -16
  64. package/lib/implementations/napari-js/napari-zoom.d.ts +15 -0
  65. package/lib/implementations/osd/osd-zoom.d.ts +19 -0
  66. package/lib/implementations/plotly/omics-trace-builders.d.ts +193 -0
  67. package/lib/implementations/plotly/plotly.service.d.ts +9 -0
  68. package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +123 -0
  69. package/lib/implementations/spatial-data-http/spatial-wire.d.ts +115 -0
  70. package/lib/routing-visualizer.service.d.ts +45 -6
  71. package/lib/spatial/embedding-compute.d.ts +73 -0
  72. package/lib/spatial/gene-search.d.ts +48 -0
  73. package/lib/spatial/spatial-density.d.ts +73 -0
  74. package/lib/spatial/spatial-encoding.d.ts +155 -0
  75. package/lib/spatial/spatial-expression.d.ts +144 -0
  76. package/lib/spatial/spatial-framing.d.ts +37 -0
  77. package/lib/spatial/spatial-heatmap.d.ts +111 -0
  78. package/lib/spatial/spatial-hover.d.ts +49 -0
  79. package/lib/spatial/spatial-sections.d.ts +59 -0
  80. package/lib/spatial/spatial-selection.d.ts +113 -0
  81. package/lib/spatial/spatial-volume-image.d.ts +67 -0
  82. package/lib/spatial/tsne-worker.d.ts +7 -0
  83. package/lib/spatial/world-grid.d.ts +58 -0
  84. package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +439 -0
  85. package/lib/spatial-controls/spatial-controls.component.d.ts +257 -0
  86. package/lib/store/spatial-selection.service.d.ts +27 -0
  87. package/lib/store/visualizer-store.service.d.ts +13 -0
  88. package/lib/toolbar/toolbar.component.d.ts +19 -3
  89. package/lib/visualization.module.d.ts +28 -24
  90. package/lib/visualizer.component.d.ts +73 -2
  91. package/package.json +7 -3
  92. package/src/lib/assets/spatial-omics-3d.svg +31 -0
  93. package/src/lib/assets/spatial-omics.svg +27 -0
package/README.md CHANGED
@@ -83,7 +83,7 @@ full walkthrough (adapters, TIFF handling, the Angular-17 toolchain note).
83
83
  one `IVisualizer` contract; the host picks per plot type via `RoutingVisualizerService`.
84
84
  - **Plot types** — Image (OSD), Plotly (Heatmap, Contour, Scatter 2D, Surface 3D,
85
85
  Scatter 3D, Isosurface), and napari · WebGPU (Image, Scatter 2D, Surface,
86
- Scatter 3D, Volume, Isosurface).
86
+ Scatter 3D, Volume, Isosurface, **Spatial omics**, **Spatial omics 3D**).
87
87
  - **Region / annotation tools** — selection, rectangle, polyline, freeform,
88
88
  polygon + vertex editing, move, Bézier↔polygon, magic wand, brush, vertex eraser.
89
89
  - **Channels & histogram** — brightness/contrast/gamma, per-channel display,
@@ -143,7 +143,8 @@ data as you zoom in:
143
143
  ### napari-js — WebGPU
144
144
  GPU-accelerated renderings via [napari-js](https://www.npmjs.com/package/napari-js)
145
145
  (WebGPU), selectable from the plot-type menu as the "napari · WebGPU" variants of
146
- Image, Scatter 2D, Surface, Scatter 3D, **Volume**, and **Isosurface**. It
146
+ Image, Scatter 2D, Surface, Scatter 3D, **Volume**, **Isosurface**, and the two
147
+ spatial-omics modes ([below](#spatial-omics)). It
147
148
  assembles the volume from the slice endpoints with a runtime **decimate factor**
148
149
  (resolution slider, default ½), a surface **wireframe** toggle, a 3D **axes / scale
149
150
  gizmo**, an in-view **Z-height drag handle** for the volume, **cancellable** loading,
@@ -151,8 +152,16 @@ and **multichannel volume** compositing (one additive tinted layer per channel).
151
152
  Regions and display options stay in sync with the other backends via the shared
152
153
  stores.
153
154
 
154
- When a stack is open, a slice slider (Image view) or single-image/stack toggle
155
- (other views) navigates the z-dimension. A stack may be one server-tiled file
155
+ Volume and Isosurface take their voxels from the **image stack**, and only from
156
+ it — there is one voxel path, so a dataset reaches those modes by being a stack.
157
+ A stack that declares its slice spacing (`imageMeta[0].mppZ`, alongside
158
+ `mppX`/`mppY`) is rendered at its **true physical extent**, so 40 × 40 × 200 µm
159
+ voxels read as anatomy rather than as a cube-aspect brick, and the axis labels
160
+ read in real units on all three axes. Without it the world box is
161
+ resolution-invariant but shape-only, and Z is labelled in slices.
162
+
163
+ When a stack is open, a slice slider (Image view, and the 2D Spatial omics view)
164
+ or single-image/stack toggle (other views) navigates the z-dimension. A stack may be one server-tiled file
156
165
  (internal z) or a set of self-contained per-slice URLs (`IImageInfo.tiled ===
157
166
  false`) — the latter (e.g. a host-assembled folder of numbered files) fetches
158
167
  `urls[z]` per slice on demand. For a per-slice stack the host can also supply a
@@ -164,6 +173,187 @@ A line-ROI tool draws coloured lines and plots intensity along each one in a liv
164
173
  floating inset chart that re-samples at the current zoom. It works today but the
165
174
  API/UX are still stabilizing (see [In progress / roadmap](#in-progress--roadmap)).
166
175
 
176
+ ## Spatial omics
177
+
178
+ Contracts for **spatial-omics datasets**: N observations (Visium spots,
179
+ segmented cells) positioned in a tissue image's pixel space, each carrying
180
+ categorical and continuous annotations plus a lazily-fetched feature (gene)
181
+ matrix.
182
+
183
+ ```ts
184
+ import {
185
+ SPATIAL_DATA_PORT, SpatialDataHttpService, SpatialDataset,
186
+ } from '@jax-data-science/sci-image-visualizer';
187
+
188
+ providers: [
189
+ SpatialDataHttpService,
190
+ { provide: SPATIAL_DATA_PORT, useExisting: SpatialDataHttpService },
191
+ ]
192
+ ```
193
+
194
+ Like `TILE_ACCESS_PORT`, this is a **port**: the library consumes typed arrays
195
+ and never learns how the data is stored. `SpatialDataHttpService` is an optional
196
+ reference adapter for the format the bundled example server speaks; a host with
197
+ its own backend implements `SpatialDataPort` instead and imports neither.
198
+
199
+ Two properties the design turns on:
200
+
201
+ - **Metadata is eager, values are lazy.** A `SpatialDataset` holds coordinates
202
+ plus column and feature *descriptors*; vectors arrive one at a time, for the
203
+ one column or gene being displayed. A Visium table is ~31k genes wide — the
204
+ dense matrix is ~800 MB — so loading a dataset can never mean loading its
205
+ matrix.
206
+ - **Struct-of-arrays, not object-per-cell.** Datasets run 10³ (Visium) to 10⁶
207
+ (Xenium/CosMx) observations; two `Float32Array`s beat 500k `{x, y}` objects
208
+ and upload to the GPU without a copy.
209
+
210
+ Once a dataset is published, the spatial plot types appear in the selector (and
211
+ disappear when it is cleared — the same gating that hides Volume without a
212
+ z-stack):
213
+
214
+ - **Spatial omics** — one marker per observation over the tissue image the
215
+ coordinates live in, positioned through `imageRef`'s affine.
216
+ - **Spatial omics 3D** — gated additionally on the observations carrying a `z`
217
+ (`requiresSpatial3d`): the same observations as a point cloud under an orbit
218
+ camera, inside the dataset's reference volume if it has one.
219
+
220
+ **A dataset whose 3D data is one file gets an image made from it.** A registered
221
+ volume (`SpatialDataset.volume` + `SpatialDataPort.getVolume()`) is published *as*
222
+ a grayscale z-stack image — one plane per slice, opened mid-volume — so the whole
223
+ image surface applies to it: the toolbar slice slider, the contrast window,
224
+ colormaps, the region tools, the physical scale bar, and Volume / Isosurface
225
+ through the ordinary stack path. In the 2D mode the displayed plane then draws
226
+ **that plane's** observations over that plane's anatomy, in the volume's own pixel
227
+ grid, and a region drawn there selects that plane's cells rather than the whole
228
+ depth behind them.
229
+
230
+ **Cluster density volumes** *(3D mode, optional)* — a checkbox that raymarches
231
+ each cluster as a smooth density field beside the cloud, tinted with its legend
232
+ colour and blended additively. Serial sections hundreds of microns apart cannot be
233
+ read as an anatomical distribution from points alone: the eye will not integrate a
234
+ stack of discs into a shape, and every gap between sections reads as absence.
235
+ Individual cells are never interpolated — consecutive sections sample different
236
+ cells, so there is nothing to interpolate along — but a density *field* is an
237
+ estimate legitimately defined between the imaged planes, and it renders as a
238
+ translucent cloud so it cannot be mistaken for measurement. The kernel is
239
+ anisotropic (σ along z clears one section gap) and the field is coverage-normalised
240
+ along z, so unimaged planes do not read as empty tissue.
241
+
242
+ In **3D** the same `Gene map` checkbox draws one field per imaged section, at its
243
+ own depth, with the gaps between sections empty — the measured slides, stacked.
244
+ `One map section at a time` isolates a single sheet (its own control, separate from
245
+ the cloud's, so every combination stays reachable), and `Volume rendering
246
+ (interpolate along z)` smooths the sheets into a continuous volume. The last is a
247
+ different object and the panel labels it as one: the planes between sections then
248
+ carry an estimate smoothed from their neighbours' mean, nothing is drawn past the
249
+ outermost section, and the section restriction is ignored because a volume built
250
+ from one slide would smear it through the whole specimen. It is estimated on the
251
+ reference volume's lattice — coarsened in-plane but never along z, so one plane is
252
+ one section — and shares the 2D map's bandwidth, window and colormap.
253
+
254
+ **Show** *(3D mode)* — the reference volume, the observation cloud and the cluster
255
+ density volumes share one space, so any two of them hide each other; 374k points
256
+ drawn as a stack of discs hide the density volumes almost entirely. Each is
257
+ toggled independently, so every combination is reachable — the estimated fields
258
+ alone, the fields with the anatomy behind them, the anatomy on its own. These are
259
+ visibility only: the layers stay built, so a toggle never re-fetches the template
260
+ or re-rasterises a field, and none of them re-frames the orbit camera. (The
261
+ density checkbox is the exception and still gates construction, since building six
262
+ volumes is not free.) **Volume opacity** is the backdrop's own slider, separate
263
+ from the markers': reading the cloud or a density field *through* the anatomy
264
+ means turning the anatomy down, not the data over it. **One section at a time** restricts the cloud to a single
265
+ imaged section, which is how you check whether the estimated field follows the
266
+ cells that were actually measured. Sections are the distinct z of the
267
+ observations — every cell on a slide shares that slide's registered z, so no
268
+ section-label column is needed — and a dataset whose z is continuous rather than
269
+ sectioned is offered no section control instead of having one invented for it.
270
+
271
+ **Hover and click** — hovering an observation names it in a cursor tooltip: the
272
+ class for a categorical column, the value with its unit for a gene or numeric one,
273
+ and nothing at all when no colour source is set (there is no cluster to name).
274
+ Clicking a marker selects that whole class, the same selection the legend's rows
275
+ produce, and clicking it again clears. Because a click means "select" here,
276
+ napari's click-to-zoom is off in the spatial modes — the wheel, the zoom buttons
277
+ and the zoom-box tool still zoom. A gene cannot be clicked to select: no set of
278
+ cells "is" a value.
279
+
280
+ **Colormap** *(continuous colouring)* — the low→high gradient for a gene or a
281
+ numeric column, chosen from the library's own `COLORMAP_OPTIONS` with the same
282
+ swatch previews the image's colormap picker uses. It defaults to following the
283
+ image's colormap (with a Viridis fallback, since a grey measurement over grey
284
+ anatomy cannot be told apart from it), and clearing the picker returns to that.
285
+ One setting drives the markers, both gene maps and the panel's colour bar, so none
286
+ of them can disagree about what a colour means.
287
+
288
+ **Gene map** *(2D mode, optional, with a gene selected)* — a checkbox that draws
289
+ the selected gene's expression as a smooth field *beneath* the cells. Coloured
290
+ markers answer "which cells express this gene"; they do not answer "where is it
291
+ expressed", because the eye cannot integrate thousands of small dots into a
292
+ territory. The field is the kernel-weighted **mean per cell, not a sum** — a sum
293
+ would make a crowded region glow whatever its cells were doing — and smoothing the
294
+ numerator and denominator together spreads *where*, not *how much*. That
295
+ denominator is also what lets the layer say nothing: where no cell was measured the
296
+ mean is undefined rather than zero, so those pixels stay fully transparent instead
297
+ of taking the colormap's low end, and alpha ramps with local support so a thinly
298
+ sampled pixel reads as tentative. `Smoothing` sets the kernel σ; `Map opacity` is
299
+ the field's own opacity, separate from the markers' — turn the markers down to read
300
+ the field under them. On a volume-backed dataset the field is re-estimated per
301
+ plane from that plane's cells.
302
+
303
+ Colour it through `getSpatialControls()`:
304
+
305
+ ```ts
306
+ const controls = viz.getSpatialControls(); // null unless a port is bound
307
+ controls?.colorByColumn('region'); // categorical -> the column's palette
308
+ controls?.colorByFeature('Ttr'); // gene -> colormap, log, percentile-clipped
309
+ controls?.setViewState({ pointScale: 2 });
310
+ ```
311
+
312
+ The view state lives in the shared store, so the controls work before any
313
+ backend has mounted and survive a plot-type switch.
314
+
315
+ The [example server](examples/tile-server/README.md#spatial-omics-endpoints)
316
+ implements the endpoints, and `npm run make-spatial-demo` generates a synthetic
317
+ Visium-geometry dataset **and a matching tissue image** so the
318
+ [browser example](examples/browser-image/README.md#spatial-omics-demo) runs the
319
+ whole path with no download. A converter for real SpatialData Zarr stores ships
320
+ alongside it.
321
+
322
+ A **Spatial omics** controls panel (`<spatial-controls>`, opened from the
323
+ toolbar) drives all of this from the UI: a column dropdown, a gene search over
324
+ the feature panel, a legend for categorical colourings and a colour bar for
325
+ continuous ones, plus point-size, opacity, log-scale and outlier-clip controls.
326
+ Its legend swatches and colour bar are built with the same functions the
327
+ renderer uses, so the key cannot drift from the canvas.
328
+
329
+ **Selection** reuses the region tools you already have: draw a rectangle,
330
+ polygon, freehand shape, wand or brush region, then *Select from ROIs* selects
331
+ every observation inside their union and mutes the rest. Legend rows select
332
+ their category on click.
333
+
334
+ **Linked distributions** sit in the same panel, below the colour controls, over
335
+ whatever the map is coloured by: histogram, violin or box for a continuous column
336
+ or a gene, and per-category **counts** for a categorical one — a histogram of a
337
+ category code would be meaningless, but "how many cells per class" is the question
338
+ the legend implies and never answers. Violin and box are splittable by a
339
+ categorical column. One dialog on purpose — changing the gene
340
+ and watching the distribution move is a single action. They follow the selection: the histogram
341
+ overlays *Selected* on the full distribution, violin and box narrow to it. The
342
+ chart's subject is the map's colour source rather than an independent picker, so
343
+ the two cannot disagree about what is being shown.
344
+
345
+ Categorical colouring has one renderer-specific limit worth knowing: the 3D
346
+ points layer maps a per-point scalar through a 256-entry LUT, which keeps 96
347
+ blocks apart exactly — one of them reserved for a missing value, so **95
348
+ categories** fit — and above that the cloud draws flat and the panel says so.
349
+ The 2D markers (per-point RGBA) and the density volumes (a scalar field per
350
+ cluster) have no such limit — which is why the example server serves `subclass`
351
+ (338) even though the cloud cannot colour by it.
352
+
353
+ Still to build: hover tooltips, chart → map brushing, and a GPU layer for cell
354
+ boundary polygons (they are served, not yet drawn) — see
355
+ [docs/spatial-omics-plot-mode-design.md](docs/spatial-omics-plot-mode-design.md).
356
+
167
357
  ## Regions & annotation
168
358
 
169
359
  Regions are stored in a shared **region store** and use a GeoJSON-friendly model
@@ -241,11 +431,11 @@ once per image; the decoder runs per prompt). The registry lives in
241
431
 
242
432
  | Picker id | Domain | Encoder | Runs on | HF model |
243
433
  |---|---|---|---|---|
244
- | `microsam-vit-t-lm` *(default)* | light microscopy | TinyViT, ~14 MB fp16 | WASM¹ | [Ballon999/microsam-vit-t-lm-onnx](https://huggingface.co/Ballon999/microsam-vit-t-lm-onnx) |
245
- | `microsam-vit-b-lm` | light microscopy | ViT-B, ~172 MB fp16 | WebGPU | [Ballon999/microsam-vit-b-lm-onnx](https://huggingface.co/Ballon999/microsam-vit-b-lm-onnx) |
246
- | `patho-sam-vit-b` | histopathology (H&E) | ViT-B, ~172 MB fp16 | WebGPU | [Ballon999/patho-sam-vit-b-onnx](https://huggingface.co/Ballon999/patho-sam-vit-b-onnx) |
247
- | `patho-sam-vit-b-int8` | histopathology (H&E) | ViT-B, ~100 MB int8 | WASM | [Ballon999/patho-sam-vit-b-onnx](https://huggingface.co/Ballon999/patho-sam-vit-b-onnx) (`encoder.int8.onnx`) |
248
- | cellpose-SAM *(automatic)* | cells (generalist) | SAM ViT + flow head | WebGPU/WASM | [ballon999/cellpose-sam-onnx](https://huggingface.co/ballon999/cellpose-sam-onnx) |
434
+ | `microsam-vit-t-lm` *(default)* | light microscopy | TinyViT, ~14 MB fp16 | WASM¹ | [jax-image-tools/microsam-vit-t-lm-onnx](https://huggingface.co/jax-image-tools/microsam-vit-t-lm-onnx) |
435
+ | `microsam-vit-b-lm` | light microscopy | ViT-B, ~172 MB fp16 | WebGPU | [jax-image-tools/microsam-vit-b-lm-onnx](https://huggingface.co/jax-image-tools/microsam-vit-b-lm-onnx) |
436
+ | `patho-sam-vit-b` | histopathology (H&E) | ViT-B, ~172 MB fp16 | WebGPU | [jax-image-tools/patho-sam-vit-b-onnx](https://huggingface.co/jax-image-tools/patho-sam-vit-b-onnx) |
437
+ | `patho-sam-vit-b-int8` | histopathology (H&E) | ViT-B, ~100 MB int8 | WASM | [jax-image-tools/patho-sam-vit-b-onnx](https://huggingface.co/jax-image-tools/patho-sam-vit-b-onnx) (`encoder.int8.onnx`) |
438
+ | cellpose-SAM *(automatic)* | cells (generalist) | SAM ViT + flow head | WebGPU/WASM | [jax-image-tools/cellpose-sam-onnx](https://huggingface.co/jax-image-tools/cellpose-sam-onnx) |
249
439
 
250
440
  ¹ TinyViT's fp16 attention overflows on the onnxruntime-web WebGPU EP (returns an
251
441
  empty mask); it is numerically correct and fast on WASM, so its encoder is pinned
@@ -270,6 +460,16 @@ Work that is landed-but-unstable or planned (not yet available):
270
460
  and browser-side SAM/cellpose segmentation) against sample images — so the
271
461
  library can be evaluated and developed standalone, outside jit-ui. Tracked in
272
462
  the library-extraction SOW ([docs/JIT_UI_visualization_library_SOW.docx](docs/JIT_UI_visualization_library_SOW.docx)).
463
+ - **Spatial-omics follow-ons** *(planned — the modes themselves shipped in
464
+ 0.4.0, see [Spatial omics](#spatial-omics))* — hover tooltips over
465
+ observations, brushing a chart selection back onto the map, and a GPU shapes
466
+ layer for cell-boundary polygons (the example server serves them; nothing draws
467
+ them yet, since a DOM overlay will not hold 10⁴–10⁵ outlines). The GPU layer is
468
+ measured as feasible — generating the geometry in a compute pass is bit-exact
469
+ and ~16× faster than JS, and 10⁵–10⁶ outlines draw in single-digit
470
+ milliseconds; the constraint is napari-js's closed renderer, not WebGPU. See
471
+ [.planning/research/cell-boundary-polygons-webgpu.md](.planning/research/cell-boundary-polygons-webgpu.md)
472
+ and [docs/spatial-omics-plot-mode-design.md](docs/spatial-omics-plot-mode-design.md).
273
473
  - **SAM 3 model** *(planned)* — a `variant: 'sam3'` decoder path + export tooling
274
474
  (SAM 2/3 use a different mask I/O than the current SAM-v1 path). See
275
475
  [docs/sam-segmentation-design.md](docs/sam-segmentation-design.md).
@@ -284,6 +484,10 @@ Design, architecture, and planning docs for the library:
284
484
  - **[docs/sam-segmentation-design.md](docs/sam-segmentation-design.md)** — design of
285
485
  the browser SAM segmentation: model choice, ONNX export/quantization recipe,
286
486
  encoder/decoder I/O, the engine/session architecture, and the rollout phases.
487
+ - **[docs/spatial-omics-plot-mode-design.md](docs/spatial-omics-plot-mode-design.md)** —
488
+ design and phased plan for the spatial-omics plot mode: current-state audit,
489
+ what the CosMx / Spatial-Live / SpatialData references contribute, the data
490
+ plane, MoSCoW requirements, and the open questions still to settle.
287
491
  - **Architecture diagrams**
288
492
  - [docs/jit-ui-visualization-architecture.mmd](docs/jit-ui-visualization-architecture.mmd)
289
493
  ([PNG](docs/img/jit-ui-visualization-architecture.png) ·
@@ -366,8 +570,8 @@ cellpose adapter). Configure hosted SAM model URLs once at startup:
366
570
  import { setSamModelUrls } from '@jax-data-science/sci-image-visualizer';
367
571
 
368
572
  setSamModelUrls('microsam-vit-t-lm',
369
- 'https://huggingface.co/Ballon999/microsam-vit-t-lm-onnx/resolve/main/encoder.fp16.onnx',
370
- 'https://huggingface.co/Ballon999/microsam-vit-t-lm-onnx/resolve/main/decoder.onnx');
573
+ 'https://huggingface.co/jax-image-tools/microsam-vit-t-lm-onnx/resolve/main/encoder.fp16.onnx',
574
+ 'https://huggingface.co/jax-image-tools/microsam-vit-t-lm-onnx/resolve/main/decoder.onnx');
371
575
  ```
372
576
 
373
577
  `onnxruntime-web` WASM/JSEP sidecars must be served from `/assets/ort/`. See
package/esm2022/index.mjs CHANGED
@@ -12,6 +12,8 @@ export * from './lib/contracts/ports/image-state.port';
12
12
  export * from './lib/contracts/ports/tile-access.port';
13
13
  export * from './lib/contracts/ports/region-io.port';
14
14
  export * from './lib/contracts/ports/preferences.port';
15
+ export * from './lib/contracts/ports/spatial-data.port';
16
+ export * from './lib/contracts/spatial-dataset.contract';
15
17
  export * from './lib/contracts/channel-histogram-api.contract';
16
18
  export * from './lib/contracts/viz-config';
17
19
  export * from './lib/contracts/image.contract';
@@ -24,6 +26,18 @@ export * from './lib/contracts/display-types';
24
26
  export * from './lib/contracts/sam.contract';
25
27
  export * from './lib/contracts/cell-segmenter.contract';
26
28
  export { CellposeSegmenterService } from './lib/toolbar/segmentation/cellpose-segmenter.service';
29
+ // ── Spatial-omics data plane ─────────────────────────────────────────────
30
+ // The wire format the bundled example server speaks, plus a ready-made
31
+ // SpatialDataPort adapter for it. Both are OPTIONAL: a host with its own
32
+ // backend implements SpatialDataPort directly and imports neither.
33
+ export { SpatialDataHttpService, SupersededError } from './lib/implementations/spatial-data-http/spatial-data-http.service';
34
+ export { SPATIAL_WIRE_VERSION, isLittleEndian, assertManifestVersion, datasetFromManifest, decodeCoords, decodeRadius, decodeColumn, decodeFeatureVector, decodePolygons, } from './lib/implementations/spatial-data-http/spatial-wire';
35
+ // Backend-neutral encodings: columns/genes -> per-point colours and sizes.
36
+ export { encodeCategorical, encodeContinuous, resolveCategoryColors, contrastWindow, markerDiameters, toRgbaTuples, lutFor, DEFAULT_CATEGORICAL_PALETTE, DEFAULT_MUTED_OPACITY, MISSING_COLOR, } from './lib/spatial/spatial-encoding';
37
+ // Selection: which observations fall inside the drawn ROIs, and the shared store
38
+ // that holds the answer.
39
+ export { selectInRegions, selectByCategory, mutedFromSelection, pointInRing, emptySelection, countMask, maskToIndices, } from './lib/spatial/spatial-selection';
40
+ export { SpatialSelectionStore } from './lib/store/spatial-selection.service';
27
41
  export * from './lib/contracts/instance-segmenter.contract';
28
42
  export * from './lib/contracts/semantic-segmenter.contract';
29
43
  // ── Generic client-side image utilities (shared with the host's pipeline) ──
@@ -52,4 +66,9 @@ export { VisualizerComponent } from './lib/visualizer.component';
52
66
  export { RegionEditorComponent } from './lib/region-editor/region-editor.component';
53
67
  export { HexColorPickerComponent } from './lib/hex-color-picker/hex-color-picker.component';
54
68
  export { ChannelHistogramComponent } from './lib/channel-histogram/channel-histogram.component';
55
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsNEVBQTRFO0FBQzVFLGNBQWMscUNBQXFDLENBQUM7QUFDcEQsY0FBYyw0Q0FBNEMsQ0FBQztBQUMzRCxjQUFjLHdDQUF3QyxDQUFDO0FBQ3ZELGNBQWMsd0NBQXdDLENBQUM7QUFDdkQsY0FBYyxzQ0FBc0MsQ0FBQztBQUNyRCxjQUFjLHdDQUF3QyxDQUFDO0FBQ3ZELGNBQWMsZ0RBQWdELENBQUM7QUFDL0QsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLGdDQUFnQyxDQUFDO0FBQy9DLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLHVDQUF1QyxDQUFDO0FBQ3RELGNBQWMsdUNBQXVDLENBQUM7QUFDdEQsY0FBYyx5Q0FBeUMsQ0FBQztBQUN4RCxjQUFjLCtCQUErQixDQUFDO0FBQzlDLGNBQWMsOEJBQThCLENBQUM7QUFDN0MsY0FBYyx5Q0FBeUMsQ0FBQztBQUN4RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx1REFBdUQsQ0FBQztBQUNqRyxjQUFjLDZDQUE2QyxDQUFDO0FBQzVELGNBQWMsNkNBQTZDLENBQUM7QUFFNUQsOEVBQThFO0FBQzlFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsU0FBUyxFQUFvQixNQUFNLDZCQUE2QixDQUFDO0FBQzFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBRWpGLDZFQUE2RTtBQUM3RSxPQUFPLEVBQ0wsVUFBVSxFQUFFLG9CQUFvQixFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUMvRSxrQkFBa0IsRUFBRSxvQkFBb0IsR0FDekMsTUFBTSwrQ0FBK0MsQ0FBQztBQUV2RCw4RUFBOEU7QUFDOUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUUvRiw0RUFBNEU7QUFDNUUsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVwRCw0RUFBNEU7QUFDNUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDakUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDNUUsNkVBQTZFO0FBQzdFLG1FQUFtRTtBQUNuRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVuRSw2RUFBNkU7QUFDN0UsMEVBQTBFO0FBQzFFLDhFQUE4RTtBQUM5RSw2REFBNkQ7QUFDN0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDakUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDcEYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDNUYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0scURBQXFELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFB1YmxpYyBBUEkgb2YgdGhlIGpheC1pbWFnZS12aXN1YWxpemF0aW9uIGxpYnJhcnkuIEV4dGVybmFsIGNvbnN1bWVycyBpbXBvcnRcbiAqIE9OTFkgZnJvbSBoZXJlIChgQGpheC1kYXRhLXNjaWVuY2Uvc2NpLWltYWdlLXZpc3VhbGl6ZXJgKTsgZXZlcnl0aGluZyBlbHNlIHVuZGVyIGBsaWIvYCBpc1xuICogaW50ZXJuYWwuIFRoZSBzdXJmYWNlIGlzIGNvbnRyYWN0cyArIHRva2VucyArIG5ldXRyYWwgbW9kZWxzICsgdGhlIEFuZ3VsYXJcbiAqIG1vZHVsZSwgcGx1cyB0aGUgcm91dGluZyBzZXJ2aWNlIHRoZSBob3N0J3MgY29tcG9zaXRpb24gcm9vdCBiaW5kcyB0aGUgdG9rZW5zXG4gKiB0byAoYHVzZUV4aXN0aW5nYCkuXG4gKi9cblxuLy8g4pSA4pSAIENvbnRyYWN0cyAmIERJIHRva2VucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy92aXN1YWxpemVyLmNvbnRyYWN0JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9yZWdpb24tZWRpdG9yLWFwaS5jb250cmFjdCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250cmFjdHMvcG9ydHMvaW1hZ2Utc3RhdGUucG9ydCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250cmFjdHMvcG9ydHMvdGlsZS1hY2Nlc3MucG9ydCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250cmFjdHMvcG9ydHMvcmVnaW9uLWlvLnBvcnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL3BvcnRzL3ByZWZlcmVuY2VzLnBvcnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL2NoYW5uZWwtaGlzdG9ncmFtLWFwaS5jb250cmFjdCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250cmFjdHMvdml6LWNvbmZpZyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250cmFjdHMvaW1hZ2UuY29udHJhY3QnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL3Bsb3QtdHlwZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250cmFjdHMvdG9vbGJhci1jb25maWcnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL3Rvb2xiYXItdG9vbC5jb250cmFjdCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250cmFjdHMvY2FwYWJpbGl0aWVzLmNvbnRyYWN0JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9yZWdpb24tb3ZlcmxheS5jb250cmFjdCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250cmFjdHMvc2FtLmNvbnRyYWN0JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9jZWxsLXNlZ21lbnRlci5jb250cmFjdCc7XG5leHBvcnQgeyBDZWxscG9zZVNlZ21lbnRlclNlcnZpY2UgfSBmcm9tICcuL2xpYi90b29sYmFyL3NlZ21lbnRhdGlvbi9jZWxscG9zZS1zZWdtZW50ZXIuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250cmFjdHMvaW5zdGFuY2Utc2VnbWVudGVyLmNvbnRyYWN0JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9zZW1hbnRpYy1zZWdtZW50ZXIuY29udHJhY3QnO1xuXG4vLyDilIDilIAgR2VuZXJpYyBjbGllbnQtc2lkZSBpbWFnZSB1dGlsaXRpZXMgKHNoYXJlZCB3aXRoIHRoZSBob3N0J3MgcGlwZWxpbmUpIOKUgOKUgFxuZXhwb3J0IHsgUHJvY2Vzc2luZ0ltYWdlIH0gZnJvbSAnLi9saWIvcHJvY2Vzc2luZy9wcm9jZXNzaW5nLWltYWdlJztcbmV4cG9ydCB7IGNyb3BJbWFnZSwgQ3JvcEltYWdlT3B0aW9ucyB9IGZyb20gJy4vbGliL3Byb2Nlc3NpbmcvaW1hZ2UtY3JvcCc7XG5leHBvcnQgeyBJbWFnZUNvbnZlcnRlclNlcnZpY2UgfSBmcm9tICcuL2xpYi9wcm9jZXNzaW5nL2ltYWdlLWNvbnZlcnRlci5zZXJ2aWNlJztcblxuLy8g4pSA4pSAIFNBTSBtb2RlbCByZWdpc3RyeSAoaG9zdCBjb25maWd1cmVzIGhvc3RlZCBPTk5YIFVSTHMgb25jZSBhdmFpbGFibGUpIOKUgOKUgFxuZXhwb3J0IHtcbiAgU0FNX01PREVMUywgREVGQVVMVF9TQU1fTU9ERUxfSUQsIGdldFNhbU1vZGVsLCBpc1NhbU1vZGVsUmVhZHksIHNldFNhbU1vZGVsVXJscyxcbiAgc2V0RGVmYXVsdFNhbU1vZGVsLCBnZXREZWZhdWx0U2FtTW9kZWxJZCxcbn0gZnJvbSAnLi9saWIvdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLW1vZGVsLXJlZ2lzdHJ5JztcblxuLy8g4pSA4pSAIG9ubnhydW50aW1lLXdlYiBXQVNNIGxvY2F0aW9uIChob3N0IG92ZXJyaWRlcyBvbmNlLCBhdCBhcHAgaW5pdCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5leHBvcnQgeyBzZXRPcnRXYXNtQmFzZSwgZ2V0T3J0V2FzbUJhc2UgfSBmcm9tICcuL2xpYi90b29sYmFyL3NlZ21lbnRhdGlvbi9vcnQtcnVudGltZS1jb25maWcnO1xuXG4vLyDilIDilIAgTmV1dHJhbCBkYXRhIG1vZGVscyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVscy9yZWdpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvbW9kZWxzL2NsYXNzLXByZXNldCc7XG5leHBvcnQgeyBTaGFwZVNlbGVjdGlvbiB9IGZyb20gJy4vbGliL21vZGVscy9zaGFwZSc7XG5cbi8vIOKUgOKUgCBBbmd1bGFyIG1vZHVsZSArIGNvbXBvc2l0aW9uLXJvb3Qgc2VydmljZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbmV4cG9ydCB7IFZpc3VhbGl6YXRpb25Nb2R1bGUgfSBmcm9tICcuL2xpYi92aXN1YWxpemF0aW9uLm1vZHVsZSc7XG5leHBvcnQgeyBSb3V0aW5nVmlzdWFsaXplclNlcnZpY2UgfSBmcm9tICcuL2xpYi9yb3V0aW5nLXZpc3VhbGl6ZXIuc2VydmljZSc7XG4vLyBQcm92aWRlciBmYWN0b3J5IGZvciBhbiBpc29sYXRlZCwgY29tcG9uZW50LXNjb3BlZCB2aWV3ZXIgaW5zdGFuY2UgKGUuZy4gYVxuLy8gbW9kYWwgdGhhdCBtdXN0IG5vdCBzaGFyZSB0aGUgbWFpbiB2aWV3ZXIncyByZWdpb24vaW1hZ2Ugc3RhdGUpLlxuZXhwb3J0IHsgcHJvdmlkZVZpc3VhbGl6YXRpb24gfSBmcm9tICcuL2xpYi9wcm92aWRlLXZpc3VhbGl6YXRpb24nO1xuXG4vLyDilIDilIAgUHVibGljIGNvbXBvbmVudHMgKGV4cG9ydGVkIGJ5IFZpc3VhbGl6YXRpb25Nb2R1bGUpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gbmctcGFja2FnciByZXF1aXJlcyBtb2R1bGUtZXhwb3J0ZWQgY29tcG9uZW50cyB0byBiZSByZWFjaGFibGUgZnJvbSB0aGVcbi8vIGVudHJ5IHBvaW50IHNvIGNvbnN1bWVycyBnZXQgdGhlaXIgdHlwZXM7IHRoZXNlIGFyZSB0aGUgZW1iZWRkYWJsZSBlbGVtZW50c1xuLy8gKGA8dmlzdWFsaXplcj5gLCBgPHJlZ2lvbi1lZGl0b3I+YCwgYDxoZXgtY29sb3ItcGlja2VyPmApLlxuZXhwb3J0IHsgVmlzdWFsaXplckNvbXBvbmVudCB9IGZyb20gJy4vbGliL3Zpc3VhbGl6ZXIuY29tcG9uZW50JztcbmV4cG9ydCB7IFJlZ2lvbkVkaXRvckNvbXBvbmVudCB9IGZyb20gJy4vbGliL3JlZ2lvbi1lZGl0b3IvcmVnaW9uLWVkaXRvci5jb21wb25lbnQnO1xuZXhwb3J0IHsgSGV4Q29sb3JQaWNrZXJDb21wb25lbnQgfSBmcm9tICcuL2xpYi9oZXgtY29sb3ItcGlja2VyL2hleC1jb2xvci1waWNrZXIuY29tcG9uZW50JztcbmV4cG9ydCB7IENoYW5uZWxIaXN0b2dyYW1Db21wb25lbnQgfSBmcm9tICcuL2xpYi9jaGFubmVsLWhpc3RvZ3JhbS9jaGFubmVsLWhpc3RvZ3JhbS5jb21wb25lbnQnO1xuIl19
69
+ export { SpatialControlsComponent, } from './lib/spatial-controls/spatial-controls.component';
70
+ export { SpatialChartsComponent } from './lib/spatial-controls/spatial-charts/spatial-charts.component';
71
+ // Pure chart builders, exported so a host can render the same distributions
72
+ // wherever it likes (a report, a different charting surface).
73
+ export { buildOmicsTraces, omicsLayout, benefitsFromGrouping, } from './lib/implementations/plotly/omics-trace-builders';
74
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsNEVBQTRFO0FBQzVFLGNBQWMscUNBQXFDLENBQUM7QUFDcEQsY0FBYyw0Q0FBNEMsQ0FBQztBQUMzRCxjQUFjLHdDQUF3QyxDQUFDO0FBQ3ZELGNBQWMsd0NBQXdDLENBQUM7QUFDdkQsY0FBYyxzQ0FBc0MsQ0FBQztBQUNyRCxjQUFjLHdDQUF3QyxDQUFDO0FBQ3ZELGNBQWMseUNBQXlDLENBQUM7QUFDeEQsY0FBYywwQ0FBMEMsQ0FBQztBQUN6RCxjQUFjLGdEQUFnRCxDQUFDO0FBQy9ELGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsY0FBYyx1Q0FBdUMsQ0FBQztBQUN0RCxjQUFjLHVDQUF1QyxDQUFDO0FBQ3RELGNBQWMseUNBQXlDLENBQUM7QUFDeEQsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMseUNBQXlDLENBQUM7QUFDeEQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFFakcsNEVBQTRFO0FBQzVFLHVFQUF1RTtBQUN2RSx5RUFBeUU7QUFDekUsbUVBQW1FO0FBQ25FLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxtRUFBbUUsQ0FBQztBQUM1SCxPQUFPLEVBQ0wsb0JBQW9CLEVBQUUsY0FBYyxFQUFFLHFCQUFxQixFQUFFLG1CQUFtQixFQUNoRixZQUFZLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxjQUFjLEdBQzlFLE1BQU0sc0RBQXNELENBQUM7QUFJOUQsMkVBQTJFO0FBQzNFLE9BQU8sRUFDTCxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxxQkFBcUIsRUFBRSxjQUFjLEVBQzFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUNyQywyQkFBMkIsRUFBRSxxQkFBcUIsRUFBRSxhQUFhLEdBQ2xFLE1BQU0sZ0NBQWdDLENBQUM7QUFJeEMsaUZBQWlGO0FBQ2pGLHlCQUF5QjtBQUN6QixPQUFPLEVBQ0wsZUFBZSxFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLFdBQVcsRUFDbEUsY0FBYyxFQUFFLFNBQVMsRUFBRSxhQUFhLEdBQ3pDLE1BQU0saUNBQWlDLENBQUM7QUFFekMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDOUUsY0FBYyw2Q0FBNkMsQ0FBQztBQUM1RCxjQUFjLDZDQUE2QyxDQUFDO0FBRTVELDhFQUE4RTtBQUM5RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLFNBQVMsRUFBb0IsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUVqRiw2RUFBNkU7QUFDN0UsT0FBTyxFQUNMLFVBQVUsRUFBRSxvQkFBb0IsRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFDL0Usa0JBQWtCLEVBQUUsb0JBQW9CLEdBQ3pDLE1BQU0sK0NBQStDLENBQUM7QUFFdkQsOEVBQThFO0FBQzlFLE9BQU8sRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFFL0YsNEVBQTRFO0FBQzVFLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFcEQsNEVBQTRFO0FBQzVFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQzVFLDZFQUE2RTtBQUM3RSxtRUFBbUU7QUFDbkUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFbkUsNkVBQTZFO0FBQzdFLDBFQUEwRTtBQUMxRSw4RUFBOEU7QUFDOUUsNkRBQTZEO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQzVGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQ2hHLE9BQU8sRUFDTCx3QkFBd0IsR0FDekIsTUFBTSxtREFBbUQsQ0FBQztBQUUzRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnRUFBZ0UsQ0FBQztBQUN4Ryw0RUFBNEU7QUFDNUUsOERBQThEO0FBQzlELE9BQU8sRUFDTCxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsb0JBQW9CLEdBQ3BELE1BQU0sbURBQW1ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFB1YmxpYyBBUEkgb2YgdGhlIGpheC1pbWFnZS12aXN1YWxpemF0aW9uIGxpYnJhcnkuIEV4dGVybmFsIGNvbnN1bWVycyBpbXBvcnRcbiAqIE9OTFkgZnJvbSBoZXJlIChgQGpheC1kYXRhLXNjaWVuY2Uvc2NpLWltYWdlLXZpc3VhbGl6ZXJgKTsgZXZlcnl0aGluZyBlbHNlIHVuZGVyIGBsaWIvYCBpc1xuICogaW50ZXJuYWwuIFRoZSBzdXJmYWNlIGlzIGNvbnRyYWN0cyArIHRva2VucyArIG5ldXRyYWwgbW9kZWxzICsgdGhlIEFuZ3VsYXJcbiAqIG1vZHVsZSwgcGx1cyB0aGUgcm91dGluZyBzZXJ2aWNlIHRoZSBob3N0J3MgY29tcG9zaXRpb24gcm9vdCBiaW5kcyB0aGUgdG9rZW5zXG4gKiB0byAoYHVzZUV4aXN0aW5nYCkuXG4gKi9cblxuLy8g4pSA4pSAIENvbnRyYWN0cyAmIERJIHRva2VucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy92aXN1YWxpemVyLmNvbnRyYWN0JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9yZWdpb24tZWRpdG9yLWFwaS5jb250cmFjdCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250cmFjdHMvcG9ydHMvaW1hZ2Utc3RhdGUucG9ydCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250cmFjdHMvcG9ydHMvdGlsZS1hY2Nlc3MucG9ydCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250cmFjdHMvcG9ydHMvcmVnaW9uLWlvLnBvcnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL3BvcnRzL3ByZWZlcmVuY2VzLnBvcnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL3BvcnRzL3NwYXRpYWwtZGF0YS5wb3J0JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL2NoYW5uZWwtaGlzdG9ncmFtLWFwaS5jb250cmFjdCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250cmFjdHMvdml6LWNvbmZpZyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250cmFjdHMvaW1hZ2UuY29udHJhY3QnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL3Bsb3QtdHlwZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250cmFjdHMvdG9vbGJhci1jb25maWcnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL3Rvb2xiYXItdG9vbC5jb250cmFjdCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250cmFjdHMvY2FwYWJpbGl0aWVzLmNvbnRyYWN0JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9yZWdpb24tb3ZlcmxheS5jb250cmFjdCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250cmFjdHMvc2FtLmNvbnRyYWN0JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9jZWxsLXNlZ21lbnRlci5jb250cmFjdCc7XG5leHBvcnQgeyBDZWxscG9zZVNlZ21lbnRlclNlcnZpY2UgfSBmcm9tICcuL2xpYi90b29sYmFyL3NlZ21lbnRhdGlvbi9jZWxscG9zZS1zZWdtZW50ZXIuc2VydmljZSc7XG5cbi8vIOKUgOKUgCBTcGF0aWFsLW9taWNzIGRhdGEgcGxhbmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBUaGUgd2lyZSBmb3JtYXQgdGhlIGJ1bmRsZWQgZXhhbXBsZSBzZXJ2ZXIgc3BlYWtzLCBwbHVzIGEgcmVhZHktbWFkZVxuLy8gU3BhdGlhbERhdGFQb3J0IGFkYXB0ZXIgZm9yIGl0LiBCb3RoIGFyZSBPUFRJT05BTDogYSBob3N0IHdpdGggaXRzIG93blxuLy8gYmFja2VuZCBpbXBsZW1lbnRzIFNwYXRpYWxEYXRhUG9ydCBkaXJlY3RseSBhbmQgaW1wb3J0cyBuZWl0aGVyLlxuZXhwb3J0IHsgU3BhdGlhbERhdGFIdHRwU2VydmljZSwgU3VwZXJzZWRlZEVycm9yIH0gZnJvbSAnLi9saWIvaW1wbGVtZW50YXRpb25zL3NwYXRpYWwtZGF0YS1odHRwL3NwYXRpYWwtZGF0YS1odHRwLnNlcnZpY2UnO1xuZXhwb3J0IHtcbiAgU1BBVElBTF9XSVJFX1ZFUlNJT04sIGlzTGl0dGxlRW5kaWFuLCBhc3NlcnRNYW5pZmVzdFZlcnNpb24sIGRhdGFzZXRGcm9tTWFuaWZlc3QsXG4gIGRlY29kZUNvb3JkcywgZGVjb2RlUmFkaXVzLCBkZWNvZGVDb2x1bW4sIGRlY29kZUZlYXR1cmVWZWN0b3IsIGRlY29kZVBvbHlnb25zLFxufSBmcm9tICcuL2xpYi9pbXBsZW1lbnRhdGlvbnMvc3BhdGlhbC1kYXRhLWh0dHAvc3BhdGlhbC13aXJlJztcbmV4cG9ydCB0eXBlIHtcbiAgU3BhdGlhbE1hbmlmZXN0LCBTcGF0aWFsRGF0YXNldFN1bW1hcnksIFNwYXRpYWxSYWRpdXNTcGVjLFxufSBmcm9tICcuL2xpYi9pbXBsZW1lbnRhdGlvbnMvc3BhdGlhbC1kYXRhLWh0dHAvc3BhdGlhbC13aXJlJztcbi8vIEJhY2tlbmQtbmV1dHJhbCBlbmNvZGluZ3M6IGNvbHVtbnMvZ2VuZXMgLT4gcGVyLXBvaW50IGNvbG91cnMgYW5kIHNpemVzLlxuZXhwb3J0IHtcbiAgZW5jb2RlQ2F0ZWdvcmljYWwsIGVuY29kZUNvbnRpbnVvdXMsIHJlc29sdmVDYXRlZ29yeUNvbG9ycywgY29udHJhc3RXaW5kb3csXG4gIG1hcmtlckRpYW1ldGVycywgdG9SZ2JhVHVwbGVzLCBsdXRGb3IsXG4gIERFRkFVTFRfQ0FURUdPUklDQUxfUEFMRVRURSwgREVGQVVMVF9NVVRFRF9PUEFDSVRZLCBNSVNTSU5HX0NPTE9SLFxufSBmcm9tICcuL2xpYi9zcGF0aWFsL3NwYXRpYWwtZW5jb2RpbmcnO1xuZXhwb3J0IHR5cGUge1xuICBSR0JBLCBDYXRlZ29yaWNhbEVuY29kaW5nT3B0aW9ucywgQ29udGludW91c0VuY29kaW5nT3B0aW9ucyxcbn0gZnJvbSAnLi9saWIvc3BhdGlhbC9zcGF0aWFsLWVuY29kaW5nJztcbi8vIFNlbGVjdGlvbjogd2hpY2ggb2JzZXJ2YXRpb25zIGZhbGwgaW5zaWRlIHRoZSBkcmF3biBST0lzLCBhbmQgdGhlIHNoYXJlZCBzdG9yZVxuLy8gdGhhdCBob2xkcyB0aGUgYW5zd2VyLlxuZXhwb3J0IHtcbiAgc2VsZWN0SW5SZWdpb25zLCBzZWxlY3RCeUNhdGVnb3J5LCBtdXRlZEZyb21TZWxlY3Rpb24sIHBvaW50SW5SaW5nLFxuICBlbXB0eVNlbGVjdGlvbiwgY291bnRNYXNrLCBtYXNrVG9JbmRpY2VzLFxufSBmcm9tICcuL2xpYi9zcGF0aWFsL3NwYXRpYWwtc2VsZWN0aW9uJztcbmV4cG9ydCB0eXBlIHsgU3BhdGlhbFNlbGVjdGlvbk1hc2sgfSBmcm9tICcuL2xpYi9zcGF0aWFsL3NwYXRpYWwtc2VsZWN0aW9uJztcbmV4cG9ydCB7IFNwYXRpYWxTZWxlY3Rpb25TdG9yZSB9IGZyb20gJy4vbGliL3N0b3JlL3NwYXRpYWwtc2VsZWN0aW9uLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL2luc3RhbmNlLXNlZ21lbnRlci5jb250cmFjdCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250cmFjdHMvc2VtYW50aWMtc2VnbWVudGVyLmNvbnRyYWN0JztcblxuLy8g4pSA4pSAIEdlbmVyaWMgY2xpZW50LXNpZGUgaW1hZ2UgdXRpbGl0aWVzIChzaGFyZWQgd2l0aCB0aGUgaG9zdCdzIHBpcGVsaW5lKSDilIDilIBcbmV4cG9ydCB7IFByb2Nlc3NpbmdJbWFnZSB9IGZyb20gJy4vbGliL3Byb2Nlc3NpbmcvcHJvY2Vzc2luZy1pbWFnZSc7XG5leHBvcnQgeyBjcm9wSW1hZ2UsIENyb3BJbWFnZU9wdGlvbnMgfSBmcm9tICcuL2xpYi9wcm9jZXNzaW5nL2ltYWdlLWNyb3AnO1xuZXhwb3J0IHsgSW1hZ2VDb252ZXJ0ZXJTZXJ2aWNlIH0gZnJvbSAnLi9saWIvcHJvY2Vzc2luZy9pbWFnZS1jb252ZXJ0ZXIuc2VydmljZSc7XG5cbi8vIOKUgOKUgCBTQU0gbW9kZWwgcmVnaXN0cnkgKGhvc3QgY29uZmlndXJlcyBob3N0ZWQgT05OWCBVUkxzIG9uY2UgYXZhaWxhYmxlKSDilIDilIBcbmV4cG9ydCB7XG4gIFNBTV9NT0RFTFMsIERFRkFVTFRfU0FNX01PREVMX0lELCBnZXRTYW1Nb2RlbCwgaXNTYW1Nb2RlbFJlYWR5LCBzZXRTYW1Nb2RlbFVybHMsXG4gIHNldERlZmF1bHRTYW1Nb2RlbCwgZ2V0RGVmYXVsdFNhbU1vZGVsSWQsXG59IGZyb20gJy4vbGliL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3NhbS1tb2RlbC1yZWdpc3RyeSc7XG5cbi8vIOKUgOKUgCBvbm54cnVudGltZS13ZWIgV0FTTSBsb2NhdGlvbiAoaG9zdCBvdmVycmlkZXMgb25jZSwgYXQgYXBwIGluaXQpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuZXhwb3J0IHsgc2V0T3J0V2FzbUJhc2UsIGdldE9ydFdhc21CYXNlIH0gZnJvbSAnLi9saWIvdG9vbGJhci9zZWdtZW50YXRpb24vb3J0LXJ1bnRpbWUtY29uZmlnJztcblxuLy8g4pSA4pSAIE5ldXRyYWwgZGF0YSBtb2RlbHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5leHBvcnQgKiBmcm9tICcuL2xpYi9tb2RlbHMvcmVnaW9uJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVscy9jbGFzcy1wcmVzZXQnO1xuZXhwb3J0IHsgU2hhcGVTZWxlY3Rpb24gfSBmcm9tICcuL2xpYi9tb2RlbHMvc2hhcGUnO1xuXG4vLyDilIDilIAgQW5ndWxhciBtb2R1bGUgKyBjb21wb3NpdGlvbi1yb290IHNlcnZpY2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5leHBvcnQgeyBWaXN1YWxpemF0aW9uTW9kdWxlIH0gZnJvbSAnLi9saWIvdmlzdWFsaXphdGlvbi5tb2R1bGUnO1xuZXhwb3J0IHsgUm91dGluZ1Zpc3VhbGl6ZXJTZXJ2aWNlIH0gZnJvbSAnLi9saWIvcm91dGluZy12aXN1YWxpemVyLnNlcnZpY2UnO1xuLy8gUHJvdmlkZXIgZmFjdG9yeSBmb3IgYW4gaXNvbGF0ZWQsIGNvbXBvbmVudC1zY29wZWQgdmlld2VyIGluc3RhbmNlIChlLmcuIGFcbi8vIG1vZGFsIHRoYXQgbXVzdCBub3Qgc2hhcmUgdGhlIG1haW4gdmlld2VyJ3MgcmVnaW9uL2ltYWdlIHN0YXRlKS5cbmV4cG9ydCB7IHByb3ZpZGVWaXN1YWxpemF0aW9uIH0gZnJvbSAnLi9saWIvcHJvdmlkZS12aXN1YWxpemF0aW9uJztcblxuLy8g4pSA4pSAIFB1YmxpYyBjb21wb25lbnRzIChleHBvcnRlZCBieSBWaXN1YWxpemF0aW9uTW9kdWxlKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIG5nLXBhY2thZ3IgcmVxdWlyZXMgbW9kdWxlLWV4cG9ydGVkIGNvbXBvbmVudHMgdG8gYmUgcmVhY2hhYmxlIGZyb20gdGhlXG4vLyBlbnRyeSBwb2ludCBzbyBjb25zdW1lcnMgZ2V0IHRoZWlyIHR5cGVzOyB0aGVzZSBhcmUgdGhlIGVtYmVkZGFibGUgZWxlbWVudHNcbi8vIChgPHZpc3VhbGl6ZXI+YCwgYDxyZWdpb24tZWRpdG9yPmAsIGA8aGV4LWNvbG9yLXBpY2tlcj5gKS5cbmV4cG9ydCB7IFZpc3VhbGl6ZXJDb21wb25lbnQgfSBmcm9tICcuL2xpYi92aXN1YWxpemVyLmNvbXBvbmVudCc7XG5leHBvcnQgeyBSZWdpb25FZGl0b3JDb21wb25lbnQgfSBmcm9tICcuL2xpYi9yZWdpb24tZWRpdG9yL3JlZ2lvbi1lZGl0b3IuY29tcG9uZW50JztcbmV4cG9ydCB7IEhleENvbG9yUGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi9saWIvaGV4LWNvbG9yLXBpY2tlci9oZXgtY29sb3ItcGlja2VyLmNvbXBvbmVudCc7XG5leHBvcnQgeyBDaGFubmVsSGlzdG9ncmFtQ29tcG9uZW50IH0gZnJvbSAnLi9saWIvY2hhbm5lbC1oaXN0b2dyYW0vY2hhbm5lbC1oaXN0b2dyYW0uY29tcG9uZW50JztcbmV4cG9ydCB7XG4gIFNwYXRpYWxDb250cm9sc0NvbXBvbmVudCxcbn0gZnJvbSAnLi9saWIvc3BhdGlhbC1jb250cm9scy9zcGF0aWFsLWNvbnRyb2xzLmNvbXBvbmVudCc7XG5leHBvcnQgdHlwZSB7IFNwYXRpYWxMZWdlbmRFbnRyeSB9IGZyb20gJy4vbGliL3NwYXRpYWwtY29udHJvbHMvc3BhdGlhbC1jb250cm9scy5jb21wb25lbnQnO1xuZXhwb3J0IHsgU3BhdGlhbENoYXJ0c0NvbXBvbmVudCB9IGZyb20gJy4vbGliL3NwYXRpYWwtY29udHJvbHMvc3BhdGlhbC1jaGFydHMvc3BhdGlhbC1jaGFydHMuY29tcG9uZW50Jztcbi8vIFB1cmUgY2hhcnQgYnVpbGRlcnMsIGV4cG9ydGVkIHNvIGEgaG9zdCBjYW4gcmVuZGVyIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbnNcbi8vIHdoZXJldmVyIGl0IGxpa2VzIChhIHJlcG9ydCwgYSBkaWZmZXJlbnQgY2hhcnRpbmcgc3VyZmFjZSkuXG5leHBvcnQge1xuICBidWlsZE9taWNzVHJhY2VzLCBvbWljc0xheW91dCwgYmVuZWZpdHNGcm9tR3JvdXBpbmcsXG59IGZyb20gJy4vbGliL2ltcGxlbWVudGF0aW9ucy9wbG90bHkvb21pY3MtdHJhY2UtYnVpbGRlcnMnO1xuZXhwb3J0IHR5cGUge1xuICBPbWljc0NoYXJ0S2luZCwgT21pY3NHcm91cGluZywgT21pY3NUcmFjZUlucHV0LFxufSBmcm9tICcuL2xpYi9pbXBsZW1lbnRhdGlvbnMvcGxvdGx5L29taWNzLXRyYWNlLWJ1aWxkZXJzJztcbiJdfQ==
@@ -4,5 +4,23 @@
4
4
  * so existing hosts (which pass PrimeNG `TreeNode`s and plain option objects)
5
5
  * keep compiling unchanged while consumers finally get named shapes.
6
6
  */
7
- export {};
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzcGxheS10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY29udHJhY3RzL2Rpc3BsYXktdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0ciLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFB1YmxpY2F0aW9uLWNyaXRpY2FsIHR5cGVzIHRoYXQgd2VyZSBgYW55YCBvbiB0aGUgcHVibGljIGNvbnRyYWN0c1xuICogKHJlZmFjdG9yaW5nIHBsYW4sIFN0ZXAgNikuIERlbGliZXJhdGVseSBwZXJtaXNzaXZlIOKAlCBldmVyeSBmaWVsZCBvcHRpb25hbCDigJRcbiAqIHNvIGV4aXN0aW5nIGhvc3RzICh3aGljaCBwYXNzIFByaW1lTkcgYFRyZWVOb2RlYHMgYW5kIHBsYWluIG9wdGlvbiBvYmplY3RzKVxuICoga2VlcCBjb21waWxpbmcgdW5jaGFuZ2VkIHdoaWxlIGNvbnN1bWVycyBmaW5hbGx5IGdldCBuYW1lZCBzaGFwZXMuXG4gKi9cblxuLyoqIEEgY29sb3JtYXAgdmFsdWUgYXMgUGxvdGx5IHVuZGVyc3RhbmRzIGl0OiBhIGJ1aWx0LWluIHNjYWxlIG5hbWUgKGUuZy5cbiAqICAnVmlyaWRpcycpIG9yIGFuIGlubGluZSBhcnJheSBvZiBgW3N0b3AsIGNvbG9yXWAgcGFpcnMuICovXG5leHBvcnQgdHlwZSBDb2xvcm1hcFZhbHVlID0gc3RyaW5nIHwgQXJyYXk8W251bWJlciwgc3RyaW5nXT47XG5cbi8qKiBPbmUgbm9kZSBvZiB0aGUgY29sb3JtYXAgc2VsZWN0b3IgdHJlZSAoc3RydWN0dXJhbGx5IGNvbXBhdGlibGUgd2l0aCB0aGVcbiAqICBQcmltZU5HIGBUcmVlTm9kZWBzIHRoZSBob3N0IHBhc3Nlcyk6IGdyb3VwIG5vZGVzIGNhcnJ5IGBjaGlsZHJlbmAsIGxlYWZcbiAqICBub2RlcyBjYXJyeSB0aGUgc2NhbGUgaW4gYGRhdGEudmFsdWVgICgrIGEgcHJldmlldyBpbWFnZSBpbiBgZGF0YS5zcmNgKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29sb3JtYXBOb2RlIHtcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIGRhdGE/OiB7IHZhbHVlPzogQ29sb3JtYXBWYWx1ZTsgc3JjPzogc3RyaW5nIH07XG4gIGNoaWxkcmVuPzogQ29sb3JtYXBOb2RlW107XG59XG5cbi8qKiBNYWdpYy13YW5kIHBpeGVsLWNvbXBhcmlzb24gc3BhY2UuICovXG5leHBvcnQgdHlwZSBXYW5kVHlwZSA9ICdHUkFZJyB8ICdSR0InIHwgJ0xBQl9ESVNUQU5DRSc7XG5cbi8qKiBPcHRpb25zIGZvciB0aGUgbWFnaWMtd2FuZCB0b29sIChRdVBhdGgtc3R5bGUpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJV2FuZE9wdGlvbnMge1xuICB0eXBlPzogV2FuZFR5cGU7XG4gIC8qKiBHYXVzc2lhbiBzaWdtYSBhcHBsaWVkIHRvIHRoZSBwYXRjaCBiZWZvcmUgdGhyZXNob2xkaW5nLiAqL1xuICBzaWdtYT86IG51bWJlcjtcbiAgLyoqIEhpZ2hlciA9IHN0cmljdGVyIChzbWFsbGVyIHNlbGVjdGlvbikgZm9yIEdSQVkvUkdCOyBoaWdoZXIgPSBsb29zZXIgZm9yXG4gICAqICBMQUJfRElTVEFOQ0Ug4oCUIG1hdGNoZXMgUXVQYXRoLiAqL1xuICBzZW5zaXRpdml0eT86IG51bWJlcjtcbiAgLyoqIFNxdWFyZSBwYXRjaCBzaXplIGluIHBpeGVscyAobXVzdCBiZSBvZGQpLiAqL1xuICBwYXRjaFNpemU/OiBudW1iZXI7XG4gIC8qKiBXaGVuIHRydWUsIHNraXAgYmx1ci90aHJlc2hvbGQgYW5kIGZsb29kLWZpbGwgYXQgZXhhY3QtbWF0Y2hcbiAgICogIChDbWQvQ3RybC1jbGljayBpbiBRdVBhdGgpLiAqL1xuICBzaW1wbGVNb2RlPzogYm9vbGVhbjtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHRoZSBicnVzaCByZWdpb24gdG9vbCAoUXVQYXRoLXN0eWxlKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUJydXNoT3B0aW9ucyB7XG4gIC8qKiBCcnVzaCBkaWFtZXRlciBpbiBtYXRyaXggKGltYWdlKSBwaXhlbHMuICovXG4gIHNpemU/OiBudW1iZXI7XG59XG4iXX0=
7
+ export const DEFAULT_SPATIAL_VIEW = {
8
+ colorBy: null,
9
+ pointScale: 1,
10
+ opacity: 1,
11
+ logScale: false,
12
+ percentileClip: [0.01, 0.99],
13
+ continuousColormap: null,
14
+ showVolume: true,
15
+ volumeOpacity: 0.5,
16
+ showPoints: true,
17
+ pointSection: null,
18
+ densityVolume: false,
19
+ densitySmoothing: 1,
20
+ geneMap: false,
21
+ geneMapSection: null,
22
+ geneMapVolume: false,
23
+ geneMapSmoothing: 1,
24
+ geneMapOpacity: 0.85,
25
+ };
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzcGxheS10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY29udHJhY3RzL2Rpc3BsYXktdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUEyS0gsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQXFCO0lBQ3BELE9BQU8sRUFBRSxJQUFJO0lBQ2IsVUFBVSxFQUFFLENBQUM7SUFDYixPQUFPLEVBQUUsQ0FBQztJQUNWLFFBQVEsRUFBRSxLQUFLO0lBQ2YsY0FBYyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQztJQUM1QixrQkFBa0IsRUFBRSxJQUFJO0lBQ3hCLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLGFBQWEsRUFBRSxHQUFHO0lBQ2xCLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFlBQVksRUFBRSxJQUFJO0lBQ2xCLGFBQWEsRUFBRSxLQUFLO0lBQ3BCLGdCQUFnQixFQUFFLENBQUM7SUFDbkIsT0FBTyxFQUFFLEtBQUs7SUFDZCxjQUFjLEVBQUUsSUFBSTtJQUNwQixhQUFhLEVBQUUsS0FBSztJQUNwQixnQkFBZ0IsRUFBRSxDQUFDO0lBQ25CLGNBQWMsRUFBRSxJQUFJO0NBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFB1YmxpY2F0aW9uLWNyaXRpY2FsIHR5cGVzIHRoYXQgd2VyZSBgYW55YCBvbiB0aGUgcHVibGljIGNvbnRyYWN0c1xuICogKHJlZmFjdG9yaW5nIHBsYW4sIFN0ZXAgNikuIERlbGliZXJhdGVseSBwZXJtaXNzaXZlIOKAlCBldmVyeSBmaWVsZCBvcHRpb25hbCDigJRcbiAqIHNvIGV4aXN0aW5nIGhvc3RzICh3aGljaCBwYXNzIFByaW1lTkcgYFRyZWVOb2RlYHMgYW5kIHBsYWluIG9wdGlvbiBvYmplY3RzKVxuICoga2VlcCBjb21waWxpbmcgdW5jaGFuZ2VkIHdoaWxlIGNvbnN1bWVycyBmaW5hbGx5IGdldCBuYW1lZCBzaGFwZXMuXG4gKi9cblxuLyoqIEEgY29sb3JtYXAgdmFsdWUgYXMgUGxvdGx5IHVuZGVyc3RhbmRzIGl0OiBhIGJ1aWx0LWluIHNjYWxlIG5hbWUgKGUuZy5cbiAqICAnVmlyaWRpcycpIG9yIGFuIGlubGluZSBhcnJheSBvZiBgW3N0b3AsIGNvbG9yXWAgcGFpcnMuICovXG5leHBvcnQgdHlwZSBDb2xvcm1hcFZhbHVlID0gc3RyaW5nIHwgQXJyYXk8W251bWJlciwgc3RyaW5nXT47XG5cbi8qKiBPbmUgbm9kZSBvZiB0aGUgY29sb3JtYXAgc2VsZWN0b3IgdHJlZSAoc3RydWN0dXJhbGx5IGNvbXBhdGlibGUgd2l0aCB0aGVcbiAqICBQcmltZU5HIGBUcmVlTm9kZWBzIHRoZSBob3N0IHBhc3Nlcyk6IGdyb3VwIG5vZGVzIGNhcnJ5IGBjaGlsZHJlbmAsIGxlYWZcbiAqICBub2RlcyBjYXJyeSB0aGUgc2NhbGUgaW4gYGRhdGEudmFsdWVgICgrIGEgcHJldmlldyBpbWFnZSBpbiBgZGF0YS5zcmNgKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29sb3JtYXBOb2RlIHtcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIGRhdGE/OiB7IHZhbHVlPzogQ29sb3JtYXBWYWx1ZTsgc3JjPzogc3RyaW5nIH07XG4gIGNoaWxkcmVuPzogQ29sb3JtYXBOb2RlW107XG59XG5cbi8qKiBNYWdpYy13YW5kIHBpeGVsLWNvbXBhcmlzb24gc3BhY2UuICovXG5leHBvcnQgdHlwZSBXYW5kVHlwZSA9ICdHUkFZJyB8ICdSR0InIHwgJ0xBQl9ESVNUQU5DRSc7XG5cbi8qKiBPcHRpb25zIGZvciB0aGUgbWFnaWMtd2FuZCB0b29sIChRdVBhdGgtc3R5bGUpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJV2FuZE9wdGlvbnMge1xuICB0eXBlPzogV2FuZFR5cGU7XG4gIC8qKiBHYXVzc2lhbiBzaWdtYSBhcHBsaWVkIHRvIHRoZSBwYXRjaCBiZWZvcmUgdGhyZXNob2xkaW5nLiAqL1xuICBzaWdtYT86IG51bWJlcjtcbiAgLyoqIEhpZ2hlciA9IHN0cmljdGVyIChzbWFsbGVyIHNlbGVjdGlvbikgZm9yIEdSQVkvUkdCOyBoaWdoZXIgPSBsb29zZXIgZm9yXG4gICAqICBMQUJfRElTVEFOQ0Ug4oCUIG1hdGNoZXMgUXVQYXRoLiAqL1xuICBzZW5zaXRpdml0eT86IG51bWJlcjtcbiAgLyoqIFNxdWFyZSBwYXRjaCBzaXplIGluIHBpeGVscyAobXVzdCBiZSBvZGQpLiAqL1xuICBwYXRjaFNpemU/OiBudW1iZXI7XG4gIC8qKiBXaGVuIHRydWUsIHNraXAgYmx1ci90aHJlc2hvbGQgYW5kIGZsb29kLWZpbGwgYXQgZXhhY3QtbWF0Y2hcbiAgICogIChDbWQvQ3RybC1jbGljayBpbiBRdVBhdGgpLiAqL1xuICBzaW1wbGVNb2RlPzogYm9vbGVhbjtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHRoZSBicnVzaCByZWdpb24gdG9vbCAoUXVQYXRoLXN0eWxlKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUJydXNoT3B0aW9ucyB7XG4gIC8qKiBCcnVzaCBkaWFtZXRlciBpbiBtYXRyaXggKGltYWdlKSBwaXhlbHMuICovXG4gIHNpemU/OiBudW1iZXI7XG59XG5cbi8qKiBXaGF0IGRyaXZlcyBwb2ludCBjb2xvdXIgaW4gdGhlIHNwYXRpYWwtb21pY3MgbW9kZTogYW4gYW5ub3RhdGlvbiBjb2x1bW5cbiAqICBmcm9tIHRoZSBkYXRhc2V0LCBvciBvbmUgZmVhdHVyZSAoZ2VuZSkgdmVjdG9yIGZldGNoZWQgb24gZGVtYW5kLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGF0aWFsQ29sb3JCeSB7XG4gIGtpbmQ6ICdjb2x1bW4nIHwgJ2ZlYXR1cmUnO1xuICBuYW1lOiBzdHJpbmc7XG59XG5cbi8qKiBEaXNwbGF5IHN0YXRlIGZvciB0aGUgc3BhdGlhbC1vbWljcyBwbG90IG1vZGUuIExpdmVzIGluIGBWaXN1YWxpemVyU3RvcmVgXG4gKiAgYWxvbmdzaWRlIHRoZSBjb2xvcm1hcC9jaGFubmVsIHN0YXRlIHNvIHRoZSByZW5kZXJlciByZWFjdHMgdG8gZWRpdHMgdGhlXG4gKiAgc2FtZSB3YXkgaXQgZG9lcyBmb3IgYW4gaW1hZ2UuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXRpYWxWaWV3U3RhdGUge1xuICAvKiogQ29sb3VyIHNvdXJjZTsgYG51bGxgIHJlbmRlcnMgZXZlcnkgb2JzZXJ2YXRpb24gaW4gb25lIG5ldXRyYWwgY29sb3VyXG4gICAqICAodXNlZnVsIG9uIGl0cyBvd24g4oCUIGl0IHNob3dzIHdoZXJlIHRoZSB0aXNzdWUgYWN0dWFsbHkgaXMpLiAqL1xuICBjb2xvckJ5OiBTcGF0aWFsQ29sb3JCeSB8IG51bGw7XG4gIC8qKiBNdWx0aXBsaWVyIG9uIHRoZSBkYXRhc2V0J3MgcGh5c2ljYWwgbWFya2VyIHNpemUuIDEgPSB0cnVlIHNpemUsIHdoaWNoIGZvclxuICAgKiAgYSA1NSDCtW0gVmlzaXVtIHNwb3QgaXMgY29ycmVjdCBidXQgY2FuIGJlIGludmlzaWJsZSB3aGVuIHpvb21lZCBvdXQuICovXG4gIHBvaW50U2NhbGU6IG51bWJlcjtcbiAgLyoqIEFscGhhIGZvciBwb2ludHMgdGhhdCBhcmUgbm90IG11dGVkLiAqL1xuICBvcGFjaXR5OiBudW1iZXI7XG4gIC8qKiBMb2ctc2NhbGUgY29udGludW91cyB2YWx1ZXMgYmVmb3JlIG1hcHBpbmcgdGhlbSBvbnRvIHRoZSBjb2xvcm1hcC4gU2VlZGVkXG4gICAqICBmcm9tIHRoZSBjb2x1bW4ncyBgbG9nU2NhbGVIaW50YCDigJQgY291bnQgZGF0YSBuZWVkcyBpdC4gKi9cbiAgbG9nU2NhbGU6IGJvb2xlYW47XG4gIC8qKiBQZXJjZW50aWxlIGNsaXAgZm9yIHRoZSBjb250cmFzdCB3aW5kb3cgYXMgYFtsbywgaGldYCBmcmFjdGlvbnMsIHNvIGFcbiAgICogIGhhbmRmdWwgb2Ygc2F0dXJhdGVkIG9ic2VydmF0aW9ucyBkb24ndCBmbGF0dGVuIHRoZSByZXN0LiAqL1xuICAgcGVyY2VudGlsZUNsaXA6IFtudW1iZXIsIG51bWJlcl07XG4gIC8qKlxuICAgKiBDb2xvcm1hcCBmb3IgQ09OVElOVU9VUyBzcGF0aWFsIGNvbG91cmluZyDigJQgYSBnZW5lLCBhIG51bWVyaWMgY29sdW1uIOKAlCBhcyBhXG4gICAqIHtAbGluayBDb2xvcm1hcFZhbHVlfSwgdGhlIHNhbWUgc2hhcGUgdGhlIGRpc3BsYXkgY29sb3JtYXAgY2FycmllczogYSBzY2FsZVxuICAgKiBOQU1FIGZvciB0aGUgYnVpbHQtaW5zLCBvciBhbiBpbmxpbmUgYFtzdG9wLCBjb2xvdXJdYCBhcnJheSBmb3IgdGhlIHJlc3QuXG4gICAqIE51bGwgZm9sbG93cyB0aGUgZGlzcGxheSBjb2xvcm1hcC5cbiAgICpcbiAgICogSXRzIG93biBzZXR0aW5nIGJlY2F1c2UgdGhlIGRpc3BsYXkgY29sb3JtYXAgYmVsb25ncyB0byB0aGUgdGlzc3VlIGltYWdlIGFuZFxuICAgKiBpcyB1c3VhbGx5IGEgZ3JleSByYW1wLCB3aGljaCBpcyB0aGUgd3JvbmcgdGhpbmcgdG8gcmVhZCBhIG1lYXN1cmVtZW50XG4gICAqIHRocm91Z2g6IGdyZXkgb3ZlciBncmV5IGNhbm5vdCBiZSB0b2xkIGFwYXJ0IGZyb20gdGhlIGFuYXRvbXkuIEZvbGxvd2luZyBpdFxuICAgKiAod2l0aCBhIFZpcmlkaXMgZmFsbGJhY2sgZm9yIGV4YWN0bHkgdGhhdCBjYXNlKSBpcyBhIHJlYXNvbmFibGUgZGVmYXVsdCBhbmQgYVxuICAgKiBwb29yIGNlaWxpbmcsIHNpbmNlIHdoaWNoIGdyYWRpZW50IHJlYWRzIGJlc3QgaXMgYSBqdWRnZW1lbnQgYWJvdXQgdGhlIGRhdGEuXG4gICAqXG4gICAqIE9uZSBzZXR0aW5nIGZvciB0aGUgbWFya2VycywgdGhlIDJEIGdlbmUgbWFwIGFuZCB0aGUgM0QgZ2VuZSBtYXAgdG9nZXRoZXIsIHNvXG4gICAqIHRoZSBmaWVsZCB1bmRlciB0aGUgY2VsbHMgYW5kIHRoZSBjZWxscyBvdmVyIGl0IGNhbm5vdCBkaXNhZ3JlZSBhYm91dCB3aGF0IGFcbiAgICogY29sb3VyIG1lYW5zIOKAlCBhbmQgdGhlIHBhbmVsJ3Mgb3duIGNvbG91ciBiYXIgaXMgYnVpbHQgZnJvbSBpdCB0b28uXG4gICAqL1xuICBjb250aW51b3VzQ29sb3JtYXA6IENvbG9ybWFwVmFsdWUgfCBudWxsO1xuICAvKipcbiAgICogV2hhdCB0aGUgM0Qgc2NlbmUgZHJhd3MuIFRoZSB0aHJlZSB0aGluZ3MgaW4gaXQg4oCUIHRoZSByZWZlcmVuY2Ugdm9sdW1lLCB0aGVcbiAgICogb2JzZXJ2YXRpb24gY2xvdWQgYW5kIHRoZSBjbHVzdGVyIGRlbnNpdHkgdm9sdW1lcyDigJQgb2NjdXB5IHRoZSBzYW1lIHNwYWNlLCBzb1xuICAgKiBhbnkgdHdvIG9mIHRoZW0gaGlkZSBlYWNoIG90aGVyIHRvIHNvbWUgZGVncmVlLiBUaGVzZSBhcmUgaW5kZXBlbmRlbnQgYmVjYXVzZVxuICAgKiB0aGUgdXNlZnVsIHZpZXdzIGFyZSB0aGUgY29tYmluYXRpb25zOiB0aGUgdm9sdW1lcyBhbG9uZSB0byByZWFkIGFuIGVzdGltYXRlZFxuICAgKiBkaXN0cmlidXRpb24sIG9uZSBzZWN0aW9uJ3MgY2VsbHMgb3ZlciB0aGVtIHRvIGNoZWNrIHRoYXQgZXN0aW1hdGUgYWdhaW5zdCB0aGVcbiAgICogbWVhc3VyZW1lbnQsIHRoZSBhbmF0b215IGFsb25lIHRvIGZpbmQgYSBsYW5kbWFyay5cbiAgICpcbiAgICogVmlzaWJpbGl0eSBvbmx5IOKAlCB0aGUgbGF5ZXJzIHN0YXkgYnVpbHQsIHNvIHRvZ2dsaW5nIG9uZSBiYWNrIG9uIGlzIGltbWVkaWF0ZVxuICAgKiBhbmQgZG9lcyBub3QgcmUtcnVuIGEgcmFzdGVyaXNhdGlvbi4ge0BsaW5rIGRlbnNpdHlWb2x1bWV9IGlzIHRoZSBleGNlcHRpb24gYW5kXG4gICAqIGdlbnVpbmVseSBnYXRlcyBjb25zdHJ1Y3Rpb24sIGJlY2F1c2UgYnVpbGRpbmcgc2l4IHZvbHVtZXMgaXMgbm90IGZyZWUuXG4gICAqL1xuICBzaG93Vm9sdW1lOiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIHJlZmVyZW5jZSB2b2x1bWUncyBvcGFjaXR5LlxuICAgKlxuICAgKiBJdHMgb3duLCBub3Qge0BsaW5rIG9wYWNpdHl9ICh3aGljaCBiZWxvbmdzIHRvIHRoZSBtYXJrZXJzKTogdGhlIHZvbHVtZSBpcyBhXG4gICAqIEJBQ0tEUk9QLCBhbmQgcmVhZGluZyB0aGUgY2xvdWQgb3IgYSBkZW5zaXR5IGZpZWxkIHRocm91Z2ggaXQgbWVhbnMgdHVybmluZ1xuICAgKiB0aGUgYW5hdG9teSBkb3duIHdpdGhvdXQgdG91Y2hpbmcgdGhlIGRhdGEgZHJhd24gb3ZlciBpdC4gUmFuZ2VzIGxvd2VyIHRoYW5cbiAgICogdGhlIG1hcmtlcnMnIHNsaWRlciBmb3IgdGhlIHNhbWUgcmVhc29uIOKAlCBhIGZhaW50IGFuYXRvbWljYWwgaGludCBpcyBhIHVzZWZ1bFxuICAgKiBzZXR0aW5nIGZvciBhIGJhY2tkcm9wIGFuZCBhIHVzZWxlc3Mgb25lIGZvciB0aGUgbWVhc3VyZW1lbnQuXG4gICAqL1xuICB2b2x1bWVPcGFjaXR5OiBudW1iZXI7XG4gIC8qKiBEcmF3IHRoZSBvYnNlcnZhdGlvbiBjbG91ZCAoM0QpLiAqL1xuICBzaG93UG9pbnRzOiBib29sZWFuO1xuICAvKipcbiAgICogUmVzdHJpY3QgdGhlIGNsb3VkIHRvIE9ORSBpbWFnZWQgc2VjdGlvbiwgYnkgaW5kZXggaW50byB0aGUgZGF0YXNldCdzIHNhbXBsZWRcbiAgICogc2VjdGlvbnM7IG51bGwgZHJhd3MgZXZlcnkgc2VjdGlvbi5cbiAgICpcbiAgICogVGhlIHdob2xlIGNsb3VkIGlzIGEgc3RhY2sgb2YgZGlzY3MgdGhhdCBoaWRlcyB3aGF0ZXZlciBpcyBkcmF3biBiZXR3ZWVuIHRoZW0uXG4gICAqIE9uZSBzZWN0aW9uIGF0IGEgdGltZSBpcyB0aGUgdmlldyB0aGF0IGFuc3dlcnMgXCJkb2VzIHRoZSBlc3RpbWF0ZWQgZmllbGRcbiAgICogYWN0dWFsbHkgZm9sbG93IHRoZSBjZWxscyBJIG1lYXN1cmVkXCIg4oCUIGFuZCBpdCBpcyBvbmx5IG9mZmVyZWQgZm9yIGRhdGEgdGhhdFxuICAgKiByZWFsbHkgaXMgc2VjdGlvbmVkIChzZWUgYHNhbXBsZWRTZWN0aW9uc2ApLlxuICAgKi9cbiAgcG9pbnRTZWN0aW9uOiBudW1iZXIgfCBudWxsO1xuICAvKipcbiAgICogRHJhdyBlYWNoIGNsdXN0ZXIgYXMgYSB0cmFuc2x1Y2VudCBERU5TSVRZIHZvbHVtZSBhbG9uZ3NpZGUgdGhlIDNEIGNsb3VkLlxuICAgKlxuICAgKiBTZXJpYWwgc2VjdGlvbnMgaHVuZHJlZHMgb2YgbWljcm9ucyBhcGFydCBtYWtlIGEgY2xvdWQgaGFyZCB0byByZWFkIGFzIGFuXG4gICAqIGFuYXRvbWljYWwgZGlzdHJpYnV0aW9uIOKAlCB0aGUgZXllIGNhbm5vdCBpbnRlZ3JhdGUgZGlzY3MgaW50byBhIHNoYXBlLiBBXG4gICAqIGRlbnNpdHkgZmllbGQgY2FuIGJlIGVzdGltYXRlZCBiZXR3ZWVuIHRoZSBpbWFnZWQgcGxhbmVzIChhIGNvbnRpbnVvdXNcbiAgICogZXN0aW1hdGUsIHVubGlrZSBpbmRpdmlkdWFsIGNlbGxzLCB3aGljaCBoYXZlIG5vIGNvcnJlc3BvbmRlbmNlIHRvXG4gICAqIGludGVycG9sYXRlIGFsb25nKSBhbmQgcmVuZGVycyBhcyBhIGNsb3VkIHRoYXQgcmVhZHMgYXMgYW4gZXN0aW1hdGUuXG4gICAqL1xuICBkZW5zaXR5Vm9sdW1lOiBib29sZWFuO1xuICAvKiogTXVsdGlwbGllciBvbiB0aGUgZGVmYXVsdCBrZXJuZWwgYmFuZHdpZHRoLiBBYm92ZSAxIGlzIHNtb290aGVyIGFuZCBsZXNzXG4gICAqICBjb21taXR0YWw7IGJlbG93IDEgZXhwb3NlcyB0aGUgaW5kaXZpZHVhbCBzZWN0aW9ucy4gKi9cbiAgZGVuc2l0eVNtb290aGluZzogbnVtYmVyO1xuICAvKipcbiAgICogRHJhdyB0aGUgYWN0aXZlIEdFTkUgYXMgYSBjb250aW51b3VzIGZpZWxkIHVuZGVyIHRoZSBvYnNlcnZhdGlvbnMgKDJEKS5cbiAgICpcbiAgICogQ29sb3VyaW5nIHRoZSBtYXJrZXJzIGJ5IGEgZ2VuZSBzYXlzIHdoaWNoIGNlbGxzIGV4cHJlc3MgaXQ7IGl0IGNhbm5vdCBzYXlcbiAgICogd2hlcmUsIGJlY2F1c2UgdGhlIGV5ZSB3aWxsIG5vdCBpbnRlZ3JhdGUgdGhvdXNhbmRzIG9mIGRvdHMgaW50byBhIHRlcnJpdG9yeS5cbiAgICogVGhlIGZpZWxkIGlzIGFuIGVzdGltYXRlIOKAlCBhIGtlcm5lbC13ZWlnaHRlZCBtZWFuIHBlciBjZWxsLCB0cmFuc3BhcmVudCB3aGVyZVxuICAgKiBubyBjZWxsIHdhcyBtZWFzdXJlZCDigJQgYW5kIGl0IGlzIGRyYXduIGJlbmVhdGggdGhlIGNlbGxzLCBub3QgaW5zdGVhZCBvZiB0aGVtLFxuICAgKiBzbyB0aGUgbWVhc3VyZW1lbnQgc3RheXMgb24gc2NyZWVuIG5leHQgdG8gdGhlIGludGVycG9sYXRpb24uXG4gICAqXG4gICAqIElnbm9yZWQgdW5sZXNzIHRoZSBjb2xvdXIgc291cmNlIGlzIGEgZ2VuZTogdGhlcmUgaXMgbm90aGluZyBlbHNlIHRvIG1hcC5cbiAgICovXG4gIGdlbmVNYXA6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBSZXN0cmljdCB0aGUgM0QgZ2VuZSBtYXAgdG8gT05FIGltYWdlZCBzZWN0aW9uLCBieSBpbmRleCBpbnRvIHRoZSBkYXRhc2V0J3NcbiAgICogc2FtcGxlZCBzZWN0aW9uczsgbnVsbCBkcmF3cyBldmVyeSBzZWN0aW9uJ3Mgc2hlZXQuXG4gICAqXG4gICAqIFNlcGFyYXRlIGZyb20ge0BsaW5rIHBvaW50U2VjdGlvbn0gc28gdGhlIGNvbWJpbmF0aW9ucyBzdGF5IG9wZW46IGFsbCB0aGVcbiAgICogc2hlZXRzIHdpdGggb25lIHNlY3Rpb24ncyBjZWxscyBvdmVyIHRoZW0gaXMgYSB1c2VmdWwgdmlldywgYW5kIHNvIGlzIG9uZVxuICAgKiBzaGVldCBpbnNpZGUgdGhlIHdob2xlIGNsb3VkLiBJZ25vcmVkIHdoaWxlIHtAbGluayBnZW5lTWFwVm9sdW1lfSBpcyBzZXQg4oCUXG4gICAqIGludGVycG9sYXRpbmcgYSBzaW5nbGUgc2VjdGlvbiBhbG9uZyB6IHdvdWxkIHNtZWFyIG9uZSBzbGlkZSB0aHJvdWdoIHRoZVxuICAgKiBzcGVjaW1lbidzIHdob2xlIGRlcHRoIGFuZCBjYWxsIGl0IGFuIGVzdGltYXRlLlxuICAgKi9cbiAgZ2VuZU1hcFNlY3Rpb246IG51bWJlciB8IG51bGw7XG4gIC8qKlxuICAgKiBTbW9vdGggdGhlIHBlci1zZWN0aW9uIGdlbmUgbWFwcyBhbG9uZyB6IGludG8gYSBjb250aW51b3VzIFZPTFVNRSAoM0QpLlxuICAgKlxuICAgKiBUaGUgc2hlZXRzIGFyZSB3aGF0IHdhcyBtZWFzdXJlZCDigJQgb25lIGZpZWxkIHBlciBpbWFnZWQgc2xpZGUsIHdpdGggdGhlIGdhcHNcbiAgICogYmV0d2VlbiB0aGVtIGVtcHR5LiBUaGlzIHR1cm5zIHRoZW0gaW50byBhbiBlc3RpbWF0ZSBkZWZpbmVkIGJldHdlZW4gdGhlXG4gICAqIHNsaWRlcywgdGhlIHNhbWUgbW92ZSB0aGUgY2x1c3RlciBkZW5zaXR5IHZvbHVtZXMgbWFrZSBhbmQgd2l0aCB0aGUgc2FtZVxuICAgKiBjYXZlYXQ6IGEgZmllbGQgbWF5IGJlIGludGVycG9sYXRlZCBiZXR3ZWVuIHNlY3Rpb25zLCBpbmRpdmlkdWFsIGNlbGxzIG1heVxuICAgKiBub3QsIGFuZCB0aGUgcmVzdWx0IGlzIGRyYXduIGFzIGEgdHJhbnNsdWNlbnQgY2xvdWQgc28gaXQgY2Fubm90IGJlIG1pc3Rha2VuXG4gICAqIGZvciBtZWFzdXJlbWVudC5cbiAgICovXG4gIGdlbmVNYXBWb2x1bWU6IGJvb2xlYW47XG4gIC8qKiBNdWx0aXBsaWVyIG9uIHRoZSBnZW5lIG1hcCdzIGtlcm5lbCBiYW5kd2lkdGguICovXG4gIGdlbmVNYXBTbW9vdGhpbmc6IG51bWJlcjtcbiAgLyoqIFRoZSBnZW5lIG1hcCdzIG93biBvcGFjaXR5LiBTZXBhcmF0ZSBmcm9tIHtAbGluayBvcGFjaXR5fSwgd2hpY2ggYmVsb25ncyB0b1xuICAgKiAgdGhlIG1hcmtlcnM6IHR1cm5pbmcgdGhlIGNlbGxzIGRvd24gdG8gcmVhZCB0aGUgZmllbGQgdW5kZXJuZWF0aCBtdXN0IG5vdFxuICAgKiAgdHVybiB0aGUgZmllbGQgZG93biB3aXRoIHRoZW0uICovXG4gIGdlbmVNYXBPcGFjaXR5OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NQQVRJQUxfVklFVzogU3BhdGlhbFZpZXdTdGF0ZSA9IHtcbiAgY29sb3JCeTogbnVsbCxcbiAgcG9pbnRTY2FsZTogMSxcbiAgb3BhY2l0eTogMSxcbiAgbG9nU2NhbGU6IGZhbHNlLFxuICBwZXJjZW50aWxlQ2xpcDogWzAuMDEsIDAuOTldLFxuICBjb250aW51b3VzQ29sb3JtYXA6IG51bGwsXG4gIHNob3dWb2x1bWU6IHRydWUsXG4gIHZvbHVtZU9wYWNpdHk6IDAuNSxcbiAgc2hvd1BvaW50czogdHJ1ZSxcbiAgcG9pbnRTZWN0aW9uOiBudWxsLFxuICBkZW5zaXR5Vm9sdW1lOiBmYWxzZSxcbiAgZGVuc2l0eVNtb290aGluZzogMSxcbiAgZ2VuZU1hcDogZmFsc2UsXG4gIGdlbmVNYXBTZWN0aW9uOiBudWxsLFxuICBnZW5lTWFwVm9sdW1lOiBmYWxzZSxcbiAgZ2VuZU1hcFNtb290aGluZzogMSxcbiAgZ2VuZU1hcE9wYWNpdHk6IDAuODUsXG59O1xuIl19
@@ -8,4 +8,4 @@
8
8
  * structurally, so the host keeps passing its own instances unchanged.
9
9
  */
10
10
  export {};
11
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UuY29udHJhY3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NvbnRyYWN0cy9pbWFnZS5jb250cmFjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTGlicmFyeS1vd25lZCBkYXRhIGludGVyZmFjZXMgZm9yIHRoZSBpbWFnZSB0aGUgdmlzdWFsaXphdGlvbiByZW5kZXJzLlxuICpcbiAqIFRoZSB2aXN1YWxpemF0aW9uIHBhY2thZ2UgbXVzdCBub3QgaW1wb3J0IHRoZSBob3N0IGFwcCdzIGNvbmNyZXRlIG1vZGVsc1xuICogKGBtYWluL21vZGVscy9maWxlLWluZm9gKSwgb3IgaXQgY2FuJ3QgYmVjb21lIGEgc3RhbmRhbG9uZSBsaWJyYXJ5LiBUaGVzZVxuICogc2xpbSBpbnRlcmZhY2VzIGRlY2xhcmUgb25seSB0aGUgZmllbGRzIHRoZSBsaWJyYXJ5IHJlYWRzL3dyaXRlczsgdGhlIGhvc3Qnc1xuICogYEltYWdlSW5mb2AvYEltYWdlTWV0YWRhdGFgIGNsYXNzZXMgYXJlIHB1cmUgZGF0YSBob2xkZXJzIHRoYXQgc2F0aXNmeSB0aGVtXG4gKiBzdHJ1Y3R1cmFsbHksIHNvIHRoZSBob3N0IGtlZXBzIHBhc3NpbmcgaXRzIG93biBpbnN0YW5jZXMgdW5jaGFuZ2VkLlxuICovXG5cbi8qKiBQZXItY2hhbm5lbCBtZXRhZGF0YSBmcm9tIHRoZSBzZXJ2ZXIgZGVzY3JpcHRvciAoaXNzdWUgIzc2KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUNoYW5uZWxJbmZvIHtcbiAgbmFtZTogc3RyaW5nO1xuICAvKiogU3VnZ2VzdGVkIGRpc3BsYXkgdGludCBhcyBcIiNSUkdHQkJcIi4gKi9cbiAgY29sb3I6IHN0cmluZztcbiAgLyoqIEVtYmVkZGVkIDI1Ni1lbnRyeSBkaXNwbGF5IExVVCBhcyBcIiNSUkdHQkJcIiAoaW50ZW5zaXR54oaSY29sb3IpLCBvclxuICAgKiAgbnVsbC91bmRlZmluZWQgd2hlbiB0aGUgZmlsZSBoYXMgbm8gcGFsZXR0ZSBmb3IgdGhpcyBjaGFubmVsLiAqL1xuICBsdXQ/OiBzdHJpbmdbXSB8IG51bGw7XG4gIGJpdERlcHRoPzogbnVtYmVyO1xuICAvKiogUGl4ZWwtdHlwZSBtaW5pbXVtIChlLmcuIDAgZm9yIHVuc2lnbmVkKS4gTmF0aXZlLXVuaXQgZmxvb3Igb2YgdGhlIHdpbmRvdy4gKi9cbiAgbWluQWxsb3dlZD86IG51bWJlcjtcbiAgLyoqIFBpeGVsLXR5cGUgbWF4aW11bSAoZS5nLiA2NTUzNSBmb3IgdW5zaWduZWQgMTYtYml0KS4gTmF0aXZlLXVuaXQgY2VpbGluZy4gKi9cbiAgbWF4QWxsb3dlZD86IG51bWJlcjtcbn1cblxuLyoqIFBlci1zZXJpZXMgaW1hZ2UgbWV0YWRhdGEgKHBoeXNpY2FsIHNpemUgKyBkaW1lbnNpb25zKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUltYWdlTWV0YWRhdGEge1xuICBjaGFubmVsQ291bnQ6IG51bWJlcjtcbiAgcmdiQ2hhbm5lbHM6IG51bWJlcjtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIHo6IG51bWJlcjtcbiAgLyoqIFBoeXNpY2FsIHBpeGVsIHNpemUgaW4gwrVtOyBudWxsL3VuZGVmaW5lZCB3aGVuIHRoZSBmb3JtYXQgcmVwb3J0cyBub25lLiAqL1xuICBtcHBYPzogbnVtYmVyIHwgbnVsbDtcbiAgbXBwWT86IG51bWJlciB8IG51bGw7XG4gIC8qKiBQZXItY2hhbm5lbCBuYW1lL2NvbG9yL0xVVCBmb3IgbXVsdGljaGFubmVsIChub24tUkdCKSBpbWFnZXMsIHdoZW4ga25vd24uICovXG4gIGNoYW5uZWxJbmZvPzogSUNoYW5uZWxJbmZvW10gfCBudWxsO1xufVxuXG4vKiogVGhlIGltYWdlIGN1cnJlbnRseSBiZWluZyB2aXN1YWxpemVkLiBGaWVsZCBvcHRpb25hbGl0eSBtaXJyb3JzIHRoZSBob3N0J3NcbiAqICBgSW1hZ2VJbmZvYCBzbyBpdHMgaW5zdGFuY2VzIGFyZSBhc3NpZ25hYmxlIHRvIHRoaXMgaW50ZXJmYWNlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSW1hZ2VJbmZvIHtcbiAgaXNHcmF5c2NhbGU6IGJvb2xlYW47XG4gIHRydWVJbWFnZVNpemU6IG51bWJlcltdO1xuICB1cmxzOiBzdHJpbmdbXTtcbiAgLyoqIE9wdGlvbmFsIHNtYWxsLXRpZXIgVVJMcyAoZmFzdCBibHVycnkgcGxhY2Vob2xkZXIpLCAxOjEgd2l0aCBgdXJsc2AuICovXG4gIHNtYWxsVXJscz86IHN0cmluZ1tdO1xuICBpc1N0YWNrOiBib29sZWFuO1xuICBzaG93U3RhY2s6IGJvb2xlYW47XG4gIHNjYWxlUmF0aW86IGJvb2xlYW47XG4gIGZpbGVOYW1lOiBzdHJpbmc7XG4gIHJvaUpzb25TdHI/OiBzdHJpbmc7XG4gIC8qKiBQZXItc2xpY2UgUk9JIEdlb0pTT04sIGFsaWduZWQgMToxIHdpdGggYHVybHNgLCBmb3IgYSBmb2xkZXIgc3RhY2sgd2hlcmVcbiAgICogIGVhY2ggc2xpY2UgaXMgYSBzZXBhcmF0ZSBmaWxlIHdpdGggaXRzIG93biBzaWJsaW5nIGA8c3RlbT4uZ2VvanNvbmBcbiAgICogIChgbnVsbGAgZm9yIHNsaWNlcyB3aXRob3V0IG9uZSkuIFdoZW4gcHJlc2VudCwgdGhlIGNvbXBvbmVudCBhcHBsaWVzXG4gICAqICBgcm9pSnNvblN0cnNbel1gIGZvciB0aGUgZGlzcGxheWVkIHNsaWNlIGFuZCBzd2FwcyBpdCBvbiBzY3J1YiDigJQgYXNcbiAgICogIG9wcG9zZWQgdG8gdGhlIHNjYWxhciBgcm9pSnNvblN0cmAsIHdoaWNoIGlzIG9uZSBST0kgc2V0IGZvciB0aGUgd2hvbGVcbiAgICogIGltYWdlIChhIHNpbmdsZSBmaWxlIG9yIGEgc2VydmVyIHotc3RhY2spLiAoaml0LXVpIzkzKSAqL1xuICByb2lKc29uU3Rycz86IChzdHJpbmcgfCBudWxsKVtdO1xuICAvKiogUGVyLXNsaWNlLCBwZXItY2hhbm5lbCBwbGFuZSBVUkxzIGZvciBhIFNFUlZFUkxFU1MgbXVsdGljaGFubmVsIGltYWdlXG4gICAqICAoYHRpbGVkOiBmYWxzZWAgKyBgaW1hZ2VNZXRhWzBdLmNoYW5uZWxDb3VudCA+IDFgKS4gYGNoYW5uZWxVcmxzW3pdW2NdYFxuICAgKiAgaXMgYSBjb21wbGV0ZSBzaW5nbGUtYmFuZCBpbWFnZSBvZiBjaGFubmVsIGMgYXQgc2xpY2Ugei4gVGhlIE9TRCBzaW1wbGVcbiAgICogIHBhdGggY29tcG9zaXRlcyB0aGVtIGNsaWVudC1zaWRlIOKAlCBwZXItY2hhbm5lbCBjb2xvdXIvd2luZG93L2dhbW1hIGZyb21cbiAgICogIHRoZSBjaGFubmVsIHBhbmUg4oCUIGluc3RlYWQgb2Ygb3BlbmluZyB0aGUgZmxhdCBgdXJsc1t6XWAuIChqaXQtdWkjNzYpICovXG4gIGNoYW5uZWxVcmxzPzogc3RyaW5nW11bXTtcbiAgaW1hZ2VNZXRhOiBJSW1hZ2VNZXRhZGF0YVtdO1xuICAvKiogSG93IHRoZSBPcGVuU2VhZHJhZ29uIGJhY2tlbmQgc2hvdWxkIHNvdXJjZSB0aGlzIGltYWdlLlxuICAgKiAgLSBgdHJ1ZWAvYWJzZW50IChkZWZhdWx0KTogc2VydmVyLXRpbGVkIOKAlCBPU0QgcG9sbHMgYC90aWxlcy9pbmZvYCBmb3IgYVxuICAgKiAgICBweXJhbWlkIGFuZCBmZXRjaGVzIHRpbGVzIGZyb20gdGhlIHNsaWRlLWNyb3Agc2VydmVyICh3aG9sZS1zbGlkZSBwYXRoKS5cbiAgICogIC0gYGZhbHNlYDogYSBzZWxmLWNvbnRhaW5lZCwgZGlyZWN0bHktbG9hZGFibGUgaW1hZ2Ug4oCUIGB1cmxzW3pJbmRleF1gIGlzIGFcbiAgICogICAgY29tcGxldGUgaW1hZ2UgKGUuZy4gYSBgYmxvYjpgIFVSTCBidWlsdCBmcm9tIGEgY2xpZW50LXNpZGUgcGl4ZWwgYnVmZmVyKSxcbiAgICogICAgb3BlbmVkIHZpYSBPU0QncyBzaW5nbGUtaW1hZ2Ugc291cmNlIHdpdGggbm8gdGlsZSBzZXJ2ZXIuIExldHMgaW4tbWVtb3J5XG4gICAqICAgIGltYWdlcyAodGhlIHByb2Nlc3NpbmcgcGlwZWxpbmUpIHVzZSB0aGUgT1NEIHZpZXdlciB3aXRob3V0IGEgcm91bmQtdHJpcC4gKi9cbiAgdGlsZWQ/OiBib29sZWFuO1xuICAvKiogT25lLXNob3QgaGludDogb3BlbiB0aGUgc3RhY2sgb24gdGhpcyBzbGljZSBpbnN0ZWFkIG9mIHNsaWNlIDAgKGUuZy4gdGhlXG4gICAqICBob3N0IGNsaWNrZWQgYSBzcGVjaWZpYyBmaWxlIHdpdGhpbiBhIG51bWJlcmVkIGltYWdlIHNlcmllcykuIFRoZVxuICAgKiAgY29tcG9uZW50IGNvbnN1bWVzIGFuZCBjbGVhcnMgdGhpcyB0aGUgZmlyc3QgdGltZSBpdCBzZWVzIHRoZSBvYmplY3QsIHNvXG4gICAqICByZS1kZWxpdmVyaW5nIHRoZSBzYW1lIEltYWdlSW5mbyAoZS5nLiBhIHBsb3QtdHlwZSBzd2l0Y2gpIGRvZXNuJ3QgcmVzZXRcbiAgICogIHRoZSB1c2VyJ3MgY3VycmVudCBzY3J1YiBwb3NpdGlvbi4gKi9cbiAgaW5pdGlhbFpJbmRleD86IG51bWJlcjtcbn1cbiJdfQ==
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UuY29udHJhY3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NvbnRyYWN0cy9pbWFnZS5jb250cmFjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTGlicmFyeS1vd25lZCBkYXRhIGludGVyZmFjZXMgZm9yIHRoZSBpbWFnZSB0aGUgdmlzdWFsaXphdGlvbiByZW5kZXJzLlxuICpcbiAqIFRoZSB2aXN1YWxpemF0aW9uIHBhY2thZ2UgbXVzdCBub3QgaW1wb3J0IHRoZSBob3N0IGFwcCdzIGNvbmNyZXRlIG1vZGVsc1xuICogKGBtYWluL21vZGVscy9maWxlLWluZm9gKSwgb3IgaXQgY2FuJ3QgYmVjb21lIGEgc3RhbmRhbG9uZSBsaWJyYXJ5LiBUaGVzZVxuICogc2xpbSBpbnRlcmZhY2VzIGRlY2xhcmUgb25seSB0aGUgZmllbGRzIHRoZSBsaWJyYXJ5IHJlYWRzL3dyaXRlczsgdGhlIGhvc3Qnc1xuICogYEltYWdlSW5mb2AvYEltYWdlTWV0YWRhdGFgIGNsYXNzZXMgYXJlIHB1cmUgZGF0YSBob2xkZXJzIHRoYXQgc2F0aXNmeSB0aGVtXG4gKiBzdHJ1Y3R1cmFsbHksIHNvIHRoZSBob3N0IGtlZXBzIHBhc3NpbmcgaXRzIG93biBpbnN0YW5jZXMgdW5jaGFuZ2VkLlxuICovXG5cbi8qKiBQZXItY2hhbm5lbCBtZXRhZGF0YSBmcm9tIHRoZSBzZXJ2ZXIgZGVzY3JpcHRvciAoaXNzdWUgIzc2KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUNoYW5uZWxJbmZvIHtcbiAgbmFtZTogc3RyaW5nO1xuICAvKiogU3VnZ2VzdGVkIGRpc3BsYXkgdGludCBhcyBcIiNSUkdHQkJcIi4gKi9cbiAgY29sb3I6IHN0cmluZztcbiAgLyoqIEVtYmVkZGVkIDI1Ni1lbnRyeSBkaXNwbGF5IExVVCBhcyBcIiNSUkdHQkJcIiAoaW50ZW5zaXR54oaSY29sb3IpLCBvclxuICAgKiAgbnVsbC91bmRlZmluZWQgd2hlbiB0aGUgZmlsZSBoYXMgbm8gcGFsZXR0ZSBmb3IgdGhpcyBjaGFubmVsLiAqL1xuICBsdXQ/OiBzdHJpbmdbXSB8IG51bGw7XG4gIGJpdERlcHRoPzogbnVtYmVyO1xuICAvKiogUGl4ZWwtdHlwZSBtaW5pbXVtIChlLmcuIDAgZm9yIHVuc2lnbmVkKS4gTmF0aXZlLXVuaXQgZmxvb3Igb2YgdGhlIHdpbmRvdy4gKi9cbiAgbWluQWxsb3dlZD86IG51bWJlcjtcbiAgLyoqIFBpeGVsLXR5cGUgbWF4aW11bSAoZS5nLiA2NTUzNSBmb3IgdW5zaWduZWQgMTYtYml0KS4gTmF0aXZlLXVuaXQgY2VpbGluZy4gKi9cbiAgbWF4QWxsb3dlZD86IG51bWJlcjtcbn1cblxuLyoqIFBlci1zZXJpZXMgaW1hZ2UgbWV0YWRhdGEgKHBoeXNpY2FsIHNpemUgKyBkaW1lbnNpb25zKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUltYWdlTWV0YWRhdGEge1xuICBjaGFubmVsQ291bnQ6IG51bWJlcjtcbiAgcmdiQ2hhbm5lbHM6IG51bWJlcjtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIHo6IG51bWJlcjtcbiAgLyoqIFBoeXNpY2FsIHBpeGVsIHNpemUgaW4gwrVtOyBudWxsL3VuZGVmaW5lZCB3aGVuIHRoZSBmb3JtYXQgcmVwb3J0cyBub25lLiAqL1xuICBtcHBYPzogbnVtYmVyIHwgbnVsbDtcbiAgbXBwWT86IG51bWJlciB8IG51bGw7XG4gIC8qKiBQaHlzaWNhbCBzcGFjaW5nIEJFVFdFRU4gc2xpY2VzIGluIMK1bSDigJQgdGhlIHogY291bnRlcnBhcnQgb2YgYG1wcFhgL2BtcHBZYCxcbiAgICogIGZvciBhIHN0YWNrIHRoYXQga25vd3MgaXQgKGEgcmVzYW1wbGVkIHZvbHVtZSwgYSBjb25mb2NhbCBzdGFjaykuIEl0IGlzIHdoYXRcbiAgICogIGxldHMgdGhlIDNEIHZvbHVtZSB2aWV3IHJlbmRlciB0cnVlIGFuaXNvdHJvcHk6IHdpdGggYWxsIHRocmVlIHByZXNlbnQgdGhlXG4gICAqICB3b3JsZCBib3ggaXMgdGhlIGltYWdlJ3MgcmVhbCBwaHlzaWNhbCBleHRlbnQsIHNvIDQwIHggNDAgeCAyMDAgwrVtIHZveGVsc1xuICAgKiAgcmVhZCBhcyBhIGJyYWluIGFuZCBub3QgYXMgYSBjdWJlLWFzcGVjdCBicmljay4gQWJzZW50LCB0aGUgdmlldyBmYWxscyBiYWNrXG4gICAqICB0byBpdHMgcmVzb2x1dGlvbi1pbnZhcmlhbnQgcmVmZXJlbmNlIGJveCwgd2hpY2ggaXMgc2hhcGUtb25seS4gKi9cbiAgbXBwWj86IG51bWJlciB8IG51bGw7XG4gIC8qKiBQZXItY2hhbm5lbCBuYW1lL2NvbG9yL0xVVCBmb3IgbXVsdGljaGFubmVsIChub24tUkdCKSBpbWFnZXMsIHdoZW4ga25vd24uICovXG4gIGNoYW5uZWxJbmZvPzogSUNoYW5uZWxJbmZvW10gfCBudWxsO1xufVxuXG4vKiogVGhlIGltYWdlIGN1cnJlbnRseSBiZWluZyB2aXN1YWxpemVkLiBGaWVsZCBvcHRpb25hbGl0eSBtaXJyb3JzIHRoZSBob3N0J3NcbiAqICBgSW1hZ2VJbmZvYCBzbyBpdHMgaW5zdGFuY2VzIGFyZSBhc3NpZ25hYmxlIHRvIHRoaXMgaW50ZXJmYWNlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSW1hZ2VJbmZvIHtcbiAgaXNHcmF5c2NhbGU6IGJvb2xlYW47XG4gIHRydWVJbWFnZVNpemU6IG51bWJlcltdO1xuICB1cmxzOiBzdHJpbmdbXTtcbiAgLyoqIE9wdGlvbmFsIHNtYWxsLXRpZXIgVVJMcyAoZmFzdCBibHVycnkgcGxhY2Vob2xkZXIpLCAxOjEgd2l0aCBgdXJsc2AuICovXG4gIHNtYWxsVXJscz86IHN0cmluZ1tdO1xuICBpc1N0YWNrOiBib29sZWFuO1xuICBzaG93U3RhY2s6IGJvb2xlYW47XG4gIHNjYWxlUmF0aW86IGJvb2xlYW47XG4gIGZpbGVOYW1lOiBzdHJpbmc7XG4gIHJvaUpzb25TdHI/OiBzdHJpbmc7XG4gIC8qKiBQZXItc2xpY2UgUk9JIEdlb0pTT04sIGFsaWduZWQgMToxIHdpdGggYHVybHNgLCBmb3IgYSBmb2xkZXIgc3RhY2sgd2hlcmVcbiAgICogIGVhY2ggc2xpY2UgaXMgYSBzZXBhcmF0ZSBmaWxlIHdpdGggaXRzIG93biBzaWJsaW5nIGA8c3RlbT4uZ2VvanNvbmBcbiAgICogIChgbnVsbGAgZm9yIHNsaWNlcyB3aXRob3V0IG9uZSkuIFdoZW4gcHJlc2VudCwgdGhlIGNvbXBvbmVudCBhcHBsaWVzXG4gICAqICBgcm9pSnNvblN0cnNbel1gIGZvciB0aGUgZGlzcGxheWVkIHNsaWNlIGFuZCBzd2FwcyBpdCBvbiBzY3J1YiDigJQgYXNcbiAgICogIG9wcG9zZWQgdG8gdGhlIHNjYWxhciBgcm9pSnNvblN0cmAsIHdoaWNoIGlzIG9uZSBST0kgc2V0IGZvciB0aGUgd2hvbGVcbiAgICogIGltYWdlIChhIHNpbmdsZSBmaWxlIG9yIGEgc2VydmVyIHotc3RhY2spLiAoaml0LXVpIzkzKSAqL1xuICByb2lKc29uU3Rycz86IChzdHJpbmcgfCBudWxsKVtdO1xuICAvKiogUGVyLXNsaWNlLCBwZXItY2hhbm5lbCBwbGFuZSBVUkxzIGZvciBhIFNFUlZFUkxFU1MgbXVsdGljaGFubmVsIGltYWdlXG4gICAqICAoYHRpbGVkOiBmYWxzZWAgKyBgaW1hZ2VNZXRhWzBdLmNoYW5uZWxDb3VudCA+IDFgKS4gYGNoYW5uZWxVcmxzW3pdW2NdYFxuICAgKiAgaXMgYSBjb21wbGV0ZSBzaW5nbGUtYmFuZCBpbWFnZSBvZiBjaGFubmVsIGMgYXQgc2xpY2Ugei4gVGhlIE9TRCBzaW1wbGVcbiAgICogIHBhdGggY29tcG9zaXRlcyB0aGVtIGNsaWVudC1zaWRlIOKAlCBwZXItY2hhbm5lbCBjb2xvdXIvd2luZG93L2dhbW1hIGZyb21cbiAgICogIHRoZSBjaGFubmVsIHBhbmUg4oCUIGluc3RlYWQgb2Ygb3BlbmluZyB0aGUgZmxhdCBgdXJsc1t6XWAuIChqaXQtdWkjNzYpICovXG4gIGNoYW5uZWxVcmxzPzogc3RyaW5nW11bXTtcbiAgaW1hZ2VNZXRhOiBJSW1hZ2VNZXRhZGF0YVtdO1xuICAvKiogSG93IHRoZSBPcGVuU2VhZHJhZ29uIGJhY2tlbmQgc2hvdWxkIHNvdXJjZSB0aGlzIGltYWdlLlxuICAgKiAgLSBgdHJ1ZWAvYWJzZW50IChkZWZhdWx0KTogc2VydmVyLXRpbGVkIOKAlCBPU0QgcG9sbHMgYC90aWxlcy9pbmZvYCBmb3IgYVxuICAgKiAgICBweXJhbWlkIGFuZCBmZXRjaGVzIHRpbGVzIGZyb20gdGhlIHNsaWRlLWNyb3Agc2VydmVyICh3aG9sZS1zbGlkZSBwYXRoKS5cbiAgICogIC0gYGZhbHNlYDogYSBzZWxmLWNvbnRhaW5lZCwgZGlyZWN0bHktbG9hZGFibGUgaW1hZ2Ug4oCUIGB1cmxzW3pJbmRleF1gIGlzIGFcbiAgICogICAgY29tcGxldGUgaW1hZ2UgKGUuZy4gYSBgYmxvYjpgIFVSTCBidWlsdCBmcm9tIGEgY2xpZW50LXNpZGUgcGl4ZWwgYnVmZmVyKSxcbiAgICogICAgb3BlbmVkIHZpYSBPU0QncyBzaW5nbGUtaW1hZ2Ugc291cmNlIHdpdGggbm8gdGlsZSBzZXJ2ZXIuIExldHMgaW4tbWVtb3J5XG4gICAqICAgIGltYWdlcyAodGhlIHByb2Nlc3NpbmcgcGlwZWxpbmUpIHVzZSB0aGUgT1NEIHZpZXdlciB3aXRob3V0IGEgcm91bmQtdHJpcC4gKi9cbiAgdGlsZWQ/OiBib29sZWFuO1xuICAvKiogT25lLXNob3QgaGludDogb3BlbiB0aGUgc3RhY2sgb24gdGhpcyBzbGljZSBpbnN0ZWFkIG9mIHNsaWNlIDAgKGUuZy4gdGhlXG4gICAqICBob3N0IGNsaWNrZWQgYSBzcGVjaWZpYyBmaWxlIHdpdGhpbiBhIG51bWJlcmVkIGltYWdlIHNlcmllcykuIFRoZVxuICAgKiAgY29tcG9uZW50IGNvbnN1bWVzIGFuZCBjbGVhcnMgdGhpcyB0aGUgZmlyc3QgdGltZSBpdCBzZWVzIHRoZSBvYmplY3QsIHNvXG4gICAqICByZS1kZWxpdmVyaW5nIHRoZSBzYW1lIEltYWdlSW5mbyAoZS5nLiBhIHBsb3QtdHlwZSBzd2l0Y2gpIGRvZXNuJ3QgcmVzZXRcbiAgICogIHRoZSB1c2VyJ3MgY3VycmVudCBzY3J1YiBwb3NpdGlvbi4gKi9cbiAgaW5pdGlhbFpJbmRleD86IG51bWJlcjtcbn1cbiJdfQ==
@@ -34,6 +34,15 @@ export var PlotType;
34
34
  PlotType["NAPARI_SCATTER"] = "napari-scatter";
35
35
  /** WebGPU 3D scatter of the downsampled voxel cloud (napari-js analog of Plotly SCATTER3D). */
36
36
  PlotType["NAPARI_SCATTER3D"] = "napari-scatter3d";
37
+ /** Spatial-omics observations (Visium spots, segmented cells) drawn over the tissue image and
38
+ * coloured by an annotation column or a gene. Needs a `SpatialDataset` on `SPATIAL_DATA_PORT`,
39
+ * so it is gated by `requiresSpatialData` and never appears for an image-only host. */
40
+ PlotType["SPATIAL_OMICS"] = "spatial-omics";
41
+ /** Spatial-omics observations as a 3D point cloud, for assays whose observations carry a z —
42
+ * serial sections registered into a common frame (e.g. the Allen CCF), or a genuinely
43
+ * volumetric assay. Gated by `requiresSpatial3d`, a strictly narrower gate than
44
+ * {@link SPATIAL_OMICS}: a single-plane dataset has no z to render. */
45
+ PlotType["SPATIAL_OMICS_3D"] = "spatial-omics-3d";
37
46
  })(PlotType || (PlotType = {}));
38
47
  /**
39
48
  * Single source of truth for plot-type metadata. LINE is intentionally absent —
@@ -66,6 +75,9 @@ export const PLOT_TYPE_DESCRIPTORS = {
66
75
  [PlotType.NAPARI_SCATTER3D]: { type: PlotType.NAPARI_SCATTER3D, label: 'Scatter 3D (napari · WebGPU)', icon: 'assets/plotting/3d-coordinates.svg', dimensions: '3d', source: 'image', requiresStack: true, requiresGrayscale: true },
67
76
  [PlotType.NAPARI_VOLUME]: { type: PlotType.NAPARI_VOLUME, label: 'Volume (napari · WebGPU)', productionLabel: 'Volume', icon: 'assets/plotting/cube-3d.svg', dimensions: '3d', source: 'image', requiresStack: true, requiresGrayscale: true },
68
77
  [PlotType.NAPARI_ISOSURFACE]: { type: PlotType.NAPARI_ISOSURFACE, label: 'Isosurface (napari · WebGPU)', productionLabel: 'Isosurface', icon: 'assets/plotting/isosurface.svg', dimensions: '3d', source: 'image', requiresStack: true, requiresGrayscale: true },
78
+ // ── Spatial omics ──
79
+ [PlotType.SPATIAL_OMICS]: { type: PlotType.SPATIAL_OMICS, label: 'Spatial omics (napari · WebGPU)', productionLabel: 'Spatial omics', icon: 'assets/plotting/spatial-omics.svg', dimensions: '2d', source: 'spatial', requiresSpatialData: true },
80
+ [PlotType.SPATIAL_OMICS_3D]: { type: PlotType.SPATIAL_OMICS_3D, label: 'Spatial omics 3D (napari · WebGPU)', productionLabel: 'Spatial omics 3D', icon: 'assets/plotting/spatial-omics-3d.svg', dimensions: '3d', source: 'spatial', requiresSpatialData: true, requiresSpatial3d: true },
69
81
  };
70
82
  export function getPlotTypeDescriptor(type) {
71
83
  return PLOT_TYPE_DESCRIPTORS[type];
@@ -94,6 +106,29 @@ export function isNapariScatter(type) {
94
106
  export function isNapariScatter3d(type) {
95
107
  return type === PlotType.NAPARI_SCATTER3D;
96
108
  }
109
+ /** Spatial-omics observations over the tissue image. */
110
+ export function isSpatialOmics(type) {
111
+ return type === PlotType.SPATIAL_OMICS;
112
+ }
113
+ /** Spatial-omics observations as a 3D point cloud. */
114
+ export function isSpatialOmics3d(type) {
115
+ return type === PlotType.SPATIAL_OMICS_3D;
116
+ }
117
+ /**
118
+ * Whether the renderer, rather than the shell, should handle wheel zoom.
119
+ *
120
+ * The shell's wheel listener applies a FIXED step per event, which is far too sensitive for a
121
+ * renderer that reads the scroll delta: it works out at 30% per event against napari-js's 3%, and
122
+ * ignores the device normalization and easing the renderer does. So every plot type drawn by a
123
+ * renderer that owns the wheel has to opt out here.
124
+ *
125
+ * The image view always did. The spatial-omics modes did NOT, despite being drawn by the same
126
+ * napari-js viewer — the shell gated on an `isHeatmap` flag that defaults to true and only goes
127
+ * false for the 3D Plotly scenes, so it silently took the wheel for them too.
128
+ */
129
+ export function rendererOwnsWheel(type) {
130
+ return type === PlotType.IMAGE || isSpatialOmics(type) || isSpatialOmics3d(type);
131
+ }
97
132
  /** Any napari-js 3D plot type (volume, isosurface, surface, or 3D scatter). Resolution is a runtime
98
133
  * decimate factor (Full / ½ / ¼ / ⅛) — see the service's `resolutionScale`. */
99
134
  export function isNapari3d(type) {
@@ -109,4 +144,4 @@ export const NAPARI_DECIMATE_OPTIONS = [
109
144
  /** Default decimate factor: ¼. The caps are set so ¼ is a sensible default resolution while ½ and
110
145
  * Full offer 2× and 4× the detail for opt-in high-resolution renders. */
111
146
  export const NAPARI_DEFAULT_DECIMATE = 4;
112
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxvdC10eXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jb250cmFjdHMvcGxvdC10eXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxDQUFOLElBQVksUUF1Qlg7QUF2QkQsV0FBWSxRQUFRO0lBQ2xCO2lGQUM2RTtJQUM3RSwyQkFBZSxDQUFBO0lBQ2YsK0JBQW1CLENBQUE7SUFDbkIsK0JBQW1CLENBQUE7SUFDbkIsK0JBQW1CLENBQUE7SUFDbkIsK0JBQW1CLENBQUE7SUFDbkIseUZBQXlGO0lBQ3pGLHlCQUFhLENBQUE7SUFDYixtQ0FBdUIsQ0FBQTtJQUN2QixxQ0FBeUIsQ0FBQTtJQUN6Qjt1R0FDbUc7SUFDbkcseUNBQTZCLENBQUE7SUFDN0IsMkNBQStCLENBQUE7SUFDL0IsbURBQXVDLENBQUE7SUFDdkMsZ0dBQWdHO0lBQ2hHLDZDQUFpQyxDQUFBO0lBQ2pDLGtGQUFrRjtJQUNsRiw2Q0FBaUMsQ0FBQTtJQUNqQywrRkFBK0Y7SUFDL0YsaURBQXFDLENBQUE7QUFDdkMsQ0FBQyxFQXZCVyxRQUFRLEtBQVIsUUFBUSxRQXVCbkI7QUFnREQ7Ozs7O0dBS0c7QUFDSCwrRkFBK0Y7QUFDL0Ysb0RBQW9EO0FBQ3BELGtGQUFrRjtBQUNsRixpRkFBaUY7QUFDakYsbUVBQW1FO0FBQ25FLDJFQUEyRTtBQUMzRSxzRUFBc0U7QUFDdEUsNEVBQTRFO0FBQzVFLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFrRDtJQUNsRixnQkFBZ0I7SUFDaEIsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBTyxLQUFLLEVBQUUsYUFBYSxFQUFZLGVBQWUsRUFBRSxPQUFPLEVBQU8sSUFBSSxFQUFFLGFBQWEsRUFBcUIsVUFBVSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFO0lBQzlM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LE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxjQUFjLENBQUM7QUFDMUMsQ0FBQztBQUNELCtDQUErQztBQUMvQyxNQUFNLFVBQVUsZUFBZSxDQUFDLElBQWM7SUFDNUMsT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLGNBQWMsQ0FBQztBQUMxQyxDQUFDO0FBQ0QsZ0RBQWdEO0FBQ2hELE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxJQUFjO0lBQzlDLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQztBQUM1QyxDQUFDO0FBQ0Q7Z0ZBQ2dGO0FBQ2hGLE1BQU0sVUFBVSxVQUFVLENBQUMsSUFBYztJQUN2QyxPQUFPLENBQ0wsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FDckcsQ0FBQztBQUNKLENBQUM7QUFFRCw2RUFBNkU7QUFDN0UsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQXVDO0lBQ3pFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO0lBQzNCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO0lBQ3hCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO0lBQ3hCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO0NBQ3pCLENBQUM7QUFFRjswRUFDMEU7QUFDMUUsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUga2luZCBvZiByZW5kZXJpbmcgYSB2aWV3ZXIgYmFja2VuZCBzaG91bGQgcHJvZHVjZSBmb3IgdGhlIGxvYWRlZCBkYXRhLlxuICpcbiAqIExpdmVzIGluIGBjb250cmFjdHMvYCAocmF0aGVyIHRoYW4gaW5zaWRlIGEgc3BlY2lmaWMgYmFja2VuZCkgYmVjYXVzZSBpdCBpc1xuICogcGFydCBvZiB0aGUgYmFja2VuZC1uZXV0cmFsIHBsb3R0aW5nIGNvbnRyYWN0OiBib3RoIHRoZSBQbG90bHkgYmFja2VuZCBhbmRcbiAqIGFueSBmdXR1cmUgYmFja2VuZCAoZS5nLiBPcGVuU2VhZHJhZ29uKSBhY2NlcHQgYSBgUGxvdFR5cGVgIG9uIGBwbG90KClgLlxuICpcbiAqIE5PVEU6IGEgYmFja2VuZCBtYXkgbm90IHN1cHBvcnQgZXZlcnkgdHlwZSDigJQgM0QgdHlwZXMgKGBTVVJGQUNFYCxcbiAqIGBTQ0FUVEVSM0RgLCBgSVNPU1VSRkFDRWApIGFyZSBnYXRlZCBiZWhpbmQgYFZpZXdlckZlYXR1cmUuU3VyZmFjZTNEYCBpbiB0aGVcbiAqIGNhcGFiaWxpdGllcyBjb250cmFjdCwgc28gYSAyRC1vbmx5IGJhY2tlbmQgY2FuIGFkdmVydGlzZSB0aGF0IGl0IGNhbid0XG4gKiByZW5kZXIgdGhlbSBhbmQgdGhlIFVJIGNhbiBoaWRlIHRoZSBvcHRpb24uXG4gKi9cbmV4cG9ydCBlbnVtIFBsb3RUeXBlIHtcbiAgLyoqIE5hdGl2ZWx5LXRpbGVkLCB6b29tYWJsZSByYXN0ZXIgcmVuZGVyZWQgYnkgT3BlblNlYWRyYWdvbiAodGhlIGRlZmF1bHRcbiAgICogIHZpZXcgZm9yIGFuIGltYWdlKS4gSGVhdG1hcCByZW1haW5zIHRoZSBQbG90bHkgc2NhbGFyLWltYWdlIHJlbmRlcmluZy4gKi9cbiAgSU1BR0UgPSAnaW1hZ2UnLFxuICBIRUFUTUFQID0gJ2hlYXRtYXAnLFxuICBTVVJGQUNFID0gJ3N1cmZhY2UnLFxuICBDT05UT1VSID0gJ2NvbnRvdXInLFxuICBTQ0FUVEVSID0gJ3NjYXR0ZXInLFxuICAvLyBMSU5FOiByZXNlcnZlZC9zdHViYmVkIOKAlCBpbnRlbnNpdHkgcHJvZmlsZXMgYXJlIG5vdyBSZWdpb24tYmFzZWQgKGtlcHQgZm9yIGZ1dHVyZSB1c2UpXG4gIExJTkUgPSAnbGluZScsXG4gIFNDQVRURVIzRCA9ICdzY2F0dGVyM2QnLFxuICBJU09TVVJGQUNFID0gJ2lzb3N1cmZhY2UnLFxuICAvKiogV2ViR1BVIG5hcGFyaS1qcyByZW5kZXJpbmdzIChqaXQtdWkjMTAyKSwgc2VsZWN0YWJsZSBhbG9uZ3NpZGUgdGhlIE9TRC9QbG90bHkgdHlwZXMuIFRoZSAzRFxuICAgKiAgdHlwZXMgdGFrZSBhIHJ1bnRpbWUgZGVjaW1hdGUgZmFjdG9yIChGdWxsIC8gwr0gLyDCvCAvIOKFmykgaW5zdGVhZCBvZiBmaXhlZCBoaS9sby1yZXMgdmFyaWFudHMuICovXG4gIE5BUEFSSV9JTUFHRSA9ICduYXBhcmktaW1hZ2UnLFxuICBOQVBBUklfVk9MVU1FID0gJ25hcGFyaS12b2x1bWUnLFxuICBOQVBBUklfSVNPU1VSRkFDRSA9ICduYXBhcmktaXNvc3VyZmFjZScsXG4gIC8qKiBXZWJHUFUgaGVpZ2h0LWZpZWxkIHN1cmZhY2UgbWVzaCAoeiA9IGludGVuc2l0eSksIHRoZSBuYXBhcmktanMgYW5hbG9nIG9mIFBsb3RseSBTVVJGQUNFLiAqL1xuICBOQVBBUklfU1VSRkFDRSA9ICduYXBhcmktc3VyZmFjZScsXG4gIC8qKiBXZWJHUFUgMkQgc2NhdHRlciBvZiByZWdpb24gY2VudHJvaWRzIChuYXBhcmktanMgYW5hbG9nIG9mIFBsb3RseSBTQ0FUVEVSKS4gKi9cbiAgTkFQQVJJX1NDQVRURVIgPSAnbmFwYXJpLXNjYXR0ZXInLFxuICAvKiogV2ViR1BVIDNEIHNjYXR0ZXIgb2YgdGhlIGRvd25zYW1wbGVkIHZveGVsIGNsb3VkIChuYXBhcmktanMgYW5hbG9nIG9mIFBsb3RseSBTQ0FUVEVSM0QpLiAqL1xuICBOQVBBUklfU0NBVFRFUjNEID0gJ25hcGFyaS1zY2F0dGVyM2QnLFxufVxuXG4vKiogSG93IG1hbnkgc3BhdGlhbCBkaW1lbnNpb25zIGEgcGxvdCB0eXBlIHJlbmRlcnMgaW4uICovXG5leHBvcnQgdHlwZSBQbG90RGltZW5zaW9ucyA9ICcyZCcgfCAnM2QnO1xuXG4vKipcbiAqIFdoZXJlIGEgcGxvdCB0eXBlIHB1bGxzIGl0cyBkYXRhIGZyb206XG4gKiAgLSBgaW1hZ2VgICAg4oCUIHRoZSBsb2FkZWQgcGl4ZWwgbWF0cmljZXMgLyB6LXN0YWNrIChIRUFUTUFQLCBTVVJGQUNFLCDigKYpXG4gKiAgLSBgcmVnaW9uc2Ag4oCUIHRoZSBkcmF3bi9kZXJpdmVkIHJlZ2lvbnMgKFNDQVRURVIgb2YgcmVnaW9uIGNlbnRyb2lkcywg4oCmKVxuICovXG5leHBvcnQgdHlwZSBQbG90RGF0YVNvdXJjZSA9ICdpbWFnZScgfCAncmVnaW9ucyc7XG5cbi8qKlxuICogQmFja2VuZC1uZXV0cmFsIG1ldGFkYXRhIGFib3V0IGEgcGxvdCB0eXBlLiBEcml2ZXMgVUkgYWZmb3JkYW5jZXMgKHdoaWNoXG4gKiB0eXBlcyBhcmUgM0QsIHdoaWNoIG5lZWQgYW4gaW1hZ2Ugc3RhY2ssIGhvdyB0byBsYWJlbCB0aGVtIGluIGEgZHJvcGRvd24pXG4gKiB3aXRob3V0IGFueSBiYWNrZW5kJ3MgdHJhY2UtYnVpbGRpbmcgbG9naWMgbGVha2luZyBpbnRvIHRoZSBjb250cmFjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbG90VHlwZURlc2NyaXB0b3Ige1xuICB0eXBlOiBQbG90VHlwZTtcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciBtZW51cy9kcm9wZG93bnMuIFNob3duIGluICoqdGVzdCBtb2RlKiosIHdoZXJlXG4gICAqICBldmVyeSBiYWNrZW5kJ3MgdHlwZSBpcyBvZmZlcmVkLCBzbyBpdCBjYXJyaWVzIHRoZSBiYWNrZW5kIHN1ZmZpeCAoZS5nLlxuICAgKiAgXCJTdXJmYWNlIChuYXBhcmkgwrcgV2ViR1BVKVwiKSB0byBkaXNhbWJpZ3VhdGUgc2FtZS1uYW1lZCBtb2Rlcy4gKi9cbiAgbGFiZWw6IHN0cmluZztcbiAgLyoqXG4gICAqIExhYmVsIHNob3duIGluIHRoZSAqKmRlZmF1bHQgKG5vbi10ZXN0KSBzZWxlY3RvcioqLCB3aGVyZSBhIHNpbmdsZSBjdXJhdGVkXG4gICAqIG1vZGUgb3ducyBlYWNoIG5hbWUg4oCUIHNvIGl0IGRyb3BzIHRoZSBiYWNrZW5kIHN1ZmZpeCAoZS5nLiBqdXN0IFwiU3VyZmFjZVwiKS5cbiAgICogQSB0eXBlIFdJVEhPVVQgYSBgcHJvZHVjdGlvbkxhYmVsYCBpcyAqKnRlc3Qtb25seSoqOiBoaWRkZW4gZnJvbSB0aGUgZGVmYXVsdFxuICAgKiBzZWxlY3RvciBhbmQgc2hvd24gb25seSB3aGVuIHRoZSBob3N0IGVuYWJsZXMgdGVzdCBtb2RlLiBUaGlzIGlzIHRoZSBzaW5nbGVcbiAgICoga25vYiB0aGF0IGN1cmF0ZXMgdGhlIGRlZmF1bHQgcGxvdC1tb2RlIGxpc3QgKGpheC1pbWFnZS12aXN1YWxpemF0aW9uKS5cbiAgICovXG4gIHByb2R1Y3Rpb25MYWJlbD86IHN0cmluZztcbiAgLyoqXG4gICAqIEljb24gc2hvd24gdG8gdGhlIGxlZnQgb2YgdGhlIGxhYmVsIGluIHRoZSBwbG90LXR5cGUgc2VsZWN0b3IuIEVpdGhlciBhXG4gICAqIFByaW1lTkcgaWNvbiBjbGFzcyAoc3RhcnRzIHdpdGggYHBpIGAsIGUuZy4gYHBpIHBpLWltYWdlYCkgcmVuZGVyZWQgYXMgYVxuICAgKiBmb250IGdseXBoLCBvciBhIHNlcnZlZCBTVkcgYXNzZXQgcGF0aCAoZS5nLiBgYXNzZXRzL3Bsb3R0aW5nL3N1cmZhY2Uuc3ZnYClcbiAgICogcmVuZGVyZWQgYXMgYW4gYDxpbWc+YC4gQm90aCBhcmUgdGludGVkIHRvIHRoZSB0b29sYmFyJ3MgcHJpbWFyeSBibHVlLlxuICAgKi9cbiAgaWNvbj86IHN0cmluZztcbiAgZGltZW5zaW9uczogUGxvdERpbWVuc2lvbnM7XG4gIHNvdXJjZTogUGxvdERhdGFTb3VyY2U7XG4gIC8qKiBUcnVlIHdoZW4gdGhlIHR5cGUgb25seSBtYWtlcyBzZW5zZSBvdmVyIGEgbXVsdGktZnJhbWUgei1zdGFjay4gKi9cbiAgcmVxdWlyZXNTdGFjaz86IGJvb2xlYW47XG4gIC8qKiBUcnVlIHdoZW4gdGhlIHR5cGUgbWFwcyBhIHNpbmdsZSBzY2FsYXIgaW50ZW5zaXR5IHBlciBwaXhlbCAoY29udG91cixcbiAgICogIHN1cmZhY2UsIGludGVuc2l0eSBwcm9maWxlLCBpc29zdXJmYWNlKSDigJQgb25seSBtZWFuaW5nZnVsIGZvciBncmF5c2NhbGUuXG4gICAqICBJbWFnZS9IZWF0bWFwIHJlbmRlciBSR0IgZmluZTsgU2NhdHRlciB1c2VzIHJlZ2lvbnMuICovXG4gIHJlcXVpcmVzR3JheXNjYWxlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBTaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciBwbG90LXR5cGUgbWV0YWRhdGEuIExJTkUgaXMgaW50ZW50aW9uYWxseSBhYnNlbnQg4oCUXG4gKiBpbnRlbnNpdHkgcHJvZmlsZXMgYXJlIG5vdyBSZWdpb24tYmFzZWQgbGluZSBST0lzIChhdmFpbGFibGUgaW4gSGVhdG1hcC9JbWFnZVxuICogbW9kZSksIHNvIExJTkUgaXMgbm8gbG9uZ2VyIG9mZmVyZWQgaW4gdGhlIHNlbGVjdG9yICh0aGUgZW51bSBtZW1iZXIgaXMga2VwdFxuICogZm9yIGZ1dHVyZSB1c2UpLiBIZW5jZSB0aGUgYFBhcnRpYWxgIHJlY29yZC5cbiAqL1xuLy8gRHJvcGRvd24gb3JkZXIgPSBpbnNlcnRpb24gb3JkZXI6IEltYWdlIChPU0QpIGRlZmF1bHQgYXQgdGhlIHRvcCwgdGhlbiBhbGwgUGxvdGx5IHBsb3QgbW9kZXNcbi8vIGdyb3VwZWQsIHRoZW4gYWxsIG5hcGFyaS1qcyBXZWJHUFUgbW9kZXMgZ3JvdXBlZC5cbi8vIGBwcm9kdWN0aW9uTGFiZWxgIG1hcmtzIHRoZSBjdXJhdGVkIGRlZmF1bHQtc2VsZWN0b3Igc2V0IChqaXQtdWkjNzAgZm9sbG93LXVwKTpcbi8vICAtIElNQUdFIC8gSEVBVE1BUCAvIENPTlRPVVIgKDJEKSBhbmQgdGhlIG5hcGFyaSBTVVJGQUNFIC8gVk9MVU1FIC8gSVNPU1VSRkFDRVxuLy8gICAgKDNEKSBhcmUgdGhlIG1vZGVzIHNob3duIGJ5IGRlZmF1bHQsIHVuZGVyIHN1ZmZpeC1mcmVlIG5hbWVzLlxuLy8gIC0gRXZlcnl0aGluZyBlbHNlIChhbGwgU2NhdHRlcnMsIE5BUEFSSV9JTUFHRSwgYW5kIHRoZSBQbG90bHkgU1VSRkFDRSAvXG4vLyAgICBJU09TVVJGQUNFIHRoYXQgdGhlIG5hcGFyaSB2ZXJzaW9ucyBzdXBlcnNlZGUpIGlzIHRlc3Qtb25seSDigJQgbm9cbi8vICAgIGBwcm9kdWN0aW9uTGFiZWxgLCBzbyBpdCBhcHBlYXJzIG9ubHkgd2hlbiB0aGUgaG9zdCBlbmFibGVzIHRlc3QgbW9kZS5cbmV4cG9ydCBjb25zdCBQTE9UX1RZUEVfREVTQ1JJUFRPUlM6IFBhcnRpYWw8UmVjb3JkPFBsb3RUeXBlLCBQbG90VHlwZURlc2NyaXB0b3I+PiA9IHtcbiAgLy8g4pSA4pSAIERlZmF1bHQg4pSA4pSAXG4gIFtQbG90VHlwZS5JTUFHRV06ICAgICAgeyB0eXBlOiBQbG90VHlwZS5JTUFHRSwgICAgICBsYWJlbDogJ0ltYWdlIChPU0QpJywgICAgICAgICAgIHByb2R1Y3Rpb25MYWJlbDogJ0ltYWdlJywgICAgICBpY29uOiAncGkgcGktaW1hZ2UnLCAgICAgICAgICAgICAgICAgICAgZGltZW5zaW9uczogJzJkJywgc291cmNlOiAnaW1hZ2UnIH0sXG4gIC8vIOKUgOKUgCBQbG90bHkg4pSA4pSAXG4gIFtQbG90VHlwZS5IRUFUTUFQXTogICAgeyB0eXBlOiBQbG90VHlwZS5IRUFUTUFQLCAgICBsYWJlbDogJ0hlYXRtYXAgKFBsb3RseSknLCAgICAgIHByb2R1Y3Rpb25MYWJlbDogJ0hlYXRtYXAnLCAgICBpY29uOiAnYXNzZXRzL3Bsb3R0aW5nL2hlYXRtYXAuc3ZnJywgICAgZGltZW5zaW9uczogJzJkJywgc291cmNlOiAnaW1hZ2UnIH0sXG4gIFtQbG90VHlwZS5DT05UT1VSXTogICAgeyB0eXBlOiBQbG90VHlwZS5DT05UT1VSLCAgICBsYWJlbDogJ0NvbnRvdXIgKFBsb3RseSknLCAgICAgIHByb2R1Y3Rpb25MYWJlbDogJ0NvbnRvdXInLCAgICBpY29uOiAnYXNzZXRzL3Bsb3R0aW5nL2NvbnRvdXIuc3ZnJywgICAgZGltZW5zaW9uczogJzJkJywgc291cmNlOiAnaW1hZ2UnLCByZXF1aXJlc0dyYXlzY2FsZTogdHJ1ZSB9LFxuICBbUGxvdFR5cGUuU0NBVFRFUl06ICAgIHsgdHlwZTogUGxvdFR5cGUuU0NBVFRFUiwgICAgbGFiZWw6ICdTY2F0dGVyIDJEIChQbG90bHkpJywgICBpY29uOiAncGkgcGktY2hhcnQtc2NhdHRlcicsICAgICAgICAgICAgZGltZW5zaW9uczogJzJkJywgc291cmNlOiAncmVnaW9ucycgfSxcbiAgW1Bsb3RUeXBlLlNVUkZBQ0VdOiAgICB7IHR5cGU6IFBsb3RUeXBlLlNVUkZBQ0UsICAgIGxhYmVsOiAnU3VyZmFjZSAoUGxvdGx5KScsICAgICAgaWNvbjogJ2Fzc2V0cy9wbG90dGluZy9zdXJmYWNlLnN2ZycsICAgIGRpbWVuc2lvbnM6ICczZCcsIHNvdXJjZTogJ2ltYWdlJywgcmVxdWlyZXNHcmF5c2NhbGU6IHRydWUgfSxcbiAgW1Bsb3RUeXBlLlNDQVRURVIzRF06ICB7IHR5cGU6IFBsb3RUeXBlLlNDQVRURVIzRCwgIGxhYmVsOiAnU2NhdHRlciAzRCAoUGxvdGx5KScsICAgaWNvbjogJ2Fzc2V0cy9wbG90dGluZy8zZC1jb29yZGluYXRlcy5zdmcnLCBkaW1lbnNpb25zOiAnM2QnLCBzb3VyY2U6ICdpbWFnZScsIHJlcXVpcmVzU3RhY2s6IHRydWUsIHJlcXVpcmVzR3JheXNjYWxlOiB0cnVlIH0sXG4gIFtQbG90VHlwZS5JU09TVVJGQUNFXTogeyB0eXBlOiBQbG90VHlwZS5JU09TVVJGQUNFLCBsYWJlbDogJ0lzb3N1cmZhY2UgKFBsb3RseSknLCAgIGljb246ICdhc3NldHMvcGxvdHRpbmcvaXNvc3VyZmFjZS5zdmcnLCBkaW1lbnNpb25zOiAnM2QnLCBzb3VyY2U6ICdpbWFnZScsIHJlcXVpcmVzU3RhY2s6IHRydWUsIHJlcXVpcmVzR3JheXNjYWxlOiB0cnVlIH0sXG4gIC8vIOKUgOKUgCBuYXBhcmktanMgV2ViR1BVIChqaXQtdWkjMTAyKS4gVGhlIDNEIHR5cGVzIHRha2UgYSBydW50aW1lIGRlY2ltYXRlIGZhY3Rvci4g4pSA4pSAXG4gIFtQbG90VHlwZS5OQVBBUklfSU1BR0VdOiAgICAgIHsgdHlwZTogUGxvdFR5cGUuTkFQQVJJX0lNQUdFLCAgICAgIGxhYmVsOiAnSW1hZ2UgKG5hcGFyaSDCtyBXZWJHUFUpJywgICAgICBpY29uOiAncGkgcGktaW1hZ2UnLCAgICAgICAgICAgICAgICAgICAgICAgIGRpbWVuc2lvbnM6ICcyZCcsIHNvdXJjZTogJ2ltYWdlJyB9LFxuICBbUGxvdFR5cGUuTkFQQVJJX1NDQVRURVJdOiAgICB7IHR5cGU6IFBsb3RUeXBlLk5BUEFSSV9TQ0FUVEVSLCAgICBsYWJlbDogJ1NjYXR0ZXIgMkQgKG5hcGFyaSDCtyBXZWJHUFUpJywgaWNvbjogJ3BpIHBpLWNoYXJ0LXNjYXR0ZXInLCAgICAgICAgICAgICAgICBkaW1lbnNpb25zOiAnMmQnLCBzb3VyY2U6ICdyZWdpb25zJyB9LFxuICBbUGxvdFR5cGUuTkFQQVJJX1NVUkZBQ0VdOiAgICB7IHR5cGU6IFBsb3RUeXBlLk5BUEFSSV9TVVJGQUNFLCAgICBsYWJlbDogJ1N1cmZhY2UgKG5hcGFyaSDCtyBXZWJHUFUpJywgICAgcHJvZHVjdGlvbkxhYmVsOiAnU3VyZmFjZScsICAgIGljb246ICdhc3NldHMvcGxvdHRpbmcvc3VyZmFjZS5zdmcnLCAgICAgICAgZGltZW5zaW9uczogJzNkJywgc291cmNlOiAnaW1hZ2UnIH0sIC8vIGEgaGVpZ2h0LWZpZWxkIGlzIHo9aW50ZW5zaXR5IG9mIG9uZSBwbGFuZSDigJQgd29ya3MgZm9yIGFueSBncmF5c2NhbGUvUkdCIGltYWdlIChSR0LihpJsdW1pbmFuY2UpLCBubyBzdGFjayBuZWVkZWRcbiAgW1Bsb3RUeXBlLk5BUEFSSV9TQ0FUVEVSM0RdOiAgeyB0eXBlOiBQbG90VHlwZS5OQVBBUklfU0NBVFRFUjNELCAgbGFiZWw6ICdTY2F0dGVyIDNEIChuYXBhcmkgwrcgV2ViR1BVKScsIGljb246ICdhc3NldHMvcGxvdHRpbmcvM2QtY29vcmRpbmF0ZXMuc3ZnJywgZGltZW5zaW9uczogJzNkJywgc291cmNlOiAnaW1hZ2UnLCByZXF1aXJlc1N0YWNrOiB0cnVlLCByZXF1aXJlc0dyYXlzY2FsZTogdHJ1ZSB9LFxuICBbUGxvdFR5cGUuTkFQQVJJX1ZPTFVNRV06ICAgICB7IHR5cGU6IFBsb3RUeXBlLk5BUEFSSV9WT0xVTUUsICAgICBsYWJlbDogJ1ZvbHVtZSAobmFwYXJpIMK3IFdlYkdQVSknLCAgICAgcHJvZHVjdGlvbkxhYmVsOiAnVm9sdW1lJywgICAgIGljb246ICdhc3NldHMvcGxvdHRpbmcvY3ViZS0zZC5zdmcnLCAgICAgICAgZGltZW5zaW9uczogJzNkJywgc291cmNlOiAnaW1hZ2UnLCByZXF1aXJlc1N0YWNrOiB0cnVlLCByZXF1aXJlc0dyYXlzY2FsZTogdHJ1ZSB9LFxuICBbUGxvdFR5cGUuTkFQQVJJX0lTT1NVUkZBQ0VdOiB7IHR5cGU6IFBsb3RUeXBlLk5BUEFSSV9JU09TVVJGQUNFLCBsYWJlbDogJ0lzb3N1cmZhY2UgKG5hcGFyaSDCtyBXZWJHUFUpJywgcHJvZHVjdGlvbkxhYmVsOiAnSXNvc3VyZmFjZScsIGljb246ICdhc3NldHMvcGxvdHRpbmcvaXNvc3VyZmFjZS5zdmcnLCAgICAgZGltZW5zaW9uczogJzNkJywgc291cmNlOiAnaW1hZ2UnLCByZXF1aXJlc1N0YWNrOiB0cnVlLCByZXF1aXJlc0dyYXlzY2FsZTogdHJ1ZSB9LFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBsb3RUeXBlRGVzY3JpcHRvcih0eXBlOiBQbG90VHlwZSk6IFBsb3RUeXBlRGVzY3JpcHRvciB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBQTE9UX1RZUEVfREVTQ1JJUFRPUlNbdHlwZV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1RocmVlRGltZW5zaW9uYWwodHlwZTogUGxvdFR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIFBMT1RfVFlQRV9ERVNDUklQVE9SU1t0eXBlXT8uZGltZW5zaW9ucyA9PT0gJzNkJztcbn1cblxuLy8g4pSA4pSAIG5hcGFyaS1qcyAzRCBwbG90LXR5cGUgcHJlZGljYXRlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8qKiBuYXBhcmktanMgdm9sdW1lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTmFwYXJpVm9sdW1lKHR5cGU6IFBsb3RUeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlID09PSBQbG90VHlwZS5OQVBBUklfVk9MVU1FO1xufVxuLyoqIG5hcGFyaS1qcyBpc29zdXJmYWNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTmFwYXJpSXNvc3VyZmFjZSh0eXBlOiBQbG90VHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZSA9PT0gUGxvdFR5cGUuTkFQQVJJX0lTT1NVUkZBQ0U7XG59XG4vKiogbmFwYXJpLWpzIGhlaWdodC1maWVsZCBzdXJmYWNlIG1lc2guICovXG5leHBvcnQgZnVuY3Rpb24gaXNOYXBhcmlTdXJmYWNlKHR5cGU6IFBsb3RUeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlID09PSBQbG90VHlwZS5OQVBBUklfU1VSRkFDRTtcbn1cbi8qKiBuYXBhcmktanMgMkQgc2NhdHRlciAocmVnaW9uIGNlbnRyb2lkcykuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOYXBhcmlTY2F0dGVyKHR5cGU6IFBsb3RUeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlID09PSBQbG90VHlwZS5OQVBBUklfU0NBVFRFUjtcbn1cbi8qKiBuYXBhcmktanMgM0Qgc2NhdHRlciAodm94ZWwgcG9pbnQgY2xvdWQpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTmFwYXJpU2NhdHRlcjNkKHR5cGU6IFBsb3RUeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlID09PSBQbG90VHlwZS5OQVBBUklfU0NBVFRFUjNEO1xufVxuLyoqIEFueSBuYXBhcmktanMgM0QgcGxvdCB0eXBlICh2b2x1bWUsIGlzb3N1cmZhY2UsIHN1cmZhY2UsIG9yIDNEIHNjYXR0ZXIpLiBSZXNvbHV0aW9uIGlzIGEgcnVudGltZVxuICogIGRlY2ltYXRlIGZhY3RvciAoRnVsbCAvIMK9IC8gwrwgLyDihZspIOKAlCBzZWUgdGhlIHNlcnZpY2UncyBgcmVzb2x1dGlvblNjYWxlYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc05hcGFyaTNkKHR5cGU6IFBsb3RUeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgaXNOYXBhcmlWb2x1bWUodHlwZSkgfHwgaXNOYXBhcmlJc29zdXJmYWNlKHR5cGUpIHx8IGlzTmFwYXJpU3VyZmFjZSh0eXBlKSB8fCBpc05hcGFyaVNjYXR0ZXIzZCh0eXBlKVxuICApO1xufVxuXG4vKiogRGVjaW1hdGUgZmFjdG9ycyBvZmZlcmVkIGJ5IHRoZSBSZXNvbHV0aW9uIGNvbnRyb2wgKDEgPSBGdWxsIOKApiA4ID0g4oWbKS4gKi9cbmV4cG9ydCBjb25zdCBOQVBBUklfREVDSU1BVEVfT1BUSU9OUzogeyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogbnVtYmVyIH1bXSA9IFtcbiAgeyBsYWJlbDogJ0Z1bGwnLCB2YWx1ZTogMSB9LFxuICB7IGxhYmVsOiAnwr0nLCB2YWx1ZTogMiB9LFxuICB7IGxhYmVsOiAnwrwnLCB2YWx1ZTogNCB9LFxuICB7IGxhYmVsOiAn4oWbJywgdmFsdWU6IDggfSxcbl07XG5cbi8qKiBEZWZhdWx0IGRlY2ltYXRlIGZhY3RvcjogwrwuIFRoZSBjYXBzIGFyZSBzZXQgc28gwrwgaXMgYSBzZW5zaWJsZSBkZWZhdWx0IHJlc29sdXRpb24gd2hpbGUgwr0gYW5kXG4gKiAgRnVsbCBvZmZlciAyw5cgYW5kIDTDlyB0aGUgZGV0YWlsIGZvciBvcHQtaW4gaGlnaC1yZXNvbHV0aW9uIHJlbmRlcnMuICovXG5leHBvcnQgY29uc3QgTkFQQVJJX0RFRkFVTFRfREVDSU1BVEUgPSA0O1xuIl19
147
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxvdC10eXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jb250cmFjdHMvcGxvdC10eXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxDQUFOLElBQVksUUFnQ1g7QUFoQ0QsV0FBWSxRQUFRO0lBQ2xCO2lGQUM2RTtJQUM3RSwyQkFBZSxDQUFBO0lBQ2YsK0JBQW1CLENBQUE7SUFDbkIsK0JBQW1CLENBQUE7SUFDbkIsK0JBQW1CLENBQUE7SUFDbkIsK0JBQW1CLENBQUE7SUFDbkIseUZBQXlGO0lBQ3pGLHlCQUFhLENBQUE7SUFDYixtQ0FBdUIsQ0FBQTtJQUN2QixxQ0FBeUIsQ0FBQTtJQUN6Qjt1R0FDbUc7SUFDbkcseUNBQTZCLENBQUE7SUFDN0IsMkNBQStCLENBQUE7SUFDL0IsbURBQXVDLENBQUE7SUFDdkMsZ0dBQWdHO0lBQ2hHLDZDQUFpQyxDQUFBO0lBQ2pDLGtGQUFrRjtJQUNsRiw2Q0FBaUMsQ0FBQTtJQUNqQywrRkFBK0Y7SUFDL0YsaURBQXFDLENBQUE7SUFDckM7OzRGQUV3RjtJQUN4RiwyQ0FBK0IsQ0FBQTtJQUMvQjs7OzRFQUd3RTtJQUN4RSxpREFBcUMsQ0FBQTtBQUN2QyxDQUFDLEVBaENXLFFBQVEsS0FBUixRQUFRLFFBZ0NuQjtBQThERDs7Ozs7R0FLRztBQUNILCtGQUErRjtBQUMvRixvREFBb0Q7QUFDcEQsa0ZBQWtGO0FBQ2xGLGlGQUFpRjtBQUNqRixtRUFBbUU7QUFDbkUsMkVBQTJFO0FBQzNFLHNFQUFzRTtBQUN0RSw0RUFBNEU7QUFDNUUsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQWtEO0lBQ2xGLGdCQUFnQjtJQUNoQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBTyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFPLEtBQUssRUFBRSxhQUFhLEVBQVksZUFBZSxFQUFFLE9BQU8sRUFBTyxJ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SyxRQUFRLENBQUMsZ0JBQWdCLENBQUM7QUFDNUMsQ0FBQztBQUNEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLElBQWM7SUFDOUMsT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLEtBQUssSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbkYsQ0FBQztBQUVEO2dGQUNnRjtBQUNoRixNQUFNLFVBQVUsVUFBVSxDQUFDLElBQWM7SUFDdkMsT0FBTyxDQUNMLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQ3JHLENBQUM7QUFDSixDQUFDO0FBRUQsNkVBQTZFO0FBQzdFLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUF1QztJQUN6RSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtJQUMzQixFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtJQUN4QixFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtJQUN4QixFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtDQUN6QixDQUFDO0FBRUY7MEVBQzBFO0FBQzFFLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIGtpbmQgb2YgcmVuZGVyaW5nIGEgdmlld2VyIGJhY2tlbmQgc2hvdWxkIHByb2R1Y2UgZm9yIHRoZSBsb2FkZWQgZGF0YS5cbiAqXG4gKiBMaXZlcyBpbiBgY29udHJhY3RzL2AgKHJhdGhlciB0aGFuIGluc2lkZSBhIHNwZWNpZmljIGJhY2tlbmQpIGJlY2F1c2UgaXQgaXNcbiAqIHBhcnQgb2YgdGhlIGJhY2tlbmQtbmV1dHJhbCBwbG90dGluZyBjb250cmFjdDogYm90aCB0aGUgUGxvdGx5IGJhY2tlbmQgYW5kXG4gKiBhbnkgZnV0dXJlIGJhY2tlbmQgKGUuZy4gT3BlblNlYWRyYWdvbikgYWNjZXB0IGEgYFBsb3RUeXBlYCBvbiBgcGxvdCgpYC5cbiAqXG4gKiBOT1RFOiBhIGJhY2tlbmQgbWF5IG5vdCBzdXBwb3J0IGV2ZXJ5IHR5cGUg4oCUIDNEIHR5cGVzIChgU1VSRkFDRWAsXG4gKiBgU0NBVFRFUjNEYCwgYElTT1NVUkZBQ0VgKSBhcmUgZ2F0ZWQgYmVoaW5kIGBWaWV3ZXJGZWF0dXJlLlN1cmZhY2UzRGAgaW4gdGhlXG4gKiBjYXBhYmlsaXRpZXMgY29udHJhY3QsIHNvIGEgMkQtb25seSBiYWNrZW5kIGNhbiBhZHZlcnRpc2UgdGhhdCBpdCBjYW4ndFxuICogcmVuZGVyIHRoZW0gYW5kIHRoZSBVSSBjYW4gaGlkZSB0aGUgb3B0aW9uLlxuICovXG5leHBvcnQgZW51bSBQbG90VHlwZSB7XG4gIC8qKiBOYXRpdmVseS10aWxlZCwgem9vbWFibGUgcmFzdGVyIHJlbmRlcmVkIGJ5IE9wZW5TZWFkcmFnb24gKHRoZSBkZWZhdWx0XG4gICAqICB2aWV3IGZvciBhbiBpbWFnZSkuIEhlYXRtYXAgcmVtYWlucyB0aGUgUGxvdGx5IHNjYWxhci1pbWFnZSByZW5kZXJpbmcuICovXG4gIElNQUdFID0gJ2ltYWdlJyxcbiAgSEVBVE1BUCA9ICdoZWF0bWFwJyxcbiAgU1VSRkFDRSA9ICdzdXJmYWNlJyxcbiAgQ09OVE9VUiA9ICdjb250b3VyJyxcbiAgU0NBVFRFUiA9ICdzY2F0dGVyJyxcbiAgLy8gTElORTogcmVzZXJ2ZWQvc3R1YmJlZCDigJQgaW50ZW5zaXR5IHByb2ZpbGVzIGFyZSBub3cgUmVnaW9uLWJhc2VkIChrZXB0IGZvciBmdXR1cmUgdXNlKVxuICBMSU5FID0gJ2xpbmUnLFxuICBTQ0FUVEVSM0QgPSAnc2NhdHRlcjNkJyxcbiAgSVNPU1VSRkFDRSA9ICdpc29zdXJmYWNlJyxcbiAgLyoqIFdlYkdQVSBuYXBhcmktanMgcmVuZGVyaW5ncyAoaml0LXVpIzEwMiksIHNlbGVjdGFibGUgYWxvbmdzaWRlIHRoZSBPU0QvUGxvdGx5IHR5cGVzLiBUaGUgM0RcbiAgICogIHR5cGVzIHRha2UgYSBydW50aW1lIGRlY2ltYXRlIGZhY3RvciAoRnVsbCAvIMK9IC8gwrwgLyDihZspIGluc3RlYWQgb2YgZml4ZWQgaGkvbG8tcmVzIHZhcmlhbnRzLiAqL1xuICBOQVBBUklfSU1BR0UgPSAnbmFwYXJpLWltYWdlJyxcbiAgTkFQQVJJX1ZPTFVNRSA9ICduYXBhcmktdm9sdW1lJyxcbiAgTkFQQVJJX0lTT1NVUkZBQ0UgPSAnbmFwYXJpLWlzb3N1cmZhY2UnLFxuICAvKiogV2ViR1BVIGhlaWdodC1maWVsZCBzdXJmYWNlIG1lc2ggKHogPSBpbnRlbnNpdHkpLCB0aGUgbmFwYXJpLWpzIGFuYWxvZyBvZiBQbG90bHkgU1VSRkFDRS4gKi9cbiAgTkFQQVJJX1NVUkZBQ0UgPSAnbmFwYXJpLXN1cmZhY2UnLFxuICAvKiogV2ViR1BVIDJEIHNjYXR0ZXIgb2YgcmVnaW9uIGNlbnRyb2lkcyAobmFwYXJpLWpzIGFuYWxvZyBvZiBQbG90bHkgU0NBVFRFUikuICovXG4gIE5BUEFSSV9TQ0FUVEVSID0gJ25hcGFyaS1zY2F0dGVyJyxcbiAgLyoqIFdlYkdQVSAzRCBzY2F0dGVyIG9mIHRoZSBkb3duc2FtcGxlZCB2b3hlbCBjbG91ZCAobmFwYXJpLWpzIGFuYWxvZyBvZiBQbG90bHkgU0NBVFRFUjNEKS4gKi9cbiAgTkFQQVJJX1NDQVRURVIzRCA9ICduYXBhcmktc2NhdHRlcjNkJyxcbiAgLyoqIFNwYXRpYWwtb21pY3Mgb2JzZXJ2YXRpb25zIChWaXNpdW0gc3BvdHMsIHNlZ21lbnRlZCBjZWxscykgZHJhd24gb3ZlciB0aGUgdGlzc3VlIGltYWdlIGFuZFxuICAgKiAgY29sb3VyZWQgYnkgYW4gYW5ub3RhdGlvbiBjb2x1bW4gb3IgYSBnZW5lLiBOZWVkcyBhIGBTcGF0aWFsRGF0YXNldGAgb24gYFNQQVRJQUxfREFUQV9QT1JUYCxcbiAgICogIHNvIGl0IGlzIGdhdGVkIGJ5IGByZXF1aXJlc1NwYXRpYWxEYXRhYCBhbmQgbmV2ZXIgYXBwZWFycyBmb3IgYW4gaW1hZ2Utb25seSBob3N0LiAqL1xuICBTUEFUSUFMX09NSUNTID0gJ3NwYXRpYWwtb21pY3MnLFxuICAvKiogU3BhdGlhbC1vbWljcyBvYnNlcnZhdGlvbnMgYXMgYSAzRCBwb2ludCBjbG91ZCwgZm9yIGFzc2F5cyB3aG9zZSBvYnNlcnZhdGlvbnMgY2FycnkgYSB6IOKAlFxuICAgKiAgc2VyaWFsIHNlY3Rpb25zIHJlZ2lzdGVyZWQgaW50byBhIGNvbW1vbiBmcmFtZSAoZS5nLiB0aGUgQWxsZW4gQ0NGKSwgb3IgYSBnZW51aW5lbHlcbiAgICogIHZvbHVtZXRyaWMgYXNzYXkuIEdhdGVkIGJ5IGByZXF1aXJlc1NwYXRpYWwzZGAsIGEgc3RyaWN0bHkgbmFycm93ZXIgZ2F0ZSB0aGFuXG4gICAqICB7QGxpbmsgU1BBVElBTF9PTUlDU306IGEgc2luZ2xlLXBsYW5lIGRhdGFzZXQgaGFzIG5vIHogdG8gcmVuZGVyLiAqL1xuICBTUEFUSUFMX09NSUNTXzNEID0gJ3NwYXRpYWwtb21pY3MtM2QnLFxufVxuXG4vKiogSG93IG1hbnkgc3BhdGlhbCBkaW1lbnNpb25zIGEgcGxvdCB0eXBlIHJlbmRlcnMgaW4uICovXG5leHBvcnQgdHlwZSBQbG90RGltZW5zaW9ucyA9ICcyZCcgfCAnM2QnO1xuXG4vKipcbiAqIFdoZXJlIGEgcGxvdCB0eXBlIHB1bGxzIGl0cyBkYXRhIGZyb206XG4gKiAgLSBgaW1hZ2VgICAg4oCUIHRoZSBsb2FkZWQgcGl4ZWwgbWF0cmljZXMgLyB6LXN0YWNrIChIRUFUTUFQLCBTVVJGQUNFLCDigKYpXG4gKiAgLSBgcmVnaW9uc2Ag4oCUIHRoZSBkcmF3bi9kZXJpdmVkIHJlZ2lvbnMgKFNDQVRURVIgb2YgcmVnaW9uIGNlbnRyb2lkcywg4oCmKVxuICogIC0gYHNwYXRpYWxgIOKAlCBhIGBTcGF0aWFsRGF0YXNldGAgc3VwcGxpZWQgdGhyb3VnaCBgU1BBVElBTF9EQVRBX1BPUlRgOiBOXG4gKiAgICBvYnNlcnZhdGlvbnMgKHNwb3RzL2NlbGxzKSB3aXRoIGNhdGVnb3JpY2FsICsgY29udGludW91cyBjb2x1bW5zIGFuZCBhXG4gKiAgICBsYXppbHktZmV0Y2hlZCBmZWF0dXJlIG1hdHJpeCwgZHJhd24gb3ZlciB0aGUgdGlzc3VlIGltYWdlIHRoZXkgY2FtZSBmcm9tLlxuICovXG5leHBvcnQgdHlwZSBQbG90RGF0YVNvdXJjZSA9ICdpbWFnZScgfCAncmVnaW9ucycgfCAnc3BhdGlhbCc7XG5cbi8qKlxuICogQmFja2VuZC1uZXV0cmFsIG1ldGFkYXRhIGFib3V0IGEgcGxvdCB0eXBlLiBEcml2ZXMgVUkgYWZmb3JkYW5jZXMgKHdoaWNoXG4gKiB0eXBlcyBhcmUgM0QsIHdoaWNoIG5lZWQgYW4gaW1hZ2Ugc3RhY2ssIGhvdyB0byBsYWJlbCB0aGVtIGluIGEgZHJvcGRvd24pXG4gKiB3aXRob3V0IGFueSBiYWNrZW5kJ3MgdHJhY2UtYnVpbGRpbmcgbG9naWMgbGVha2luZyBpbnRvIHRoZSBjb250cmFjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbG90VHlwZURlc2NyaXB0b3Ige1xuICB0eXBlOiBQbG90VHlwZTtcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciBtZW51cy9kcm9wZG93bnMuIFNob3duIGluICoqdGVzdCBtb2RlKiosIHdoZXJlXG4gICAqICBldmVyeSBiYWNrZW5kJ3MgdHlwZSBpcyBvZmZlcmVkLCBzbyBpdCBjYXJyaWVzIHRoZSBiYWNrZW5kIHN1ZmZpeCAoZS5nLlxuICAgKiAgXCJTdXJmYWNlIChuYXBhcmkgwrcgV2ViR1BVKVwiKSB0byBkaXNhbWJpZ3VhdGUgc2FtZS1uYW1lZCBtb2Rlcy4gKi9cbiAgbGFiZWw6IHN0cmluZztcbiAgLyoqXG4gICAqIExhYmVsIHNob3duIGluIHRoZSAqKmRlZmF1bHQgKG5vbi10ZXN0KSBzZWxlY3RvcioqLCB3aGVyZSBhIHNpbmdsZSBjdXJhdGVkXG4gICAqIG1vZGUgb3ducyBlYWNoIG5hbWUg4oCUIHNvIGl0IGRyb3BzIHRoZSBiYWNrZW5kIHN1ZmZpeCAoZS5nLiBqdXN0IFwiU3VyZmFjZVwiKS5cbiAgICogQSB0eXBlIFdJVEhPVVQgYSBgcHJvZHVjdGlvbkxhYmVsYCBpcyAqKnRlc3Qtb25seSoqOiBoaWRkZW4gZnJvbSB0aGUgZGVmYXVsdFxuICAgKiBzZWxlY3RvciBhbmQgc2hvd24gb25seSB3aGVuIHRoZSBob3N0IGVuYWJsZXMgdGVzdCBtb2RlLiBUaGlzIGlzIHRoZSBzaW5nbGVcbiAgICoga25vYiB0aGF0IGN1cmF0ZXMgdGhlIGRlZmF1bHQgcGxvdC1tb2RlIGxpc3QgKGpheC1pbWFnZS12aXN1YWxpemF0aW9uKS5cbiAgICovXG4gIHByb2R1Y3Rpb25MYWJlbD86IHN0cmluZztcbiAgLyoqXG4gICAqIEljb24gc2hvd24gdG8gdGhlIGxlZnQgb2YgdGhlIGxhYmVsIGluIHRoZSBwbG90LXR5cGUgc2VsZWN0b3IuIEVpdGhlciBhXG4gICAqIFByaW1lTkcgaWNvbiBjbGFzcyAoc3RhcnRzIHdpdGggYHBpIGAsIGUuZy4gYHBpIHBpLWltYWdlYCkgcmVuZGVyZWQgYXMgYVxuICAgKiBmb250IGdseXBoLCBvciBhIHNlcnZlZCBTVkcgYXNzZXQgcGF0aCAoZS5nLiBgYXNzZXRzL3Bsb3R0aW5nL3N1cmZhY2Uuc3ZnYClcbiAgICogcmVuZGVyZWQgYXMgYW4gYDxpbWc+YC4gQm90aCBhcmUgdGludGVkIHRvIHRoZSB0b29sYmFyJ3MgcHJpbWFyeSBibHVlLlxuICAgKi9cbiAgaWNvbj86IHN0cmluZztcbiAgZGltZW5zaW9uczogUGxvdERpbWVuc2lvbnM7XG4gIHNvdXJjZTogUGxvdERhdGFTb3VyY2U7XG4gIC8qKiBUcnVlIHdoZW4gdGhlIHR5cGUgb25seSBtYWtlcyBzZW5zZSBvdmVyIGEgbXVsdGktZnJhbWUgei1zdGFjay4gKi9cbiAgcmVxdWlyZXNTdGFjaz86IGJvb2xlYW47XG4gIC8qKiBUcnVlIHdoZW4gdGhlIHR5cGUgbWFwcyBhIHNpbmdsZSBzY2FsYXIgaW50ZW5zaXR5IHBlciBwaXhlbCAoY29udG91cixcbiAgICogIHN1cmZhY2UsIGludGVuc2l0eSBwcm9maWxlLCBpc29zdXJmYWNlKSDigJQgb25seSBtZWFuaW5nZnVsIGZvciBncmF5c2NhbGUuXG4gICAqICBJbWFnZS9IZWF0bWFwIHJlbmRlciBSR0IgZmluZTsgU2NhdHRlciB1c2VzIHJlZ2lvbnMuICovXG4gIHJlcXVpcmVzR3JheXNjYWxlPzogYm9vbGVhbjtcbiAgLyoqIFRydWUgd2hlbiB0aGUgdHlwZSByZW5kZXJzIGEgYFNwYXRpYWxEYXRhc2V0YCAoYHNvdXJjZTogJ3NwYXRpYWwnYCkgYW5kIGlzXG4gICAqICB0aGVyZWZvcmUgbWVhbmluZ2xlc3Mgd2l0aG91dCBvbmUuIFRoZSBzZWxlY3RvciBoaWRlcyBpdCB1bnRpbCBhIGRhdGFzZXQgaXNcbiAgICogIHB1Ymxpc2hlZCBvbiBgU1BBVElBTF9EQVRBX1BPUlRgIOKAlCB0aGUgc2FtZSBzaGFwZSBvZiBnYXRlIGFzXG4gICAqICB7QGxpbmsgcmVxdWlyZXNTdGFja30gZm9yIGEgei1zdGFjaywgc28gYSBob3N0IHdpdGggbm8gc3BhdGlhbCBkYXRhIG5ldmVyXG4gICAqICBzZWVzIHRoZSBtb2RlLiAqL1xuICByZXF1aXJlc1NwYXRpYWxEYXRhPzogYm9vbGVhbjtcbiAgLyoqIFRydWUgd2hlbiB0aGUgdHlwZSBuZWVkcyBvYnNlcnZhdGlvbnMgd2l0aCBhIHogY29vcmRpbmF0ZSwgbm90IG1lcmVseSBhXG4gICAqICBgU3BhdGlhbERhdGFzZXRgLiBOYXJyb3dlciB0aGFuIHtAbGluayByZXF1aXJlc1NwYXRpYWxEYXRhfTogbW9zdCBzcGF0aWFsXG4gICAqICBhc3NheXMgYXJlIGEgc2luZ2xlIHBsYW5lLCBzbyB0aGlzIGhpZGVzIHRoZSAzRCBtb2RlIHVubGVzcyB0aGUgcHVibGlzaGVkXG4gICAqICBkYXRhc2V0IGFjdHVhbGx5IGNhcnJpZXMgYG9ic2VydmF0aW9ucy56YC4gKi9cbiAgcmVxdWlyZXNTcGF0aWFsM2Q/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHBsb3QtdHlwZSBtZXRhZGF0YS4gTElORSBpcyBpbnRlbnRpb25hbGx5IGFic2VudCDigJRcbiAqIGludGVuc2l0eSBwcm9maWxlcyBhcmUgbm93IFJlZ2lvbi1iYXNlZCBsaW5lIFJPSXMgKGF2YWlsYWJsZSBpbiBIZWF0bWFwL0ltYWdlXG4gKiBtb2RlKSwgc28gTElORSBpcyBubyBsb25nZXIgb2ZmZXJlZCBpbiB0aGUgc2VsZWN0b3IgKHRoZSBlbnVtIG1lbWJlciBpcyBrZXB0XG4gKiBmb3IgZnV0dXJlIHVzZSkuIEhlbmNlIHRoZSBgUGFydGlhbGAgcmVjb3JkLlxuICovXG4vLyBEcm9wZG93biBvcmRlciA9IGluc2VydGlvbiBvcmRlcjogSW1hZ2UgKE9TRCkgZGVmYXVsdCBhdCB0aGUgdG9wLCB0aGVuIGFsbCBQbG90bHkgcGxvdCBtb2Rlc1xuLy8gZ3JvdXBlZCwgdGhlbiBhbGwgbmFwYXJpLWpzIFdlYkdQVSBtb2RlcyBncm91cGVkLlxuLy8gYHByb2R1Y3Rpb25MYWJlbGAgbWFya3MgdGhlIGN1cmF0ZWQgZGVmYXVsdC1zZWxlY3RvciBzZXQgKGppdC11aSM3MCBmb2xsb3ctdXApOlxuLy8gIC0gSU1BR0UgLyBIRUFUTUFQIC8gQ09OVE9VUiAoMkQpIGFuZCB0aGUgbmFwYXJpIFNVUkZBQ0UgLyBWT0xVTUUgLyBJU09TVVJGQUNFXG4vLyAgICAoM0QpIGFyZSB0aGUgbW9kZXMgc2hvd24gYnkgZGVmYXVsdCwgdW5kZXIgc3VmZml4LWZyZWUgbmFtZXMuXG4vLyAgLSBFdmVyeXRoaW5nIGVsc2UgKGFsbCBTY2F0dGVycywgTkFQQVJJX0lNQUdFLCBhbmQgdGhlIFBsb3RseSBTVVJGQUNFIC9cbi8vICAgIElTT1NVUkZBQ0UgdGhhdCB0aGUgbmFwYXJpIHZlcnNpb25zIHN1cGVyc2VkZSkgaXMgdGVzdC1vbmx5IOKAlCBub1xuLy8gICAgYHByb2R1Y3Rpb25MYWJlbGAsIHNvIGl0IGFwcGVhcnMgb25seSB3aGVuIHRoZSBob3N0IGVuYWJsZXMgdGVzdCBtb2RlLlxuZXhwb3J0IGNvbnN0IFBMT1RfVFlQRV9ERVNDUklQVE9SUzogUGFydGlhbDxSZWNvcmQ8UGxvdFR5cGUsIFBsb3RUeXBlRGVzY3JpcHRvcj4+ID0ge1xuICAvLyDilIDilIAgRGVmYXVsdCDilIDilIBcbiAgW1Bsb3RUeXBlLklNQUdFXTogICAgICB7IHR5cGU6IFBsb3RUeXBlLklNQUdFLCAgICAgIGxhYmVsOiAnSW1hZ2UgKE9TRCknLCAgICAgICAgICAgcHJvZHVjdGlvbkxhYmVsOiAnSW1hZ2UnLCAgICAgIGljb246ICdwaSBwaS1pbWFnZScsICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb25zOiAnMmQnLCBzb3VyY2U6ICdpbWFnZScgfSxcbiAgLy8g4pSA4pSAIFBsb3RseSDilIDilIBcbiAgW1Bsb3RUeXBlLkhFQVRNQVBdOiAgICB7IHR5cGU6IFBsb3RUeXBlLkhFQVRNQVAsICAgIGxhYmVsOiAnSGVhdG1hcCAoUGxvdGx5KScsICAgICAgcHJvZHVjdGlvbkxhYmVsOiAnSGVhdG1hcCcsICAgIGljb246ICdhc3NldHMvcGxvdHRpbmcvaGVhdG1hcC5zdmcnLCAgICBkaW1lbnNpb25zOiAnMmQnLCBzb3VyY2U6ICdpbWFnZScgfSxcbiAgW1Bsb3RUeXBlLkNPTlRPVVJdOiAgICB7IHR5cGU6IFBsb3RUeXBlLkNPTlRPVVIsICAgIGxhYmVsOiAnQ29udG91ciAoUGxvdGx5KScsICAgICAgcHJvZHVjdGlvbkxhYmVsOiAnQ29udG91cicsICAgIGljb246ICdhc3NldHMvcGxvdHRpbmcvY29udG91ci5zdmcnLCAgICBkaW1lbnNpb25zOiAnMmQnLCBzb3VyY2U6ICdpbWFnZScsIHJlcXVpcmVzR3JheXNjYWxlOiB0cnVlIH0sXG4gIFtQbG90VHlwZS5TQ0FUVEVSXTogICAgeyB0eXBlOiBQbG90VHlwZS5TQ0FUVEVSLCAgICBsYWJlbDogJ1NjYXR0ZXIgMkQgKFBsb3RseSknLCAgIGljb246ICdwaSBwaS1jaGFydC1zY2F0dGVyJywgICAgICAgICAgICBkaW1lbnNpb25zOiAnMmQnLCBzb3VyY2U6ICdyZWdpb25zJyB9LFxuICBbUGxvdFR5cGUuU1VSRkFDRV06ICAgIHsgdHlwZTogUGxvdFR5cGUuU1VSRkFDRSwgICAgbGFiZWw6ICdTdXJmYWNlIChQbG90bHkpJywgICAgICBpY29uOiAnYXNzZXRzL3Bsb3R0aW5nL3N1cmZhY2Uuc3ZnJywgICAgZGltZW5zaW9uczogJzNkJywgc291cmNlOiAnaW1hZ2UnLCByZXF1aXJlc0dyYXlzY2FsZTogdHJ1ZSB9LFxuICBbUGxvdFR5cGUuU0NBVFRFUjNEXTogIHsgdHlwZTogUGxvdFR5cGUuU0NBVFRFUjNELCAgbGFiZWw6ICdTY2F0dGVyIDNEIChQbG90bHkpJywgICBpY29uOiAnYXNzZXRzL3Bsb3R0aW5nLzNkLWNvb3JkaW5hdGVzLnN2ZycsIGRpbWVuc2lvbnM6ICczZCcsIHNvdXJjZTogJ2ltYWdlJywgcmVxdWlyZXNTdGFjazogdHJ1ZSwgcmVxdWlyZXNHcmF5c2NhbGU6IHRydWUgfSxcbiAgW1Bsb3RUeXBlLklTT1NVUkZBQ0VdOiB7IHR5cGU6IFBsb3RUeXBlLklTT1NVUkZBQ0UsIGxhYmVsOiAnSXNvc3VyZmFjZSAoUGxvdGx5KScsICAgaWNvbjogJ2Fzc2V0cy9wbG90dGluZy9pc29zdXJmYWNlLnN2ZycsIGRpbWVuc2lvbnM6ICczZCcsIHNvdXJjZTogJ2ltYWdlJywgcmVxdWlyZXNTdGFjazogdHJ1ZSwgcmVxdWlyZXNHcmF5c2NhbGU6IHRydWUgfSxcbiAgLy8g4pSA4pSAIG5hcGFyaS1qcyBXZWJHUFUgKGppdC11aSMxMDIpLiBUaGUgM0QgdHlwZXMgdGFrZSBhIHJ1bnRpbWUgZGVjaW1hdGUgZmFjdG9yLiDilIDilIBcbiAgW1Bsb3RUeXBlLk5BUEFSSV9JTUFHRV06ICAgICAgeyB0eXBlOiBQbG90VHlwZS5OQVBBUklfSU1BR0UsICAgICAgbGFiZWw6ICdJbWFnZSAobmFwYXJpIMK3IFdlYkdQVSknLCAgICAgIGljb246ICdwaSBwaS1pbWFnZScsICAgICAgICAgICAgICAgICAgICAgICAgZGltZW5zaW9uczogJzJkJywgc291cmNlOiAnaW1hZ2UnIH0sXG4gIFtQbG90VHlwZS5OQVBBUklfU0NBVFRFUl06ICAgIHsgdHlwZTogUGxvdFR5cGUuTkFQQVJJX1NDQVRURVIsICAgIGxhYmVsOiAnU2NhdHRlciAyRCAobmFwYXJpIMK3IFdlYkdQVSknLCBpY29uOiAncGkgcGktY2hhcnQtc2NhdHRlcicsICAgICAgICAgICAgICAgIGRpbWVuc2lvbnM6ICcyZCcsIHNvdXJjZTogJ3JlZ2lvbnMnIH0sXG4gIFtQbG90VHlwZS5OQVBBUklfU1VSRkFDRV06ICAgIHsgdHlwZTogUGxvdFR5cGUuTkFQQVJJX1NVUkZBQ0UsICAgIGxhYmVsOiAnU3VyZmFjZSAobmFwYXJpIMK3IFdlYkdQVSknLCAgICBwcm9kdWN0aW9uTGFiZWw6ICdTdXJmYWNlJywgICAgaWNvbjogJ2Fzc2V0cy9wbG90dGluZy9zdXJmYWNlLnN2ZycsICAgICAgICBkaW1lbnNpb25zOiAnM2QnLCBzb3VyY2U6ICdpbWFnZScgfSwgLy8gYSBoZWlnaHQtZmllbGQgaXMgej1pbnRlbnNpdHkgb2Ygb25lIHBsYW5lIOKAlCB3b3JrcyBmb3IgYW55IGdyYXlzY2FsZS9SR0IgaW1hZ2UgKFJHQuKGkmx1bWluYW5jZSksIG5vIHN0YWNrIG5lZWRlZFxuICBbUGxvdFR5cGUuTkFQQVJJX1NDQVRURVIzRF06ICB7IHR5cGU6IFBsb3RUeXBlLk5BUEFSSV9TQ0FUVEVSM0QsICBsYWJlbDogJ1NjYXR0ZXIgM0QgKG5hcGFyaSDCtyBXZWJHUFUpJywgaWNvbjogJ2Fzc2V0cy9wbG90dGluZy8zZC1jb29yZGluYXRlcy5zdmcnLCBkaW1lbnNpb25zOiAnM2QnLCBzb3VyY2U6ICdpbWFnZScsIHJlcXVpcmVzU3RhY2s6IHRydWUsIHJlcXVpcmVzR3JheXNjYWxlOiB0cnVlIH0sXG4gIFtQbG90VHlwZS5OQVBBUklfVk9MVU1FXTogICAgIHsgdHlwZTogUGxvdFR5cGUuTkFQQVJJX1ZPTFVNRSwgICAgIGxhYmVsOiAnVm9sdW1lIChuYXBhcmkgwrcgV2ViR1BVKScsICAgICBwcm9kdWN0aW9uTGFiZWw6ICdWb2x1bWUnLCAgICAgaWNvbjogJ2Fzc2V0cy9wbG90dGluZy9jdWJlLTNkLnN2ZycsICAgICAgICBkaW1lbnNpb25zOiAnM2QnLCBzb3VyY2U6ICdpbWFnZScsIHJlcXVpcmVzU3RhY2s6IHRydWUsIHJlcXVpcmVzR3JheXNjYWxlOiB0cnVlIH0sXG4gIFtQbG90VHlwZS5OQVBBUklfSVNPU1VSRkFDRV06IHsgdHlwZTogUGxvdFR5cGUuTkFQQVJJX0lTT1NVUkZBQ0UsIGxhYmVsOiAnSXNvc3VyZmFjZSAobmFwYXJpIMK3IFdlYkdQVSknLCBwcm9kdWN0aW9uTGFiZWw6ICdJc29zdXJmYWNlJywgaWNvbjogJ2Fzc2V0cy9wbG90dGluZy9pc29zdXJmYWNlLnN2ZycsICAgICBkaW1lbnNpb25zOiAnM2QnLCBzb3VyY2U6ICdpbWFnZScsIHJlcXVpcmVzU3RhY2s6IHRydWUsIHJlcXVpcmVzR3JheXNjYWxlOiB0cnVlIH0sXG4gIC8vIOKUgOKUgCBTcGF0aWFsIG9taWNzIOKUgOKUgFxuICBbUGxvdFR5cGUuU1BBVElBTF9PTUlDU106ICAgICB7IHR5cGU6IFBsb3RUeXBlLlNQQVRJQUxfT01JQ1MsICAgICBsYWJlbDogJ1NwYXRpYWwgb21pY3MgKG5hcGFyaSDCtyBXZWJHUFUpJywgcHJvZHVjdGlvbkxhYmVsOiAnU3BhdGlhbCBvbWljcycsIGljb246ICdhc3NldHMvcGxvdHRpbmcvc3BhdGlhbC1vbWljcy5zdmcnLCAgZGltZW5zaW9uczogJzJkJywgc291cmNlOiAnc3BhdGlhbCcsIHJlcXVpcmVzU3BhdGlhbERhdGE6IHRydWUgfSxcbiAgW1Bsb3RUeXBlLlNQQVRJQUxfT01JQ1NfM0RdOiAgeyB0eXBlOiBQbG90VHlwZS5TUEFUSUFMX09NSUNTXzNELCAgbGFiZWw6ICdTcGF0aWFsIG9taWNzIDNEIChuYXBhcmkgwrcgV2ViR1BVKScsIHByb2R1Y3Rpb25MYWJlbDogJ1NwYXRpYWwgb21pY3MgM0QnLCBpY29uOiAnYXNzZXRzL3Bsb3R0aW5nL3NwYXRpYWwtb21pY3MtM2Quc3ZnJywgZGltZW5zaW9uczogJzNkJywgc291cmNlOiAnc3BhdGlhbCcsIHJlcXVpcmVzU3BhdGlhbERhdGE6IHRydWUsIHJlcXVpcmVzU3BhdGlhbDNkOiB0cnVlIH0sXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGxvdFR5cGVEZXNjcmlwdG9yKHR5cGU6IFBsb3RUeXBlKTogUGxvdFR5cGVEZXNjcmlwdG9yIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIFBMT1RfVFlQRV9ERVNDUklQVE9SU1t0eXBlXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVGhyZWVEaW1lbnNpb25hbCh0eXBlOiBQbG90VHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gUExPVF9UWVBFX0RFU0NSSVBUT1JTW3R5cGVdPy5kaW1lbnNpb25zID09PSAnM2QnO1xufVxuXG4vLyDilIDilIAgbmFwYXJpLWpzIDNEIHBsb3QtdHlwZSBwcmVkaWNhdGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLyoqIG5hcGFyaS1qcyB2b2x1bWUuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOYXBhcmlWb2x1bWUodHlwZTogUGxvdFR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGUgPT09IFBsb3RUeXBlLk5BUEFSSV9WT0xVTUU7XG59XG4vKiogbmFwYXJpLWpzIGlzb3N1cmZhY2UuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOYXBhcmlJc29zdXJmYWNlKHR5cGU6IFBsb3RUeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlID09PSBQbG90VHlwZS5OQVBBUklfSVNPU1VSRkFDRTtcbn1cbi8qKiBuYXBhcmktanMgaGVpZ2h0LWZpZWxkIHN1cmZhY2UgbWVzaC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc05hcGFyaVN1cmZhY2UodHlwZTogUGxvdFR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGUgPT09IFBsb3RUeXBlLk5BUEFSSV9TVVJGQUNFO1xufVxuLyoqIG5hcGFyaS1qcyAyRCBzY2F0dGVyIChyZWdpb24gY2VudHJvaWRzKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc05hcGFyaVNjYXR0ZXIodHlwZTogUGxvdFR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGUgPT09IFBsb3RUeXBlLk5BUEFSSV9TQ0FUVEVSO1xufVxuLyoqIG5hcGFyaS1qcyAzRCBzY2F0dGVyICh2b3hlbCBwb2ludCBjbG91ZCkuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOYXBhcmlTY2F0dGVyM2QodHlwZTogUGxvdFR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGUgPT09IFBsb3RUeXBlLk5BUEFSSV9TQ0FUVEVSM0Q7XG59XG4vKiogU3BhdGlhbC1vbWljcyBvYnNlcnZhdGlvbnMgb3ZlciB0aGUgdGlzc3VlIGltYWdlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3BhdGlhbE9taWNzKHR5cGU6IFBsb3RUeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlID09PSBQbG90VHlwZS5TUEFUSUFMX09NSUNTO1xufVxuLyoqIFNwYXRpYWwtb21pY3Mgb2JzZXJ2YXRpb25zIGFzIGEgM0QgcG9pbnQgY2xvdWQuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTcGF0aWFsT21pY3MzZCh0eXBlOiBQbG90VHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZSA9PT0gUGxvdFR5cGUuU1BBVElBTF9PTUlDU18zRDtcbn1cbi8qKlxuICogV2hldGhlciB0aGUgcmVuZGVyZXIsIHJhdGhlciB0aGFuIHRoZSBzaGVsbCwgc2hvdWxkIGhhbmRsZSB3aGVlbCB6b29tLlxuICpcbiAqIFRoZSBzaGVsbCdzIHdoZWVsIGxpc3RlbmVyIGFwcGxpZXMgYSBGSVhFRCBzdGVwIHBlciBldmVudCwgd2hpY2ggaXMgZmFyIHRvbyBzZW5zaXRpdmUgZm9yIGFcbiAqIHJlbmRlcmVyIHRoYXQgcmVhZHMgdGhlIHNjcm9sbCBkZWx0YTogaXQgd29ya3Mgb3V0IGF0IDMwJSBwZXIgZXZlbnQgYWdhaW5zdCBuYXBhcmktanMncyAzJSwgYW5kXG4gKiBpZ25vcmVzIHRoZSBkZXZpY2Ugbm9ybWFsaXphdGlvbiBhbmQgZWFzaW5nIHRoZSByZW5kZXJlciBkb2VzLiBTbyBldmVyeSBwbG90IHR5cGUgZHJhd24gYnkgYVxuICogcmVuZGVyZXIgdGhhdCBvd25zIHRoZSB3aGVlbCBoYXMgdG8gb3B0IG91dCBoZXJlLlxuICpcbiAqIFRoZSBpbWFnZSB2aWV3IGFsd2F5cyBkaWQuIFRoZSBzcGF0aWFsLW9taWNzIG1vZGVzIGRpZCBOT1QsIGRlc3BpdGUgYmVpbmcgZHJhd24gYnkgdGhlIHNhbWVcbiAqIG5hcGFyaS1qcyB2aWV3ZXIg4oCUIHRoZSBzaGVsbCBnYXRlZCBvbiBhbiBgaXNIZWF0bWFwYCBmbGFnIHRoYXQgZGVmYXVsdHMgdG8gdHJ1ZSBhbmQgb25seSBnb2VzXG4gKiBmYWxzZSBmb3IgdGhlIDNEIFBsb3RseSBzY2VuZXMsIHNvIGl0IHNpbGVudGx5IHRvb2sgdGhlIHdoZWVsIGZvciB0aGVtIHRvby5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlcmVyT3duc1doZWVsKHR5cGU6IFBsb3RUeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlID09PSBQbG90VHlwZS5JTUFHRSB8fCBpc1NwYXRpYWxPbWljcyh0eXBlKSB8fCBpc1NwYXRpYWxPbWljczNkKHR5cGUpO1xufVxuXG4vKiogQW55IG5hcGFyaS1qcyAzRCBwbG90IHR5cGUgKHZvbHVtZSwgaXNvc3VyZmFjZSwgc3VyZmFjZSwgb3IgM0Qgc2NhdHRlcikuIFJlc29sdXRpb24gaXMgYSBydW50aW1lXG4gKiAgZGVjaW1hdGUgZmFjdG9yIChGdWxsIC8gwr0gLyDCvCAvIOKFmykg4oCUIHNlZSB0aGUgc2VydmljZSdzIGByZXNvbHV0aW9uU2NhbGVgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTmFwYXJpM2QodHlwZTogUGxvdFR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBpc05hcGFyaVZvbHVtZSh0eXBlKSB8fCBpc05hcGFyaUlzb3N1cmZhY2UodHlwZSkgfHwgaXNOYXBhcmlTdXJmYWNlKHR5cGUpIHx8IGlzTmFwYXJpU2NhdHRlcjNkKHR5cGUpXG4gICk7XG59XG5cbi8qKiBEZWNpbWF0ZSBmYWN0b3JzIG9mZmVyZWQgYnkgdGhlIFJlc29sdXRpb24gY29udHJvbCAoMSA9IEZ1bGwg4oCmIDggPSDihZspLiAqL1xuZXhwb3J0IGNvbnN0IE5BUEFSSV9ERUNJTUFURV9PUFRJT05TOiB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBudW1iZXIgfVtdID0gW1xuICB7IGxhYmVsOiAnRnVsbCcsIHZhbHVlOiAxIH0sXG4gIHsgbGFiZWw6ICfCvScsIHZhbHVlOiAyIH0sXG4gIHsgbGFiZWw6ICfCvCcsIHZhbHVlOiA0IH0sXG4gIHsgbGFiZWw6ICfihZsnLCB2YWx1ZTogOCB9LFxuXTtcblxuLyoqIERlZmF1bHQgZGVjaW1hdGUgZmFjdG9yOiDCvC4gVGhlIGNhcHMgYXJlIHNldCBzbyDCvCBpcyBhIHNlbnNpYmxlIGRlZmF1bHQgcmVzb2x1dGlvbiB3aGlsZSDCvSBhbmRcbiAqICBGdWxsIG9mZmVyIDLDlyBhbmQgNMOXIHRoZSBkZXRhaWwgZm9yIG9wdC1pbiBoaWdoLXJlc29sdXRpb24gcmVuZGVycy4gKi9cbmV4cG9ydCBjb25zdCBOQVBBUklfREVGQVVMVF9ERUNJTUFURSA9IDQ7XG4iXX0=