@jax-data-science/sci-image-visualizer 0.8.3 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +201 -460
- package/esm2022/index.mjs +34 -15
- package/esm2022/lib/channel-histogram/channel-histogram.component.mjs +163 -91
- package/esm2022/lib/contracts/capabilities.contract.mjs +4 -3
- package/esm2022/lib/contracts/cell-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +5 -1
- package/esm2022/lib/contracts/color.mjs +60 -0
- package/esm2022/lib/contracts/colormap-lut.mjs +213 -57
- package/esm2022/lib/contracts/coordinate-transform.contract.mjs +1 -1
- package/esm2022/lib/contracts/display-types.mjs +11 -1
- package/esm2022/lib/contracts/image.contract.mjs +1 -1
- package/esm2022/lib/contracts/instance-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/intensity.mjs +48 -5
- package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
- package/esm2022/lib/contracts/plot-type.mjs +134 -17
- package/esm2022/lib/contracts/ports/image-state.port.mjs +4 -1
- package/esm2022/lib/contracts/ports/preferences.port.mjs +5 -1
- package/esm2022/lib/contracts/ports/region-io.port.mjs +2 -1
- package/esm2022/lib/contracts/ports/spatial-data.port.mjs +5 -1
- package/esm2022/lib/contracts/ports/tile-access.port.mjs +2 -1
- package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
- package/esm2022/lib/contracts/region-overlay.contract.mjs +1 -1
- package/esm2022/lib/contracts/region-store.contract.mjs +1 -1
- package/esm2022/lib/contracts/sam.contract.mjs +1 -1
- package/esm2022/lib/contracts/section-view.contract.mjs +2 -0
- package/esm2022/lib/contracts/semantic-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/spatial-dataset.contract.mjs +3 -1
- package/esm2022/lib/contracts/toolbar-tool.contract.mjs +6 -4
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/contracts/viz-config.mjs +2 -1
- package/esm2022/lib/geometry/contour.mjs +63 -0
- package/esm2022/lib/geometry/loft.mjs +128 -0
- package/esm2022/lib/geometry/polylabel.mjs +156 -0
- package/esm2022/lib/geometry/raster.mjs +98 -0
- package/esm2022/lib/geometry/reconstruct.mjs +315 -0
- package/esm2022/lib/geometry/reslice-image.mjs +57 -0
- package/esm2022/lib/geometry/ring.mjs +201 -0
- package/esm2022/lib/geometry/section.mjs +215 -0
- package/esm2022/lib/hex-color-picker/hex-color-picker.component.mjs +202 -102
- package/esm2022/lib/implementations/base-store-visualizer.mjs +201 -48
- package/esm2022/lib/implementations/napari-js/napari-axes-gizmo.mjs +65 -0
- package/esm2022/lib/implementations/napari-js/napari-display-state.mjs +136 -0
- package/esm2022/lib/implementations/napari-js/napari-helpers.mjs +199 -0
- package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +602 -0
- package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +12 -9
- package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +83 -0
- package/esm2022/lib/implementations/napari-js/napari-region-mesh-pointer.mjs +100 -0
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +180 -591
- package/esm2022/lib/implementations/napari-js/napari-scene.mjs +2 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +614 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +769 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +199 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +270 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +159 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +106 -1408
- package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +2 -2
- package/esm2022/lib/implementations/napari-js/napari-surface-scene.mjs +271 -0
- package/esm2022/lib/implementations/napari-js/napari-tile-client.mjs +562 -0
- package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +347 -0
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +427 -4207
- package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +129 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +550 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-slice-planes.mjs +103 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-z-handle.mjs +6 -6
- package/esm2022/lib/implementations/napari-js/region-overlay/overlay-projection.mjs +96 -0
- package/esm2022/lib/implementations/napari-js/region-overlay/region-edit.mjs +35 -0
- package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +194 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +30 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +274 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +144 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/layer-groups.mjs +165 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/plan-context.mjs +78 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +182 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +369 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +306 -0
- package/esm2022/lib/implementations/osd/display-pipeline.mjs +102 -40
- package/esm2022/lib/implementations/osd/histogram-sampler.mjs +56 -31
- package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +128 -0
- package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +333 -1685
- package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +1 -1
- package/esm2022/lib/implementations/osd/osd-coords.mjs +5 -6
- package/esm2022/lib/implementations/osd/osd-export.mjs +122 -0
- package/esm2022/lib/implementations/osd/osd-lib.mjs +15 -1
- package/esm2022/lib/implementations/osd/osd-navigator-chrome.mjs +205 -0
- package/esm2022/lib/implementations/osd/osd-pixel-readback.mjs +68 -0
- package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +164 -0
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +213 -716
- package/esm2022/lib/implementations/osd/osd-scale-bar.mjs +52 -60
- package/esm2022/lib/implementations/osd/osd-tile-source.mjs +105 -0
- package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +2 -0
- package/esm2022/lib/implementations/osd/osd-viewer-mount.mjs +44 -0
- package/esm2022/lib/implementations/osd/osd-viewport.mjs +184 -0
- package/esm2022/lib/implementations/osd/osd-zoom.mjs +7 -1
- package/esm2022/lib/implementations/osd/simple-source.mjs +395 -0
- package/esm2022/lib/implementations/osd/slice-cache.mjs +53 -48
- package/esm2022/lib/implementations/osd/tile-client.mjs +32 -11
- package/esm2022/lib/implementations/osd/tile-recolor.mjs +330 -0
- package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +161 -73
- package/esm2022/lib/implementations/plotly/plotly-coordinate-transform.mjs +1 -1
- package/esm2022/lib/implementations/plotly/plotly-image-loader.mjs +112 -0
- package/esm2022/lib/implementations/plotly/plotly-image-recolor.mjs +178 -0
- package/esm2022/lib/implementations/plotly/plotly-intensity-inset.mjs +33 -0
- package/esm2022/lib/implementations/plotly/plotly-isosurface-controls.mjs +83 -0
- package/esm2022/lib/implementations/plotly/plotly-layouts.mjs +121 -0
- package/esm2022/lib/implementations/plotly/plotly-readback.mjs +117 -0
- package/esm2022/lib/implementations/plotly/plotly-region-overlay.mjs +19 -10
- package/esm2022/lib/implementations/plotly/plotly-shape-projection.mjs +223 -0
- package/esm2022/lib/implementations/plotly/plotly-trace-builders.mjs +79 -19
- package/esm2022/lib/implementations/plotly/plotly-zoom-controller.mjs +223 -0
- package/esm2022/lib/implementations/plotly/plotly.service.mjs +439 -1655
- package/esm2022/lib/implementations/region-centroids.mjs +47 -0
- package/esm2022/lib/implementations/simple-slice-access.service.mjs +22 -12
- package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +172 -92
- package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +103 -22
- package/esm2022/lib/implementations/tile-server/index.mjs +6 -0
- package/esm2022/lib/implementations/tile-server/native-histogram.mjs +30 -0
- package/esm2022/lib/implementations/tile-server/poll-descriptor.mjs +65 -0
- package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +42 -0
- package/esm2022/lib/implementations/tile-server/transport.mjs +135 -0
- package/esm2022/lib/intensity/intensity-profile.mjs +107 -0
- package/esm2022/lib/intensity/intensity-profile.service.mjs +223 -0
- package/esm2022/lib/intensity-inset/intensity-inset.component.mjs +133 -0
- package/esm2022/lib/models/bezier.mjs +1 -11
- package/esm2022/lib/models/class-preset.mjs +41 -3
- package/esm2022/lib/models/geometry.mjs +27 -164
- package/esm2022/lib/models/polygon-edit.mjs +254 -0
- package/esm2022/lib/models/polygon-factory.mjs +134 -0
- package/esm2022/lib/models/region-clone.mjs +68 -0
- package/esm2022/lib/models/region-geojson.mjs +411 -0
- package/esm2022/lib/models/region.mjs +34 -33
- package/esm2022/lib/models/shape.mjs +18 -16
- package/esm2022/lib/plot-mode/contribution-host.mjs +297 -0
- package/esm2022/lib/plot-mode/plot-mode-controller.mjs +9 -6
- package/esm2022/lib/plot-mode/plot-type-menu.mjs +85 -0
- package/esm2022/lib/plot-mode/tool-params-model.mjs +87 -0
- package/esm2022/lib/plot.utilities.mjs +296 -473
- package/esm2022/lib/processing/image-crop.mjs +1 -1
- package/esm2022/lib/processing/processing-image.mjs +28 -15
- package/esm2022/lib/provide-visualization.mjs +40 -14
- package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +156 -0
- package/esm2022/lib/region-editor/class-tree/class-tree.mjs +108 -0
- package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +163 -0
- package/esm2022/lib/region-editor/file-stem.mjs +13 -0
- package/esm2022/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.mjs +118 -0
- package/esm2022/lib/region-editor/mask-export.service.mjs +98 -0
- package/esm2022/lib/region-editor/mask-raster.mjs +11 -5
- package/esm2022/lib/region-editor/region-color-dialog/region-color-dialog.component.mjs +56 -0
- package/esm2022/lib/region-editor/region-editor-help/region-editor-help.component.mjs +28 -0
- package/esm2022/lib/region-editor/region-editor.component.mjs +896 -660
- package/esm2022/lib/region-editor/region-metrics.mjs +86 -0
- package/esm2022/lib/region-editor/region-persistence.service.mjs +160 -0
- package/esm2022/lib/region-editor/region-table/region-table.component.mjs +169 -0
- package/esm2022/lib/region-editor/save-mask-dialog/save-mask-dialog.component.mjs +91 -0
- package/esm2022/lib/region-editor/save-regions-dialog/save-regions-dialog.component.mjs +92 -0
- package/esm2022/lib/region-ops.service.mjs +28 -70
- package/esm2022/lib/region-overlay/region-geometry.mjs +360 -0
- package/esm2022/lib/region-overlay/region-hit-test.mjs +103 -0
- package/esm2022/lib/region-overlay/region-source-layer.mjs +378 -0
- package/esm2022/lib/region-overlay/region-style.mjs +97 -0
- package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
- package/esm2022/lib/region-source/http-region-source.mjs +104 -0
- package/esm2022/lib/region-source/region-source-ops.mjs +53 -0
- package/esm2022/lib/region-source/region-source-worker.mjs +10 -0
- package/esm2022/lib/region-source/region-source.mjs +67 -0
- package/esm2022/lib/region-source/region-tiles.mjs +708 -0
- package/esm2022/lib/region-source/worker-region-source.mjs +229 -0
- package/esm2022/lib/render-orchestrator.mjs +14 -11
- package/esm2022/lib/render-session.mjs +207 -0
- package/esm2022/lib/routing-visualizer.service.mjs +858 -414
- package/esm2022/lib/section-pane/section-pane.component.mjs +299 -0
- package/esm2022/lib/spatial/density-raster.mjs +14 -0
- package/esm2022/lib/spatial/embedding-compute-coordinator.mjs +239 -0
- package/esm2022/lib/spatial/embedding-compute.mjs +43 -10
- package/esm2022/lib/spatial/gene-search.mjs +1 -1
- package/esm2022/lib/spatial/glyphs.mjs +97 -0
- package/esm2022/lib/spatial/lod.mjs +187 -0
- package/esm2022/lib/spatial/spatial-controls.facade.mjs +200 -0
- package/esm2022/lib/spatial/spatial-density.mjs +25 -16
- package/esm2022/lib/spatial/spatial-encoding.mjs +26 -82
- package/esm2022/lib/spatial/spatial-expression.mjs +43 -42
- package/esm2022/lib/spatial/spatial-framing.mjs +1 -1
- package/esm2022/lib/spatial/spatial-heatmap.mjs +6 -3
- package/esm2022/lib/spatial/spatial-hover.mjs +5 -33
- package/esm2022/lib/spatial/spatial-panel-model.mjs +282 -0
- package/esm2022/lib/spatial/spatial-sections.mjs +1 -1
- package/esm2022/lib/spatial/spatial-selection.mjs +33 -46
- package/esm2022/lib/spatial/spatial-tile-merge.mjs +219 -0
- package/esm2022/lib/spatial/spatial-tiles.mjs +12 -648
- package/esm2022/lib/spatial/spatial-volume-image.mjs +2 -4
- package/esm2022/lib/spatial/stats.mjs +71 -0
- package/esm2022/lib/spatial/transcript-grouping.mjs +307 -0
- package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +150 -0
- package/esm2022/lib/spatial-controls/spatial-charts/chart-data-model.mjs +309 -0
- package/esm2022/lib/spatial-controls/spatial-charts/chart-help.mjs +145 -0
- package/esm2022/lib/spatial-controls/spatial-charts/plotly-chart-host.mjs +158 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.mjs +47 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +297 -802
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.mjs +89 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.mjs +52 -0
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +143 -1238
- package/esm2022/lib/spatial-controls/spatial-gene-picker.mjs +153 -0
- package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +241 -0
- package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +193 -0
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +132 -0
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.model.mjs +67 -0
- package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +147 -0
- package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +300 -0
- package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +370 -0
- package/esm2022/lib/store/class-color.util.mjs +53 -5
- package/esm2022/lib/store/class-signatures.mjs +63 -0
- package/esm2022/lib/store/region-history.mjs +146 -0
- package/esm2022/lib/store/region-scope-cache.mjs +144 -0
- package/esm2022/lib/store/region-selection.mjs +82 -0
- package/esm2022/lib/store/region-source-scope.mjs +171 -0
- package/esm2022/lib/store/region-store.service.mjs +986 -670
- package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
- package/esm2022/lib/store/visualizer-store.service.mjs +81 -76
- package/esm2022/lib/toast-outlets.mjs +5 -4
- package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +92 -434
- package/esm2022/lib/toolbar/canvas-tools.mjs +20 -0
- package/esm2022/lib/toolbar/crop/slide-crop.mjs +26 -42
- package/esm2022/lib/toolbar/plot-type-selector/plot-type-selector.component.mjs +85 -0
- package/esm2022/lib/toolbar/region-tools/region-tool-buttons.mjs +74 -0
- package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +120 -0
- package/esm2022/lib/toolbar/segmentation/cell-segment-tool.service.mjs +74 -78
- package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +50 -8
- package/esm2022/lib/toolbar/segmentation/onnx-sam-session.mjs +61 -42
- package/esm2022/lib/toolbar/segmentation/pending-calls.mjs +47 -0
- package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +12 -4
- package/esm2022/lib/toolbar/segmentation/sam-onnx-core.mjs +70 -14
- package/esm2022/lib/toolbar/segmentation/sam-point-tool.service.mjs +135 -172
- package/esm2022/lib/toolbar/segmentation/sam-prompt.mjs +9 -90
- package/esm2022/lib/toolbar/segmentation/sam-session.service.mjs +183 -0
- package/esm2022/lib/toolbar/segmentation/sam-tool.service.mjs +95 -150
- package/esm2022/lib/toolbar/segmentation/segmentation-commit.mjs +12 -0
- package/esm2022/lib/toolbar/segmentation/segmentation-runner.mjs +108 -0
- package/esm2022/lib/toolbar/segmentation-tools/segmentation-tools.component.mjs +155 -0
- package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +121 -0
- package/esm2022/lib/toolbar/tool-kit/async-tool-status.mjs +37 -0
- package/esm2022/lib/toolbar/tool-kit/canvas-tool-manager.mjs +63 -0
- package/esm2022/lib/toolbar/tool-kit/canvas-tool.mjs +2 -0
- package/esm2022/lib/toolbar/tool-kit/frame-pixels.mjs +108 -0
- package/esm2022/lib/toolbar/tool-kit/mask-stroke-editor.mjs +306 -0
- package/esm2022/lib/toolbar/tool-kit/matrix-frame.mjs +61 -0
- package/esm2022/lib/toolbar/tool-kit/tool-overlay.mjs +140 -0
- package/esm2022/lib/toolbar/tool-kit/undo-gesture.mjs +24 -0
- package/esm2022/lib/toolbar/tool-slider/tool-slider.component.mjs +63 -0
- package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +50 -0
- package/esm2022/lib/toolbar/toolbar.component.mjs +84 -119
- package/esm2022/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.mjs +93 -115
- package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +107 -0
- package/esm2022/lib/toolbar/wand/wand-region-grow.mjs +321 -0
- package/esm2022/lib/toolbar/wand/wand-tool.service.mjs +121 -416
- package/esm2022/lib/toolbar/wand/wand.service.mjs +30 -894
- package/esm2022/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.mjs +48 -90
- package/esm2022/lib/util/mark-for-check.mjs +17 -0
- package/esm2022/lib/util/supersede.mjs +56 -0
- package/esm2022/lib/visualization.module.mjs +39 -141
- package/esm2022/lib/visualizer/floating-drag.directive.mjs +58 -0
- package/esm2022/lib/visualizer/region-actions.mjs +149 -0
- package/esm2022/lib/visualizer/region-load.mjs +123 -0
- package/esm2022/lib/visualizer/spatial-dataset-binder.mjs +163 -0
- package/esm2022/lib/visualizer/tool-modes.mjs +113 -0
- package/esm2022/lib/visualizer/viewer-shortcuts.mjs +167 -0
- package/esm2022/lib/visualizer/visualizer-context-menu.mjs +119 -0
- package/esm2022/lib/visualizer/volume-sections.mjs +175 -0
- package/esm2022/lib/visualizer.component.mjs +602 -1902
- package/esm2022/lib/workers/spatial-math-ops.mjs +43 -0
- package/esm2022/lib/workers/spatial-math-worker.mjs +10 -0
- package/esm2022/lib/workers/spatial-math.mjs +190 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs +47169 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs +238 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs +12 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs +12 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +41 -34467
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
- package/fesm2022/mask.worker.js +36 -917
- package/fesm2022/onnx-sam.worker.js +52 -16
- package/fesm2022/region-source.worker.js +1067 -0
- package/fesm2022/spatial-math.worker.js +471 -0
- package/fesm2022/tsne.worker.js +32 -15
- package/index.d.ts +19 -10
- package/lib/channel-histogram/channel-histogram.component.d.ts +53 -43
- package/lib/contracts/capabilities.contract.d.ts +4 -2
- package/lib/contracts/cell-segmenter.contract.d.ts +1 -0
- package/lib/contracts/channel-histogram-api.contract.d.ts +4 -0
- package/lib/contracts/color.d.ts +27 -0
- package/lib/contracts/colormap-lut.d.ts +19 -4
- package/lib/contracts/coordinate-transform.contract.d.ts +3 -3
- package/lib/contracts/display-types.d.ts +21 -0
- package/lib/contracts/image.contract.d.ts +4 -0
- package/lib/contracts/instance-segmenter.contract.d.ts +5 -0
- package/lib/contracts/intensity.d.ts +13 -2
- package/lib/contracts/plot-type.d.ts +3 -1
- package/lib/contracts/ports/image-state.port.d.ts +6 -2
- package/lib/contracts/ports/preferences.port.d.ts +4 -0
- package/lib/contracts/ports/region-io.port.d.ts +1 -0
- package/lib/contracts/ports/spatial-data.port.d.ts +4 -10
- package/lib/contracts/ports/tile-access.port.d.ts +1 -0
- package/lib/contracts/region-editor-api.contract.d.ts +85 -1
- package/lib/contracts/region-overlay.contract.d.ts +5 -0
- package/lib/contracts/region-store.contract.d.ts +22 -0
- package/lib/contracts/sam.contract.d.ts +7 -0
- package/lib/contracts/section-view.contract.d.ts +44 -0
- package/lib/contracts/semantic-segmenter.contract.d.ts +6 -0
- package/lib/contracts/spatial-dataset.contract.d.ts +19 -6
- package/lib/contracts/toolbar-tool.contract.d.ts +1 -0
- package/lib/contracts/visualizer.contract.d.ts +231 -54
- package/lib/contracts/viz-config.d.ts +9 -0
- package/lib/geometry/contour.d.ts +24 -0
- package/lib/geometry/loft.d.ts +22 -0
- package/lib/geometry/polylabel.d.ts +23 -0
- package/lib/geometry/raster.d.ts +42 -0
- package/lib/geometry/reconstruct.d.ts +54 -0
- package/lib/geometry/reslice-image.d.ts +33 -0
- package/lib/geometry/ring.d.ts +67 -0
- package/lib/geometry/section.d.ts +52 -0
- package/lib/hex-color-picker/hex-color-picker.component.d.ts +61 -27
- package/lib/implementations/base-store-visualizer.d.ts +61 -15
- package/lib/implementations/napari-js/napari-axes-gizmo.d.ts +36 -0
- package/lib/implementations/napari-js/napari-display-state.d.ts +76 -0
- package/lib/implementations/napari-js/napari-helpers.d.ts +129 -0
- package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +162 -0
- package/lib/implementations/napari-js/napari-loading-badge.d.ts +4 -3
- package/lib/implementations/napari-js/napari-loading-state.d.ts +37 -0
- package/lib/implementations/napari-js/napari-region-mesh-pointer.d.ts +32 -0
- package/lib/implementations/napari-js/napari-region-overlay.d.ts +68 -71
- package/lib/implementations/napari-js/napari-scene.d.ts +126 -0
- package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +163 -0
- package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +212 -0
- package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +114 -0
- package/lib/implementations/napari-js/napari-spatial-hover.d.ts +91 -0
- package/lib/implementations/napari-js/napari-spatial-scene.d.ts +118 -0
- package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +56 -263
- package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +1 -1
- package/lib/implementations/napari-js/napari-surface-scene.d.ts +76 -0
- package/lib/implementations/napari-js/napari-tile-client.d.ts +214 -0
- package/lib/implementations/napari-js/napari-tool-bridge.d.ts +179 -0
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +169 -883
- package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +66 -0
- package/lib/implementations/napari-js/napari-volume-scene.d.ts +148 -0
- package/lib/implementations/napari-js/napari-volume-slice-planes.d.ts +43 -0
- package/lib/implementations/napari-js/napari-volume-z-handle.d.ts +8 -12
- package/lib/implementations/napari-js/region-overlay/overlay-projection.d.ts +59 -0
- package/lib/implementations/napari-js/region-overlay/region-edit.d.ts +15 -0
- package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +54 -0
- package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +26 -0
- package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +70 -0
- package/lib/implementations/napari-js/spatial-tiles/density-layer.d.ts +61 -0
- package/lib/implementations/napari-js/spatial-tiles/layer-groups.d.ts +67 -0
- package/lib/implementations/napari-js/spatial-tiles/plan-context.d.ts +38 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +71 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-jobs.d.ts +105 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +56 -0
- package/lib/implementations/osd/display-pipeline.d.ts +38 -9
- package/lib/implementations/osd/histogram-sampler.d.ts +22 -12
- package/lib/implementations/osd/openseadragon-viewer-options.d.ts +35 -0
- package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +78 -354
- package/lib/implementations/osd/osd-coordinate-transform.d.ts +2 -1
- package/lib/implementations/osd/osd-coords.d.ts +6 -4
- package/lib/implementations/osd/osd-export.d.ts +36 -0
- package/lib/implementations/osd/osd-lib.d.ts +7 -0
- package/lib/implementations/osd/osd-navigator-chrome.d.ts +69 -0
- package/lib/implementations/osd/osd-pixel-readback.d.ts +22 -0
- package/lib/implementations/osd/osd-region-overlay-draw.d.ts +38 -0
- package/lib/implementations/osd/osd-region-overlay.d.ts +46 -51
- package/lib/implementations/osd/osd-scale-bar.d.ts +8 -6
- package/lib/implementations/osd/osd-tile-source.d.ts +49 -0
- package/lib/implementations/osd/osd-viewer-like.d.ts +100 -0
- package/lib/implementations/osd/osd-viewer-mount.d.ts +14 -0
- package/lib/implementations/osd/osd-viewport.d.ts +77 -0
- package/lib/implementations/osd/osd-zoom.d.ts +6 -0
- package/lib/implementations/osd/simple-source.d.ts +161 -0
- package/lib/implementations/osd/slice-cache.d.ts +12 -3
- package/lib/implementations/osd/tile-client.d.ts +11 -14
- package/lib/implementations/osd/tile-recolor.d.ts +141 -0
- package/lib/implementations/plotly/omics-trace-builders.d.ts +32 -20
- package/lib/implementations/plotly/plotly-image-loader.d.ts +49 -0
- package/lib/implementations/plotly/plotly-image-recolor.d.ts +75 -0
- package/lib/implementations/plotly/plotly-intensity-inset.d.ts +8 -0
- package/lib/implementations/plotly/plotly-isosurface-controls.d.ts +38 -0
- package/lib/implementations/plotly/plotly-layouts.d.ts +188 -0
- package/lib/implementations/plotly/plotly-readback.d.ts +41 -0
- package/lib/implementations/plotly/plotly-region-overlay.d.ts +2 -2
- package/lib/implementations/plotly/plotly-shape-projection.d.ts +92 -0
- package/lib/implementations/plotly/plotly-trace-builders.d.ts +23 -12
- package/lib/implementations/plotly/plotly-zoom-controller.d.ts +86 -0
- package/lib/implementations/plotly/plotly.service.d.ts +136 -401
- package/lib/implementations/region-centroids.d.ts +14 -0
- package/lib/implementations/simple-slice-access.service.d.ts +7 -4
- package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +42 -18
- package/lib/implementations/spatial-data-http/spatial-wire.d.ts +34 -9
- package/lib/implementations/tile-server/index.d.ts +5 -0
- package/lib/implementations/tile-server/native-histogram.d.ts +25 -0
- package/lib/implementations/tile-server/poll-descriptor.d.ts +39 -0
- package/lib/implementations/tile-server/tile-protocol.d.ts +83 -0
- package/lib/implementations/tile-server/transport.d.ts +62 -0
- package/lib/intensity/intensity-profile.d.ts +66 -0
- package/lib/intensity/intensity-profile.service.d.ts +108 -0
- package/lib/intensity-inset/intensity-inset.component.d.ts +58 -0
- package/lib/models/bezier.d.ts +0 -5
- package/lib/models/class-preset.d.ts +25 -0
- package/lib/models/geometry.d.ts +14 -48
- package/lib/models/polygon-edit.d.ts +72 -0
- package/lib/models/polygon-factory.d.ts +45 -0
- package/lib/models/region-clone.d.ts +20 -0
- package/lib/models/region-geojson.d.ts +57 -0
- package/lib/models/region.d.ts +59 -4
- package/lib/models/shape.d.ts +8 -0
- package/lib/plot-mode/contribution-host.d.ts +125 -0
- package/lib/plot-mode/plot-type-menu.d.ts +60 -0
- package/lib/plot-mode/tool-params-model.d.ts +49 -0
- package/lib/plot.utilities.d.ts +19 -30
- package/lib/processing/processing-image.d.ts +5 -2
- package/lib/provide-visualization.d.ts +19 -2
- package/lib/region-editor/class-tree/class-tree.component.d.ts +78 -0
- package/lib/region-editor/class-tree/class-tree.d.ts +31 -0
- package/lib/region-editor/classes-panel/classes-panel.component.d.ts +86 -0
- package/lib/region-editor/file-stem.d.ts +7 -0
- package/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.d.ts +45 -0
- package/lib/region-editor/mask-export.service.d.ts +54 -0
- package/lib/region-editor/mask-raster.d.ts +2 -8
- package/lib/region-editor/region-color-dialog/region-color-dialog.component.d.ts +29 -0
- package/lib/region-editor/region-editor-help/region-editor-help.component.d.ts +11 -0
- package/lib/region-editor/region-editor.component.d.ts +283 -200
- package/lib/region-editor/region-metrics.d.ts +34 -0
- package/lib/region-editor/region-persistence.service.d.ts +77 -0
- package/lib/region-editor/region-table/region-table.component.d.ts +89 -0
- package/lib/region-editor/save-mask-dialog/save-mask-dialog.component.d.ts +36 -0
- package/lib/region-editor/save-regions-dialog/save-regions-dialog.component.d.ts +37 -0
- package/lib/region-ops.service.d.ts +1 -7
- package/lib/region-overlay/region-geometry.d.ts +158 -0
- package/lib/region-overlay/region-hit-test.d.ts +38 -0
- package/lib/region-overlay/region-source-layer.d.ts +96 -0
- package/lib/region-overlay/region-style.d.ts +52 -0
- package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
- package/lib/region-source/http-region-source.d.ts +45 -0
- package/lib/region-source/region-source-ops.d.ts +89 -0
- package/lib/region-source/region-source-worker.d.ts +7 -0
- package/lib/region-source/region-source.d.ts +82 -0
- package/lib/region-source/region-tiles.d.ts +289 -0
- package/lib/region-source/worker-region-source.d.ts +65 -0
- package/lib/render-orchestrator.d.ts +6 -2
- package/lib/render-session.d.ts +75 -0
- package/lib/routing-visualizer.service.d.ts +248 -59
- package/lib/section-pane/section-pane.component.d.ts +47 -0
- package/lib/spatial/density-raster.d.ts +6 -0
- package/lib/spatial/embedding-compute-coordinator.d.ts +123 -0
- package/lib/spatial/embedding-compute.d.ts +21 -2
- package/lib/spatial/glyphs.d.ts +16 -0
- package/lib/spatial/lod.d.ts +94 -0
- package/lib/spatial/spatial-controls.facade.d.ts +64 -0
- package/lib/spatial/spatial-density.d.ts +15 -5
- package/lib/spatial/spatial-encoding.d.ts +11 -44
- package/lib/spatial/spatial-expression.d.ts +40 -22
- package/lib/spatial/spatial-framing.d.ts +1 -0
- package/lib/spatial/spatial-heatmap.d.ts +2 -0
- package/lib/spatial/spatial-hover.d.ts +4 -16
- package/lib/spatial/spatial-panel-model.d.ts +135 -0
- package/lib/spatial/spatial-selection.d.ts +21 -26
- package/lib/spatial/spatial-tile-merge.d.ts +41 -0
- package/lib/spatial/spatial-tiles.d.ts +9 -256
- package/lib/spatial/stats.d.ts +38 -0
- package/lib/spatial/transcript-grouping.d.ts +119 -0
- package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-charts/chart-data-model.d.ts +153 -0
- package/lib/spatial-controls/spatial-charts/chart-help.d.ts +69 -0
- package/lib/spatial-controls/spatial-charts/plotly-chart-host.d.ts +98 -0
- package/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.d.ts +26 -0
- package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +101 -260
- package/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.d.ts +43 -0
- package/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.d.ts +27 -0
- package/lib/spatial-controls/spatial-controls.component.d.ts +68 -448
- package/lib/spatial-controls/spatial-gene-picker.d.ts +86 -0
- package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +102 -0
- package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +72 -0
- package/lib/spatial-controls/spatial-key/spatial-key.component.d.ts +66 -0
- package/lib/spatial-controls/spatial-key/spatial-key.model.d.ts +33 -0
- package/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +117 -0
- package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +142 -0
- package/lib/store/class-color.util.d.ts +39 -2
- package/lib/store/class-signatures.d.ts +11 -0
- package/lib/store/region-history.d.ts +66 -0
- package/lib/store/region-scope-cache.d.ts +65 -0
- package/lib/store/region-selection.d.ts +36 -0
- package/lib/store/region-source-scope.d.ts +68 -0
- package/lib/store/region-store.service.d.ts +312 -116
- package/lib/store/visualizer-store.service.d.ts +32 -33
- package/lib/toast-outlets.d.ts +4 -3
- package/lib/toolbar/brush/brush-tool.service.d.ts +31 -98
- package/lib/toolbar/canvas-tools.d.ts +20 -0
- package/lib/toolbar/crop/slide-crop.d.ts +10 -4
- package/lib/toolbar/plot-type-selector/plot-type-selector.component.d.ts +38 -0
- package/lib/toolbar/region-tools/region-tool-buttons.d.ts +21 -0
- package/lib/toolbar/region-tools/region-tools.component.d.ts +62 -0
- package/lib/toolbar/segmentation/cell-segment-tool.service.d.ts +10 -14
- package/lib/toolbar/segmentation/cellpose-segmenter.service.d.ts +12 -2
- package/lib/toolbar/segmentation/onnx-sam-session.d.ts +22 -3
- package/lib/toolbar/segmentation/pending-calls.d.ts +31 -0
- package/lib/toolbar/segmentation/sam-model-registry.d.ts +9 -3
- package/lib/toolbar/segmentation/sam-onnx-core.d.ts +18 -5
- package/lib/toolbar/segmentation/sam-point-tool.service.d.ts +46 -32
- package/lib/toolbar/segmentation/sam-prompt.d.ts +7 -31
- package/lib/toolbar/segmentation/sam-session.service.d.ts +74 -0
- package/lib/toolbar/segmentation/sam-tool.service.d.ts +23 -30
- package/lib/toolbar/segmentation/segmentation-commit.d.ts +8 -0
- package/lib/toolbar/segmentation/segmentation-runner.d.ts +52 -0
- package/lib/toolbar/segmentation-tools/segmentation-tools.component.d.ts +87 -0
- package/lib/toolbar/stack-controls/stack-controls.component.d.ts +51 -0
- package/lib/toolbar/tool-kit/async-tool-status.d.ts +21 -0
- package/lib/toolbar/tool-kit/canvas-tool-manager.d.ts +36 -0
- package/lib/toolbar/tool-kit/canvas-tool.d.ts +86 -0
- package/lib/toolbar/tool-kit/frame-pixels.d.ts +45 -0
- package/lib/toolbar/tool-kit/mask-stroke-editor.d.ts +125 -0
- package/lib/toolbar/tool-kit/matrix-frame.d.ts +40 -0
- package/lib/toolbar/tool-kit/tool-overlay.d.ts +60 -0
- package/lib/toolbar/tool-kit/undo-gesture.d.ts +17 -0
- package/lib/toolbar/tool-slider/tool-slider.component.d.ts +33 -0
- package/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.d.ts +24 -0
- package/lib/toolbar/toolbar.component.d.ts +55 -84
- package/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.d.ts +33 -40
- package/lib/toolbar/view-controls/view-controls.component.d.ts +54 -0
- package/lib/toolbar/wand/wand-region-grow.d.ts +49 -0
- package/lib/toolbar/wand/wand-tool.service.d.ts +39 -124
- package/lib/toolbar/wand/wand.service.d.ts +22 -116
- package/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.d.ts +17 -37
- package/lib/util/mark-for-check.d.ts +11 -0
- package/lib/util/supersede.d.ts +53 -0
- package/lib/visualization.module.d.ts +18 -39
- package/lib/visualizer/floating-drag.directive.d.ts +30 -0
- package/lib/visualizer/region-actions.d.ts +54 -0
- package/lib/visualizer/region-load.d.ts +46 -0
- package/lib/visualizer/spatial-dataset-binder.d.ts +74 -0
- package/lib/visualizer/tool-modes.d.ts +49 -0
- package/lib/visualizer/viewer-shortcuts.d.ts +71 -0
- package/lib/visualizer/visualizer-context-menu.d.ts +55 -0
- package/lib/visualizer/volume-sections.d.ts +64 -0
- package/lib/visualizer.component.d.ts +232 -447
- package/lib/workers/spatial-math-ops.d.ts +65 -0
- package/lib/workers/spatial-math-worker.d.ts +7 -0
- package/lib/workers/spatial-math.d.ts +74 -0
- package/package.json +12 -3
- package/src/lib/assets/slice.svg +23 -0
- package/src/lib/styles/_viz-icons-rules.scss +73 -0
- package/src/lib/styles/viz-icons.scss +14 -0
- package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +0 -97
- package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +0 -195
- package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +0 -92
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs +0 -329
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map +0 -1
- package/lib/implementations/napari-js/napari-axes-labels.d.ts +0 -49
- package/lib/implementations/napari-js/napari-navigator.d.ts +0 -72
- package/lib/implementations/napari-js/napari-scale-bar.d.ts +0 -35
- package/src/lib/assets/cell-detection.svg +0 -37
- package/src/lib/assets/click.svg +0 -1
- package/src/lib/assets/colormap-luts.json +0 -1
- package/src/lib/assets/edit-selection-white.svg +0 -47
- package/src/lib/assets/icons/colormap-earth.png +0 -0
- package/src/lib/assets/icons/colormap-placeholder.png +0 -0
- package/src/lib/assets/icons/colormap-pubu.png +0 -0
- package/src/lib/assets/interactive-segmentation-cursor.svg +0 -1
- package/src/lib/assets/picture-segmentation.svg +0 -43
- package/src/lib/assets/test/download-379.svg +0 -1
- package/src/lib/assets/test/download-98.svg +0 -1
- package/src/lib/assets/test/json-1.svg +0 -1
- package/src/lib/assets/test/load-53.svg +0 -1
- package/src/lib/assets/test/mask-44.svg +0 -1
- package/src/lib/assets/test/mask-download-44.svg +0 -15
- package/src/lib/assets/test/mask-save-44.svg +0 -11
- package/src/lib/assets/test/overlay-1.svg +0 -1
- package/src/lib/assets/test/overlay-4.svg +0 -1
- package/src/lib/assets/test/region-26.svg +0 -1
- package/src/lib/assets/test/save-56.svg +0 -1
- package/src/lib/assets/test/upload-43.svg +0 -1
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import { BehaviorSubject } from 'rxjs';
|
|
2
|
+
import { EmbeddingComputeRun } from './embedding-compute';
|
|
3
|
+
import { Supersede } from '../util/supersede';
|
|
4
|
+
const IDLE = { running: false, fraction: null, backend: null, message: null, error: null };
|
|
5
|
+
/**
|
|
6
|
+
* Largest dataset a t-SNE is offered for in the browser.
|
|
7
|
+
*
|
|
8
|
+
* t-SNE is O(N²) per iteration — vectorised on the GPU, but not approximated — so the cost
|
|
9
|
+
* is quadratic in observations. Measured end to end in Firefox on WebGPU: 2,688 points took
|
|
10
|
+
* 95 s. That scales to roughly five and a half minutes at this threshold, and to about 76
|
|
11
|
+
* minutes at seqFISH's 19,416, which was also measured offline.
|
|
12
|
+
*
|
|
13
|
+
* Past this the option is WITHDRAWN rather than offered with a warning. An hour-long job
|
|
14
|
+
* started from a button is not a choice a reader can meaningfully consent to in a dialog,
|
|
15
|
+
* and a t-SNE that large belongs in the offline pipeline, where it can run once and be
|
|
16
|
+
* served to everyone.
|
|
17
|
+
*/
|
|
18
|
+
export const BROWSER_TSNE_MAX_OBSERVATIONS = 5000;
|
|
19
|
+
/** Measured anchor for the estimate: seconds for 2,688 points on WebGPU. */
|
|
20
|
+
const TSNE_SECONDS_AT = { seconds: 95, observations: 2688 };
|
|
21
|
+
/**
|
|
22
|
+
* A t-SNE the dataset does not publish, offered so it can be computed here.
|
|
23
|
+
*
|
|
24
|
+
* A dropped-in `.h5ad` typically carries one UMAP and a PCA, and no t-SNE — the two views
|
|
25
|
+
* answer different questions, so having only one is a real gap. Computing it needs no
|
|
26
|
+
* expression data: t-SNE runs on the PCA scores, which is why this can happen in the
|
|
27
|
+
* browser at all while PCA cannot.
|
|
28
|
+
*/
|
|
29
|
+
export const COMPUTABLE_EMBEDDINGS = [
|
|
30
|
+
{ name: 'local:tsne', label: 't-SNE (compute)', dims: 2, derived: true },
|
|
31
|
+
{ name: 'local:tsne3d', label: 't-SNE 3D (compute)', dims: 3, derived: true },
|
|
32
|
+
];
|
|
33
|
+
/** The menu suffix that says a click will start work; not part of the name. */
|
|
34
|
+
const COMPUTE_SUFFIX = ' (compute)';
|
|
35
|
+
/** Roughly how long a t-SNE of `n` observations takes, in seconds, from the measured anchor. */
|
|
36
|
+
export function tsneEstimateSeconds(n) {
|
|
37
|
+
const { seconds, observations } = TSNE_SECONDS_AT;
|
|
38
|
+
return Math.max(1, Math.round(seconds * (n / observations) ** 2));
|
|
39
|
+
}
|
|
40
|
+
/** A duration as something to put on a button: `~42s`, `~6 min`. */
|
|
41
|
+
export function estimateLabel(seconds) {
|
|
42
|
+
if (seconds < 90)
|
|
43
|
+
return `~${seconds}s`;
|
|
44
|
+
return `~${Math.round(seconds / 60)} min`;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* The browser-side embedding computation behind the charts' Embedding tab: which
|
|
48
|
+
* embeddings to offer for a dataset, the t-SNE run itself (PCA scores from the port, then a
|
|
49
|
+
* worker), its progress, and the results computed this session.
|
|
50
|
+
*
|
|
51
|
+
* A run is several awaits long — the PCA scores arrive over HTTP, then the worker takes a
|
|
52
|
+
* minute or more — and the dataset can change at any of them, including before the run
|
|
53
|
+
* exists to be terminated. Every await is checked against a {@link Supersede} that a
|
|
54
|
+
* dataset switch ({@link setDataset}) or teardown ({@link abandon}) cancels, so the scores
|
|
55
|
+
* fetched for one dataset are never embedded and drawn over another's observations.
|
|
56
|
+
*
|
|
57
|
+
* Plain class: the owner renders {@link state} (or {@link state$}).
|
|
58
|
+
*/
|
|
59
|
+
export class EmbeddingComputeCoordinator {
|
|
60
|
+
constructor() {
|
|
61
|
+
this.state$ = new BehaviorSubject(IDLE);
|
|
62
|
+
/** True when a t-SNE is missing but the dataset is too big to embed here. */
|
|
63
|
+
this.tooLarge = false;
|
|
64
|
+
/** Observations in the live dataset, kept for the cost estimate. */
|
|
65
|
+
this.observationCount = 0;
|
|
66
|
+
/** Coordinates computed in this browser, by name. Not persisted: a reload recomputes. */
|
|
67
|
+
this.computed = new Map();
|
|
68
|
+
/** The live run, when one is going. */
|
|
69
|
+
this.run = null;
|
|
70
|
+
this.load = new Supersede();
|
|
71
|
+
}
|
|
72
|
+
get state() {
|
|
73
|
+
return this.state$.value;
|
|
74
|
+
}
|
|
75
|
+
get running() {
|
|
76
|
+
return !!this.run?.running;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* A new dataset: drop everything computed or computing for the previous one, and return
|
|
80
|
+
* the embeddings to offer — the published ones, plus a t-SNE to compute where the dataset
|
|
81
|
+
* has a PCA to embed, no t-SNE of its own, and is small enough. Otherwise the menu would
|
|
82
|
+
* advertise work that cannot start, or duplicate what is already served.
|
|
83
|
+
*/
|
|
84
|
+
setDataset(published, observationCount) {
|
|
85
|
+
this.computed.clear();
|
|
86
|
+
this.abandon();
|
|
87
|
+
const hasPca = published.some((e) => /pca/i.test(e.label ?? e.name));
|
|
88
|
+
const hasTsne = published.some((e) => /tsne|t-sne/i.test(e.label ?? e.name));
|
|
89
|
+
this.observationCount = observationCount;
|
|
90
|
+
this.tooLarge = hasPca && !hasTsne && observationCount > BROWSER_TSNE_MAX_OBSERVATIONS;
|
|
91
|
+
return hasPca && !hasTsne && !this.tooLarge ? [...published, ...COMPUTABLE_EMBEDDINGS] : [...published];
|
|
92
|
+
}
|
|
93
|
+
/** Whether `meta` is one this browser would have to compute. */
|
|
94
|
+
isComputable(meta) {
|
|
95
|
+
return !!meta && meta.name.startsWith('local:');
|
|
96
|
+
}
|
|
97
|
+
/** Whether `meta` has already been computed this session. */
|
|
98
|
+
isComputed(meta) {
|
|
99
|
+
return !!meta && this.computed.has(meta.name);
|
|
100
|
+
}
|
|
101
|
+
/** The coordinates computed for `name`, if any. */
|
|
102
|
+
result(name) {
|
|
103
|
+
return this.computed.get(name);
|
|
104
|
+
}
|
|
105
|
+
/** Roughly how long a run would take here, in seconds. Shown before the click: a progress
|
|
106
|
+
* bar tells you a job is going; only an estimate tells you whether to start it. */
|
|
107
|
+
get estimateSeconds() {
|
|
108
|
+
return tsneEstimateSeconds(this.observationCount);
|
|
109
|
+
}
|
|
110
|
+
/** {@link estimateSeconds} as something to put on a button. */
|
|
111
|
+
get estimateLabel() {
|
|
112
|
+
return estimateLabel(this.estimateSeconds);
|
|
113
|
+
}
|
|
114
|
+
/** Why the option is absent, when a dataset is past the threshold. */
|
|
115
|
+
get tooLargeNote() {
|
|
116
|
+
return (`t-SNE is not offered here for ${this.observationCount.toLocaleString()} observations — it is ` +
|
|
117
|
+
`quadratic, so it would take roughly ${this.estimateLabel} in the browser. ` +
|
|
118
|
+
'Compute it offline and serve it with the dataset.');
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Compute `meta` here, in a worker, from the dataset's PCA among `embeddings`.
|
|
122
|
+
*
|
|
123
|
+
* The PCA scores come from the port as an ordinary embedding — the server derives them,
|
|
124
|
+
* because PCA needs the whole expression matrix (185 MB for a Visium dataset) while
|
|
125
|
+
* t-SNE needs only the scores (0.51 MB). Sending the matrix to the browser to save a few
|
|
126
|
+
* seconds of arithmetic would be a far slower answer.
|
|
127
|
+
*
|
|
128
|
+
* @returns the coordinates, to draw — or null when there is nothing to draw: cancelled,
|
|
129
|
+
* abandoned, failed (see {@link state}), or already running.
|
|
130
|
+
*/
|
|
131
|
+
async start(meta, embeddings, getEmbedding) {
|
|
132
|
+
if (this.running)
|
|
133
|
+
return null;
|
|
134
|
+
this.patch({ ...IDLE });
|
|
135
|
+
// Every early return and every await below is checked against this. `run` is held
|
|
136
|
+
// locally as well as on the instance: after an await `this.run` may already be a
|
|
137
|
+
// newer run's, and clearing or terminating that one is how a fresh computation gets
|
|
138
|
+
// killed by the tail of the one it replaced.
|
|
139
|
+
const current = this.load.next();
|
|
140
|
+
const superseded = () => !current();
|
|
141
|
+
let run = null;
|
|
142
|
+
try {
|
|
143
|
+
// Prefer the 3-D scores: they carry a third component for free, and t-SNE on more
|
|
144
|
+
// components than it needs is not better — the PCA basis is the input either way.
|
|
145
|
+
const source = await loadPcaScores(embeddings, getEmbedding);
|
|
146
|
+
if (superseded())
|
|
147
|
+
return null;
|
|
148
|
+
if (!source) {
|
|
149
|
+
this.patch({ error: 'This dataset serves no PCA to embed.' });
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
run = new EmbeddingComputeRun();
|
|
153
|
+
this.run = run;
|
|
154
|
+
this.patch({ running: true });
|
|
155
|
+
const result = await run.run({ scores: source.scores, nObs: source.nObs, nDims: source.nDims, dims: meta.dims }, { ...meta, label: (meta.label ?? meta.name).replace(COMPUTE_SUFFIX, '') }, (progress) => {
|
|
156
|
+
// Progress from a superseded run must not drive the bar a newer one is using.
|
|
157
|
+
if (superseded())
|
|
158
|
+
return;
|
|
159
|
+
this.patch({
|
|
160
|
+
fraction: progress.fraction,
|
|
161
|
+
backend: progress.backend ?? this.state.backend,
|
|
162
|
+
...(progress.message ? { message: progress.message } : {}),
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
// A terminated run resolves null, so this covers abandonment as well as Cancel — but
|
|
166
|
+
// the token is still checked, because the dataset can change between the worker's
|
|
167
|
+
// `done` and this line.
|
|
168
|
+
if (!result || superseded())
|
|
169
|
+
return null;
|
|
170
|
+
this.computed.set(meta.name, result);
|
|
171
|
+
return result;
|
|
172
|
+
}
|
|
173
|
+
catch (err) {
|
|
174
|
+
if (!superseded())
|
|
175
|
+
this.patch({ error: err?.message ?? String(err) });
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
finally {
|
|
179
|
+
run?.terminate();
|
|
180
|
+
// Only if it is still ours: a dataset switch has already terminated this run and may
|
|
181
|
+
// have started another, and clearing here would orphan it — leaving a worker nothing
|
|
182
|
+
// can cancel and a Cancel button that does nothing.
|
|
183
|
+
if (this.run === run) {
|
|
184
|
+
this.run = null;
|
|
185
|
+
this.patch({ running: false, fraction: null });
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/** The user's Cancel: ask the worker to stop. The run settles shortly after, with nothing. */
|
|
190
|
+
cancel() {
|
|
191
|
+
this.run?.cancel();
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Drop any computation in progress, because what it is computing no longer applies.
|
|
195
|
+
*
|
|
196
|
+
* Distinct from {@link cancel}: this does not wait — the run is settled and the worker
|
|
197
|
+
* killed, so a dataset switch or a teardown cannot leave a t-SNE grinding on in the
|
|
198
|
+
* background over observations nothing is showing any more.
|
|
199
|
+
*/
|
|
200
|
+
abandon() {
|
|
201
|
+
this.load.cancel();
|
|
202
|
+
this.run?.terminate();
|
|
203
|
+
this.run = null;
|
|
204
|
+
this.patch({ running: false, fraction: null, backend: null, message: null });
|
|
205
|
+
}
|
|
206
|
+
patch(p) {
|
|
207
|
+
this.state$.next({ ...this.state$.value, ...p });
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* The dataset's PCA, as row-major scores.
|
|
212
|
+
*
|
|
213
|
+
* Assembled from whichever PCA the source offers, widest first — a 3-D one gives t-SNE
|
|
214
|
+
* three components instead of two for the same request.
|
|
215
|
+
*/
|
|
216
|
+
export async function loadPcaScores(embeddings, getEmbedding) {
|
|
217
|
+
const candidates = embeddings
|
|
218
|
+
.filter((e) => /pca/i.test(e.label ?? e.name) && !e.name.startsWith('local:'))
|
|
219
|
+
.sort((a, b) => b.dims - a.dims);
|
|
220
|
+
for (const candidate of candidates) {
|
|
221
|
+
try {
|
|
222
|
+
const pca = await getEmbedding(candidate.name);
|
|
223
|
+
const planes = [pca.x, pca.y, ...(pca.z ? [pca.z] : [])];
|
|
224
|
+
const nObs = pca.x.length;
|
|
225
|
+
const nDims = planes.length;
|
|
226
|
+
const scores = new Float32Array(nObs * nDims);
|
|
227
|
+
for (let i = 0; i < nObs; i++) {
|
|
228
|
+
for (let d = 0; d < nDims; d++)
|
|
229
|
+
scores[i * nDims + d] = planes[d][i];
|
|
230
|
+
}
|
|
231
|
+
return { scores, nObs, nDims };
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
// Try the next; a source may advertise one it cannot actually serve.
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return null;
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1iZWRkaW5nLWNvbXB1dGUtY29vcmRpbmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NwYXRpYWwvZW1iZWRkaW5nLWNvbXB1dGUtY29vcmRpbmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUd2QyxPQUFPLEVBQW1CLG1CQUFtQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDM0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBaUI5QyxNQUFNLElBQUksR0FBMEIsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUVsSDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRyxJQUFJLENBQUM7QUFFbEQsNEVBQTRFO0FBQzVFLE1BQU0sZUFBZSxHQUFHLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFFNUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFvQztJQUNwRSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRTtJQUN4RSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLG9CQUFvQixFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRTtDQUM5RSxDQUFDO0FBRUYsK0VBQStFO0FBQy9FLE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQztBQUVwQyxnR0FBZ0c7QUFDaEcsTUFBTSxVQUFVLG1C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WUFDMUIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUM1QixNQUFNLE1BQU0sR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUM7WUFDOUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUM5QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRTtvQkFBRSxNQUFNLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkUsQ0FBQztZQUNELE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQ2pDLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxxRUFBcUU7UUFDdkUsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHR5cGUgeyBTcGF0aWFsRW1iZWRkaW5nLCBTcGF0aWFsRW1iZWRkaW5nTWV0YSB9IGZyb20gJy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHsgQ29tcHV0ZVByb2dyZXNzLCBFbWJlZGRpbmdDb21wdXRlUnVuIH0gZnJvbSAnLi9lbWJlZGRpbmctY29tcHV0ZSc7XG5pbXBvcnQgeyBTdXBlcnNlZGUgfSBmcm9tICcuLi91dGlsL3N1cGVyc2VkZSc7XG5cbi8qKiBXaGVyZSBhIGJyb3dzZXItc2lkZSBlbWJlZGRpbmcgY29tcHV0YXRpb24gc3RhbmRzLCBmb3IgdGhlIHByb2dyZXNzIGJhciBhbmQgbWVzc2FnZXMuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtYmVkZGluZ0NvbXB1dGVTdGF0ZSB7XG4gIC8qKiBUcnVlIHdoaWxlIGEgcnVuIGlzIGdvaW5nLiAqL1xuICBydW5uaW5nOiBib29sZWFuO1xuICAvKiogMC4uMSB3aGlsZSBydW5uaW5nLCBvciBudWxsIGJlZm9yZSB0aGUgZmlyc3QgcmVwb3J0LiAqL1xuICBmcmFjdGlvbjogbnVtYmVyIHwgbnVsbDtcbiAgLyoqIFdoaWNoIGJhY2tlbmQgdGhlIHdvcmtlciBnb3Qg4oCUICd3ZWJncHUnLCAnd2FzbScgb3IgJ2NwdScuICovXG4gIGJhY2tlbmQ6IHN0cmluZyB8IG51bGw7XG4gIG1lc3NhZ2U6IHN0cmluZyB8IG51bGw7XG4gIGVycm9yOiBzdHJpbmcgfCBudWxsO1xufVxuXG4vKiogV2hlcmUgdGhlIFBDQSBzY29yZXMgY29tZSBmcm9tOiBhIHBvcnQgdGhhdCBzZXJ2ZXMgZW1iZWRkaW5ncyBieSBuYW1lLiAqL1xuZXhwb3J0IHR5cGUgRW1iZWRkaW5nU291cmNlID0gKG5hbWU6IHN0cmluZykgPT4gUHJvbWlzZTxTcGF0aWFsRW1iZWRkaW5nPjtcblxuY29uc3QgSURMRTogRW1iZWRkaW5nQ29tcHV0ZVN0YXRlID0geyBydW5uaW5nOiBmYWxzZSwgZnJhY3Rpb246IG51bGwsIGJhY2tlbmQ6IG51bGwsIG1lc3NhZ2U6IG51bGwsIGVycm9yOiBudWxsIH07XG5cbi8qKlxuICogTGFyZ2VzdCBkYXRhc2V0IGEgdC1TTkUgaXMgb2ZmZXJlZCBmb3IgaW4gdGhlIGJyb3dzZXIuXG4gKlxuICogdC1TTkUgaXMgTyhOwrIpIHBlciBpdGVyYXRpb24g4oCUIHZlY3RvcmlzZWQgb24gdGhlIEdQVSwgYnV0IG5vdCBhcHByb3hpbWF0ZWQg4oCUIHNvIHRoZSBjb3N0XG4gKiBpcyBxdWFkcmF0aWMgaW4gb2JzZXJ2YXRpb25zLiBNZWFzdXJlZCBlbmQgdG8gZW5kIGluIEZpcmVmb3ggb24gV2ViR1BVOiAyLDY4OCBwb2ludHMgdG9va1xuICogOTUgcy4gVGhhdCBzY2FsZXMgdG8gcm91Z2hseSBmaXZlIGFuZCBhIGhhbGYgbWludXRlcyBhdCB0aGlzIHRocmVzaG9sZCwgYW5kIHRvIGFib3V0IDc2XG4gKiBtaW51dGVzIGF0IHNlcUZJU0gncyAxOSw0MTYsIHdoaWNoIHdhcyBhbHNvIG1lYXN1cmVkIG9mZmxpbmUuXG4gKlxuICogUGFzdCB0aGlzIHRoZSBvcHRpb24gaXMgV0lUSERSQVdOIHJhdGhlciB0aGFuIG9mZmVyZWQgd2l0aCBhIHdhcm5pbmcuIEFuIGhvdXItbG9uZyBqb2JcbiAqIHN0YXJ0ZWQgZnJvbSBhIGJ1dHRvbiBpcyBub3QgYSBjaG9pY2UgYSByZWFkZXIgY2FuIG1lYW5pbmdmdWxseSBjb25zZW50IHRvIGluIGEgZGlhbG9nLFxuICogYW5kIGEgdC1TTkUgdGhhdCBsYXJnZSBiZWxvbmdzIGluIHRoZSBvZmZsaW5lIHBpcGVsaW5lLCB3aGVyZSBpdCBjYW4gcnVuIG9uY2UgYW5kIGJlXG4gKiBzZXJ2ZWQgdG8gZXZlcnlvbmUuXG4gKi9cbmV4cG9ydCBjb25zdCBCUk9XU0VSX1RTTkVfTUFYX09CU0VSVkFUSU9OUyA9IDUwMDA7XG5cbi8qKiBNZWFzdXJlZCBhbmNob3IgZm9yIHRoZSBlc3RpbWF0ZTogc2Vjb25kcyBmb3IgMiw2ODggcG9pbnRzIG9uIFdlYkdQVS4gKi9cbmNvbnN0IFRTTkVfU0VDT05EU19BVCA9IHsgc2Vjb25kczogOTUsIG9ic2VydmF0aW9uczogMjY4OCB9O1xuXG4vKipcbiAqIEEgdC1TTkUgdGhlIGRhdGFzZXQgZG9lcyBub3QgcHVibGlzaCwgb2ZmZXJlZCBzbyBpdCBjYW4gYmUgY29tcHV0ZWQgaGVyZS5cbiAqXG4gKiBBIGRyb3BwZWQtaW4gYC5oNWFkYCB0eXBpY2FsbHkgY2FycmllcyBvbmUgVU1BUCBhbmQgYSBQQ0EsIGFuZCBubyB0LVNORSDigJQgdGhlIHR3byB2aWV3c1xuICogYW5zd2VyIGRpZmZlcmVudCBxdWVzdGlvbnMsIHNvIGhhdmluZyBvbmx5IG9uZSBpcyBhIHJlYWwgZ2FwLiBDb21wdXRpbmcgaXQgbmVlZHMgbm9cbiAqIGV4cHJlc3Npb24gZGF0YTogdC1TTkUgcnVucyBvbiB0aGUgUENBIHNjb3Jlcywgd2hpY2ggaXMgd2h5IHRoaXMgY2FuIGhhcHBlbiBpbiB0aGVcbiAqIGJyb3dzZXIgYXQgYWxsIHdoaWxlIFBDQSBjYW5ub3QuXG4gKi9cbmV4cG9ydCBjb25zdCBDT01QVVRBQkxFX0VNQkVERElOR1M6IHJlYWRvbmx5IFNwYXRpYWxFbWJlZGRpbmdNZXRhW10gPSBbXG4gIHsgbmFtZTogJ2xvY2FsOnRzbmUnLCBsYWJlbDogJ3QtU05FIChjb21wdXRlKScsIGRpbXM6IDIsIGRlcml2ZWQ6IHRydWUgfSxcbiAgeyBuYW1lOiAnbG9jYWw6dHNuZTNkJywgbGFiZWw6ICd0LVNORSAzRCAoY29tcHV0ZSknLCBkaW1zOiAzLCBkZXJpdmVkOiB0cnVlIH0sXG5dO1xuXG4vKiogVGhlIG1lbnUgc3VmZml4IHRoYXQgc2F5cyBhIGNsaWNrIHdpbGwgc3RhcnQgd29yazsgbm90IHBhcnQgb2YgdGhlIG5hbWUuICovXG5jb25zdCBDT01QVVRFX1NVRkZJWCA9ICcgKGNvbXB1dGUpJztcblxuLyoqIFJvdWdobHkgaG93IGxvbmcgYSB0LVNORSBvZiBgbmAgb2JzZXJ2YXRpb25zIHRha2VzLCBpbiBzZWNvbmRzLCBmcm9tIHRoZSBtZWFzdXJlZCBhbmNob3IuICovXG5leHBvcnQgZnVuY3Rpb24gdHNuZUVzdGltYXRlU2Vjb25kcyhuOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCB7IHNlY29uZHMsIG9ic2VydmF0aW9ucyB9ID0gVFNORV9TRUNPTkRTX0FUO1xuICByZXR1cm4gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChzZWNvbmRzICogKG4gLyBvYnNlcnZhdGlvbnMpICoqIDIpKTtcbn1cblxuLyoqIEEgZHVyYXRpb24gYXMgc29tZXRoaW5nIHRvIHB1dCBvbiBhIGJ1dHRvbjogYH40MnNgLCBgfjYgbWluYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlc3RpbWF0ZUxhYmVsKHNlY29uZHM6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChzZWNvbmRzIDwgOTApIHJldHVybiBgfiR7c2Vjb25kc31zYDtcbiAgcmV0dXJuIGB+JHtNYXRoLnJvdW5kKHNlY29uZHMgLyA2MCl9IG1pbmA7XG59XG5cbi8qKlxuICogVGhlIGJyb3dzZXItc2lkZSBlbWJlZGRpbmcgY29tcHV0YXRpb24gYmVoaW5kIHRoZSBjaGFydHMnIEVtYmVkZGluZyB0YWI6IHdoaWNoXG4gKiBlbWJlZGRpbmdzIHRvIG9mZmVyIGZvciBhIGRhdGFzZXQsIHRoZSB0LVNORSBydW4gaXRzZWxmIChQQ0Egc2NvcmVzIGZyb20gdGhlIHBvcnQsIHRoZW4gYVxuICogd29ya2VyKSwgaXRzIHByb2dyZXNzLCBhbmQgdGhlIHJlc3VsdHMgY29tcHV0ZWQgdGhpcyBzZXNzaW9uLlxuICpcbiAqIEEgcnVuIGlzIHNldmVyYWwgYXdhaXRzIGxvbmcg4oCUIHRoZSBQQ0Egc2NvcmVzIGFycml2ZSBvdmVyIEhUVFAsIHRoZW4gdGhlIHdvcmtlciB0YWtlcyBhXG4gKiBtaW51dGUgb3IgbW9yZSDigJQgYW5kIHRoZSBkYXRhc2V0IGNhbiBjaGFuZ2UgYXQgYW55IG9mIHRoZW0sIGluY2x1ZGluZyBiZWZvcmUgdGhlIHJ1blxuICogZXhpc3RzIHRvIGJlIHRlcm1pbmF0ZWQuIEV2ZXJ5IGF3YWl0IGlzIGNoZWNrZWQgYWdhaW5zdCBhIHtAbGluayBTdXBlcnNlZGV9IHRoYXQgYVxuICogZGF0YXNldCBzd2l0Y2ggKHtAbGluayBzZXREYXRhc2V0fSkgb3IgdGVhcmRvd24gKHtAbGluayBhYmFuZG9ufSkgY2FuY2Vscywgc28gdGhlIHNjb3Jlc1xuICogZmV0Y2hlZCBmb3Igb25lIGRhdGFzZXQgYXJlIG5ldmVyIGVtYmVkZGVkIGFuZCBkcmF3biBvdmVyIGFub3RoZXIncyBvYnNlcnZhdGlvbnMuXG4gKlxuICogUGxhaW4gY2xhc3M6IHRoZSBvd25lciByZW5kZXJzIHtAbGluayBzdGF0ZX0gKG9yIHtAbGluayBzdGF0ZSR9KS5cbiAqL1xuZXhwb3J0IGNsYXNzIEVtYmVkZGluZ0NvbXB1dGVDb29yZGluYXRvciB7XG4gIHJlYWRvbmx5IHN0YXRlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RW1iZWRkaW5nQ29tcHV0ZVN0YXRlPihJRExFKTtcblxuICAvKiogVHJ1ZSB3aGVuIGEgdC1TTkUgaXMgbWlzc2luZyBidXQgdGhlIGRhdGFzZXQgaXMgdG9vIGJpZyB0byBlbWJlZCBoZXJlLiAqL1xuICB0b29MYXJnZSA9IGZhbHNlO1xuICAvKiogT2JzZXJ2YXRpb25zIGluIHRoZSBsaXZlIGRhdGFzZXQsIGtlcHQgZm9yIHRoZSBjb3N0IGVzdGltYXRlLiAqL1xuICBvYnNlcnZhdGlvbkNvdW50ID0gMDtcblxuICAvKiogQ29vcmRpbmF0ZXMgY29tcHV0ZWQgaW4gdGhpcyBicm93c2VyLCBieSBuYW1lLiBOb3QgcGVyc2lzdGVkOiBhIHJlbG9hZCByZWNvbXB1dGVzLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbXB1dGVkID0gbmV3IE1hcDxzdHJpbmcsIFNwYXRpYWxFbWJlZGRpbmc+KCk7XG4gIC8qKiBUaGUgbGl2ZSBydW4sIHdoZW4gb25lIGlzIGdvaW5nLiAqL1xuICBwcml2YXRlIHJ1bjogRW1iZWRkaW5nQ29tcHV0ZVJ1biB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvYWQgPSBuZXcgU3VwZXJzZWRlKCk7XG5cbiAgZ2V0IHN0YXRlKCk6IEVtYmVkZGluZ0NvbXB1dGVTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUkLnZhbHVlO1xuICB9XG5cbiAgZ2V0IHJ1bm5pbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5ydW4/LnJ1bm5pbmc7XG4gIH1cblxuICAvKipcbiAgICogQSBuZXcgZGF0YXNldDogZHJvcCBldmVyeXRoaW5nIGNvbXB1dGVkIG9yIGNvbXB1dGluZyBmb3IgdGhlIHByZXZpb3VzIG9uZSwgYW5kIHJldHVyblxuICAgKiB0aGUgZW1iZWRkaW5ncyB0byBvZmZlciDigJQgdGhlIHB1Ymxpc2hlZCBvbmVzLCBwbHVzIGEgdC1TTkUgdG8gY29tcHV0ZSB3aGVyZSB0aGUgZGF0YXNldFxuICAgKiBoYXMgYSBQQ0EgdG8gZW1iZWQsIG5vIHQtU05FIG9mIGl0cyBvd24sIGFuZCBpcyBzbWFsbCBlbm91Z2guIE90aGVyd2lzZSB0aGUgbWVudSB3b3VsZFxuICAgKiBhZHZlcnRpc2Ugd29yayB0aGF0IGNhbm5vdCBzdGFydCwgb3IgZHVwbGljYXRlIHdoYXQgaXMgYWxyZWFkeSBzZXJ2ZWQuXG4gICAqL1xuICBzZXREYXRhc2V0KHB1Ymxpc2hlZDogcmVhZG9ubHkgU3BhdGlhbEVtYmVkZGluZ01ldGFbXSwgb2JzZXJ2YXRpb25Db3VudDogbnVtYmVyKTogU3BhdGlhbEVtYmVkZGluZ01ldGFbXSB7XG4gICAgdGhpcy5jb21wdXRlZC5jbGVhcigpO1xuICAgIHRoaXMuYWJhbmRvbigpO1xuICAgIGNvbnN0IGhhc1BjYSA9IHB1Ymxpc2hlZC5zb21lKChlKSA9PiAvcGNhL2kudGVzdChlLmxhYmVsID8/IGUubmFtZSkpO1xuICAgIGNvbnN0IGhhc1RzbmUgPSBwdWJsaXNoZWQuc29tZSgoZSkgPT4gL3RzbmV8dC1zbmUvaS50ZXN0KGUubGFiZWwgPz8gZS5uYW1lKSk7XG4gICAgdGhpcy5vYnNlcnZhdGlvbkNvdW50ID0gb2JzZXJ2YXRpb25Db3VudDtcbiAgICB0aGlzLnRvb0xhcmdlID0gaGFzUGNhICYmICFoYXNUc25lICYmIG9ic2VydmF0aW9uQ291bnQgPiBCUk9XU0VSX1RTTkVfTUFYX09CU0VSVkFUSU9OUztcbiAgICByZXR1cm4gaGFzUGNhICYmICFoYXNUc25lICYmICF0aGlzLnRvb0xhcmdlID8gWy4uLnB1Ymxpc2hlZCwgLi4uQ09NUFVUQUJMRV9FTUJFRERJTkdTXSA6IFsuLi5wdWJsaXNoZWRdO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgYG1ldGFgIGlzIG9uZSB0aGlzIGJyb3dzZXIgd291bGQgaGF2ZSB0byBjb21wdXRlLiAqL1xuICBpc0NvbXB1dGFibGUobWV0YTogU3BhdGlhbEVtYmVkZGluZ01ldGEgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhbWV0YSAmJiBtZXRhLm5hbWUuc3RhcnRzV2l0aCgnbG9jYWw6Jyk7XG4gIH1cblxuICAvKiogV2hldGhlciBgbWV0YWAgaGFzIGFscmVhZHkgYmVlbiBjb21wdXRlZCB0aGlzIHNlc3Npb24uICovXG4gIGlzQ29tcHV0ZWQobWV0YTogU3BhdGlhbEVtYmVkZGluZ01ldGEgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhbWV0YSAmJiB0aGlzLmNvbXB1dGVkLmhhcyhtZXRhLm5hbWUpO1xuICB9XG5cbiAgLyoqIFRoZSBjb29yZGluYXRlcyBjb21wdXRlZCBmb3IgYG5hbWVgLCBpZiBhbnkuICovXG4gIHJlc3VsdChuYW1lOiBzdHJpbmcpOiBTcGF0aWFsRW1iZWRkaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jb21wdXRlZC5nZXQobmFtZSk7XG4gIH1cblxuICAvKiogUm91Z2hseSBob3cgbG9uZyBhIHJ1biB3b3VsZCB0YWtlIGhlcmUsIGluIHNlY29uZHMuIFNob3duIGJlZm9yZSB0aGUgY2xpY2s6IGEgcHJvZ3Jlc3NcbiAgICogIGJhciB0ZWxscyB5b3UgYSBqb2IgaXMgZ29pbmc7IG9ubHkgYW4gZXN0aW1hdGUgdGVsbHMgeW91IHdoZXRoZXIgdG8gc3RhcnQgaXQuICovXG4gIGdldCBlc3RpbWF0ZVNlY29uZHMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdHNuZUVzdGltYXRlU2Vjb25kcyh0aGlzLm9ic2VydmF0aW9uQ291bnQpO1xuICB9XG5cbiAgLyoqIHtAbGluayBlc3RpbWF0ZVNlY29uZHN9IGFzIHNvbWV0aGluZyB0byBwdXQgb24gYSBidXR0b24uICovXG4gIGdldCBlc3RpbWF0ZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGVzdGltYXRlTGFiZWwodGhpcy5lc3RpbWF0ZVNlY29uZHMpO1xuICB9XG5cbiAgLyoqIFdoeSB0aGUgb3B0aW9uIGlzIGFic2VudCwgd2hlbiBhIGRhdGFzZXQgaXMgcGFzdCB0aGUgdGhyZXNob2xkLiAqL1xuICBnZXQgdG9vTGFyZ2VOb3RlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIChcbiAgICAgIGB0LVNORSBpcyBub3Qgb2ZmZXJlZCBoZXJlIGZvciAke3RoaXMub2JzZXJ2YXRpb25Db3VudC50b0xvY2FsZVN0cmluZygpfSBvYnNlcnZhdGlvbnMg4oCUIGl0IGlzIGAgK1xuICAgICAgYHF1YWRyYXRpYywgc28gaXQgd291bGQgdGFrZSByb3VnaGx5ICR7dGhpcy5lc3RpbWF0ZUxhYmVsfSBpbiB0aGUgYnJvd3Nlci4gYCArXG4gICAgICAnQ29tcHV0ZSBpdCBvZmZsaW5lIGFuZCBzZXJ2ZSBpdCB3aXRoIHRoZSBkYXRhc2V0LidcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGUgYG1ldGFgIGhlcmUsIGluIGEgd29ya2VyLCBmcm9tIHRoZSBkYXRhc2V0J3MgUENBIGFtb25nIGBlbWJlZGRpbmdzYC5cbiAgICpcbiAgICogVGhlIFBDQSBzY29yZXMgY29tZSBmcm9tIHRoZSBwb3J0IGFzIGFuIG9yZGluYXJ5IGVtYmVkZGluZyDigJQgdGhlIHNlcnZlciBkZXJpdmVzIHRoZW0sXG4gICAqIGJlY2F1c2UgUENBIG5lZWRzIHRoZSB3aG9sZSBleHByZXNzaW9uIG1hdHJpeCAoMTg1IE1CIGZvciBhIFZpc2l1bSBkYXRhc2V0KSB3aGlsZVxuICAgKiB0LVNORSBuZWVkcyBvbmx5IHRoZSBzY29yZXMgKDAuNTEgTUIpLiBTZW5kaW5nIHRoZSBtYXRyaXggdG8gdGhlIGJyb3dzZXIgdG8gc2F2ZSBhIGZld1xuICAgKiBzZWNvbmRzIG9mIGFyaXRobWV0aWMgd291bGQgYmUgYSBmYXIgc2xvd2VyIGFuc3dlci5cbiAgICpcbiAgICogQHJldHVybnMgdGhlIGNvb3JkaW5hdGVzLCB0byBkcmF3IOKAlCBvciBudWxsIHdoZW4gdGhlcmUgaXMgbm90aGluZyB0byBkcmF3OiBjYW5jZWxsZWQsXG4gICAqICAgYWJhbmRvbmVkLCBmYWlsZWQgKHNlZSB7QGxpbmsgc3RhdGV9KSwgb3IgYWxyZWFkeSBydW5uaW5nLlxuICAgKi9cbiAgYXN5bmMgc3RhcnQoXG4gICAgbWV0YTogU3BhdGlhbEVtYmVkZGluZ01ldGEsXG4gICAgZW1iZWRkaW5nczogcmVhZG9ubHkgU3BhdGlhbEVtYmVkZGluZ01ldGFbXSxcbiAgICBnZXRFbWJlZGRpbmc6IEVtYmVkZGluZ1NvdXJjZSxcbiAgKTogUHJvbWlzZTxTcGF0aWFsRW1iZWRkaW5nIHwgbnVsbD4ge1xuICAgIGlmICh0aGlzLnJ1bm5pbmcpIHJldHVybiBudWxsO1xuICAgIHRoaXMucGF0Y2goeyAuLi5JRExFIH0pO1xuXG4gICAgLy8gRXZlcnkgZWFybHkgcmV0dXJuIGFuZCBldmVyeSBhd2FpdCBiZWxvdyBpcyBjaGVja2VkIGFnYWluc3QgdGhpcy4gYHJ1bmAgaXMgaGVsZFxuICAgIC8vIGxvY2FsbHkgYXMgd2VsbCBhcyBvbiB0aGUgaW5zdGFuY2U6IGFmdGVyIGFuIGF3YWl0IGB0aGlzLnJ1bmAgbWF5IGFscmVhZHkgYmUgYVxuICAgIC8vIG5ld2VyIHJ1bidzLCBhbmQgY2xlYXJpbmcgb3IgdGVybWluYXRpbmcgdGhhdCBvbmUgaXMgaG93IGEgZnJlc2ggY29tcHV0YXRpb24gZ2V0c1xuICAgIC8vIGtpbGxlZCBieSB0aGUgdGFpbCBvZiB0aGUgb25lIGl0IHJlcGxhY2VkLlxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmxvYWQubmV4dCgpO1xuICAgIGNvbnN0IHN1cGVyc2VkZWQgPSAoKSA9PiAhY3VycmVudCgpO1xuICAgIGxldCBydW46IEVtYmVkZGluZ0NvbXB1dGVSdW4gfCBudWxsID0gbnVsbDtcblxuICAgIHRyeSB7XG4gICAgICAvLyBQcmVmZXIgdGhlIDMtRCBzY29yZXM6IHRoZXkgY2FycnkgYSB0aGlyZCBjb21wb25lbnQgZm9yIGZyZWUsIGFuZCB0LVNORSBvbiBtb3JlXG4gICAgICAvLyBjb21wb25lbnRzIHRoYW4gaXQgbmVlZHMgaXMgbm90IGJldHRlciDigJQgdGhlIFBDQSBiYXNpcyBpcyB0aGUgaW5wdXQgZWl0aGVyIHdheS5cbiAgICAgIGNvbnN0IHNvdXJjZSA9IGF3YWl0IGxvYWRQY2FTY29yZXMoZW1iZWRkaW5ncywgZ2V0RW1iZWRkaW5nKTtcbiAgICAgIGlmIChzdXBlcnNlZGVkKCkpIHJldHVybiBudWxsO1xuICAgICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgdGhpcy5wYXRjaCh7IGVycm9yOiAnVGhpcyBkYXRhc2V0IHNlcnZlcyBubyBQQ0EgdG8gZW1iZWQuJyB9KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBydW4gPSBuZXcgRW1iZWRkaW5nQ29tcHV0ZVJ1bigpO1xuICAgICAgdGhpcy5ydW4gPSBydW47XG4gICAgICB0aGlzLnBhdGNoKHsgcnVubmluZzogdHJ1ZSB9KTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJ1bi5ydW4oXG4gICAgICAgIHsgc2NvcmVzOiBzb3VyY2Uuc2NvcmVzLCBuT2JzOiBzb3VyY2Uubk9icywgbkRpbXM6IHNvdXJjZS5uRGltcywgZGltczogbWV0YS5kaW1zIH0sXG4gICAgICAgIHsgLi4ubWV0YSwgbGFiZWw6IChtZXRhLmxhYmVsID8/IG1ldGEubmFtZSkucmVwbGFjZShDT01QVVRFX1NVRkZJWCwgJycpIH0sXG4gICAgICAgIChwcm9ncmVzczogQ29tcHV0ZVByb2dyZXNzKSA9PiB7XG4gICAgICAgICAgLy8gUHJvZ3Jlc3MgZnJvbSBhIHN1cGVyc2VkZWQgcnVuIG11c3Qgbm90IGRyaXZlIHRoZSBiYXIgYSBuZXdlciBvbmUgaXMgdXNpbmcuXG4gICAgICAgICAgaWYgKHN1cGVyc2VkZWQoKSkgcmV0dXJuO1xuICAgICAgICAgIHRoaXMucGF0Y2goe1xuICAgICAgICAgICAgZnJhY3Rpb246IHByb2dyZXNzLmZyYWN0aW9uLFxuICAgICAgICAgICAgYmFja2VuZDogcHJvZ3Jlc3MuYmFja2VuZCA/PyB0aGlzLnN0YXRlLmJhY2tlbmQsXG4gICAgICAgICAgICAuLi4ocHJvZ3Jlc3MubWVzc2FnZSA/IHsgbWVzc2FnZTogcHJvZ3Jlc3MubWVzc2FnZSB9IDoge30pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIC8vIEEgdGVybWluYXRlZCBydW4gcmVzb2x2ZXMgbnVsbCwgc28gdGhpcyBjb3ZlcnMgYWJhbmRvbm1lbnQgYXMgd2VsbCBhcyBDYW5jZWwg4oCUIGJ1dFxuICAgICAgLy8gdGhlIHRva2VuIGlzIHN0aWxsIGNoZWNrZWQsIGJlY2F1c2UgdGhlIGRhdGFzZXQgY2FuIGNoYW5nZSBiZXR3ZWVuIHRoZSB3b3JrZXInc1xuICAgICAgLy8gYGRvbmVgIGFuZCB0aGlzIGxpbmUuXG4gICAgICBpZiAoIXJlc3VsdCB8fCBzdXBlcnNlZGVkKCkpIHJldHVybiBudWxsO1xuICAgICAgdGhpcy5jb21wdXRlZC5zZXQobWV0YS5uYW1lLCByZXN1bHQpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmICghc3VwZXJzZWRlZCgpKSB0aGlzLnBhdGNoKHsgZXJyb3I6IChlcnIgYXMgRXJyb3IpPy5tZXNzYWdlID8/IFN0cmluZyhlcnIpIH0pO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHJ1bj8udGVybWluYXRlKCk7XG4gICAgICAvLyBPbmx5IGlmIGl0IGlzIHN0aWxsIG91cnM6IGEgZGF0YXNldCBzd2l0Y2ggaGFzIGFscmVhZHkgdGVybWluYXRlZCB0aGlzIHJ1biBhbmQgbWF5XG4gICAgICAvLyBoYXZlIHN0YXJ0ZWQgYW5vdGhlciwgYW5kIGNsZWFyaW5nIGhlcmUgd291bGQgb3JwaGFuIGl0IOKAlCBsZWF2aW5nIGEgd29ya2VyIG5vdGhpbmdcbiAgICAgIC8vIGNhbiBjYW5jZWwgYW5kIGEgQ2FuY2VsIGJ1dHRvbiB0aGF0IGRvZXMgbm90aGluZy5cbiAgICAgIGlmICh0aGlzLnJ1biA9PT0gcnVuKSB7XG4gICAgICAgIHRoaXMucnVuID0gbnVsbDtcbiAgICAgICAgdGhpcy5wYXRjaCh7IHJ1bm5pbmc6IGZhbHNlLCBmcmFjdGlvbjogbnVsbCB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogVGhlIHVzZXIncyBDYW5jZWw6IGFzayB0aGUgd29ya2VyIHRvIHN0b3AuIFRoZSBydW4gc2V0dGxlcyBzaG9ydGx5IGFmdGVyLCB3aXRoIG5vdGhpbmcuICovXG4gIGNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLnJ1bj8uY2FuY2VsKCk7XG4gIH1cblxuICAvKipcbiAgICogRHJvcCBhbnkgY29tcHV0YXRpb24gaW4gcHJvZ3Jlc3MsIGJlY2F1c2Ugd2hhdCBpdCBpcyBjb21wdXRpbmcgbm8gbG9uZ2VyIGFwcGxpZXMuXG4gICAqXG4gICAqIERpc3RpbmN0IGZyb20ge0BsaW5rIGNhbmNlbH06IHRoaXMgZG9lcyBub3Qgd2FpdCDigJQgdGhlIHJ1biBpcyBzZXR0bGVkIGFuZCB0aGUgd29ya2VyXG4gICAqIGtpbGxlZCwgc28gYSBkYXRhc2V0IHN3aXRjaCBvciBhIHRlYXJkb3duIGNhbm5vdCBsZWF2ZSBhIHQtU05FIGdyaW5kaW5nIG9uIGluIHRoZVxuICAgKiBiYWNrZ3JvdW5kIG92ZXIgb2JzZXJ2YXRpb25zIG5vdGhpbmcgaXMgc2hvd2luZyBhbnkgbW9yZS5cbiAgICovXG4gIGFiYW5kb24oKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkLmNhbmNlbCgpO1xuICAgIHRoaXMucnVuPy50ZXJtaW5hdGUoKTtcbiAgICB0aGlzLnJ1biA9IG51bGw7XG4gICAgdGhpcy5wYXRjaCh7IHJ1bm5pbmc6IGZhbHNlLCBmcmFjdGlvbjogbnVsbCwgYmFja2VuZDogbnVsbCwgbWVzc2FnZTogbnVsbCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcGF0Y2gocDogUGFydGlhbDxFbWJlZGRpbmdDb21wdXRlU3RhdGU+KTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZSQubmV4dCh7IC4uLnRoaXMuc3RhdGUkLnZhbHVlLCAuLi5wIH0pO1xuICB9XG59XG5cbi8qKlxuICogVGhlIGRhdGFzZXQncyBQQ0EsIGFzIHJvdy1tYWpvciBzY29yZXMuXG4gKlxuICogQXNzZW1ibGVkIGZyb20gd2hpY2hldmVyIFBDQSB0aGUgc291cmNlIG9mZmVycywgd2lkZXN0IGZpcnN0IOKAlCBhIDMtRCBvbmUgZ2l2ZXMgdC1TTkVcbiAqIHRocmVlIGNvbXBvbmVudHMgaW5zdGVhZCBvZiB0d28gZm9yIHRoZSBzYW1lIHJlcXVlc3QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkUGNhU2NvcmVzKFxuICBlbWJlZGRpbmdzOiByZWFkb25seSBTcGF0aWFsRW1iZWRkaW5nTWV0YVtdLFxuICBnZXRFbWJlZGRpbmc6IEVtYmVkZGluZ1NvdXJjZSxcbik6IFByb21pc2U8eyBzY29yZXM6IEZsb2F0MzJBcnJheTsgbk9iczogbnVtYmVyOyBuRGltczogbnVtYmVyIH0gfCBudWxsPiB7XG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBlbWJlZGRpbmdzXG4gICAgLmZpbHRlcigoZSkgPT4gL3BjYS9pLnRlc3QoZS5sYWJlbCA/PyBlLm5hbWUpICYmICFlLm5hbWUuc3RhcnRzV2l0aCgnbG9jYWw6JykpXG4gICAgLnNvcnQoKGEsIGIpID0+IGIuZGltcyAtIGEuZGltcyk7XG4gIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGNhID0gYXdhaXQgZ2V0RW1iZWRkaW5nKGNhbmRpZGF0ZS5uYW1lKTtcbiAgICAgIGNvbnN0IHBsYW5lcyA9IFtwY2EueCwgcGNhLnksIC4uLihwY2EueiA/IFtwY2Euel0gOiBbXSldO1xuICAgICAgY29uc3Qgbk9icyA9IHBjYS54Lmxlbmd0aDtcbiAgICAgIGNvbnN0IG5EaW1zID0gcGxhbmVzLmxlbmd0aDtcbiAgICAgIGNvbnN0IHNjb3JlcyA9IG5ldyBGbG9hdDMyQXJyYXkobk9icyAqIG5EaW1zKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbk9iczsgaSsrKSB7XG4gICAgICAgIGZvciAobGV0IGQgPSAwOyBkIDwgbkRpbXM7IGQrKykgc2NvcmVzW2kgKiBuRGltcyArIGRdID0gcGxhbmVzW2RdW2ldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgc2NvcmVzLCBuT2JzLCBuRGltcyB9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVHJ5IHRoZSBuZXh0OyBhIHNvdXJjZSBtYXkgYWR2ZXJ0aXNlIG9uZSBpdCBjYW5ub3QgYWN0dWFsbHkgc2VydmUuXG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuIl19
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One t-SNE run in its own worker: start it, follow its progress, cancel it. Single use —
|
|
3
|
+
* a new computation takes a new run.
|
|
4
|
+
*/
|
|
1
5
|
export class EmbeddingComputeRun {
|
|
2
6
|
/**
|
|
3
7
|
* `factory` is optional: without one the real worker module is imported on demand.
|
|
@@ -10,6 +14,17 @@ export class EmbeddingComputeRun {
|
|
|
10
14
|
this.factory = factory;
|
|
11
15
|
this.worker = null;
|
|
12
16
|
this.settled = false;
|
|
17
|
+
/**
|
|
18
|
+
* Between `run()` being called and the worker existing.
|
|
19
|
+
*
|
|
20
|
+
* The default factory imports the worker module first, and a dataset switch or a
|
|
21
|
+
* teardown can call {@link terminate} in that window. With no worker yet there is
|
|
22
|
+
* nothing to kill, so terminating bumps {@link generation} instead and the run stops
|
|
23
|
+
* itself the moment the worker arrives, before posting it any work.
|
|
24
|
+
*/
|
|
25
|
+
this.starting = false;
|
|
26
|
+
/** Bumped by {@link terminate}; a run that finds it changed across its await gives up. */
|
|
27
|
+
this.generation = 0;
|
|
13
28
|
/**
|
|
14
29
|
* Settles a run that is still waiting, set for as long as one is.
|
|
15
30
|
*
|
|
@@ -29,14 +44,29 @@ export class EmbeddingComputeRun {
|
|
|
29
44
|
* block is how a cancelled run ends up reported as a crash.
|
|
30
45
|
*/
|
|
31
46
|
async run(request, meta, onProgress) {
|
|
32
|
-
if (this.worker)
|
|
47
|
+
if (this.worker || this.starting)
|
|
33
48
|
throw new Error('a computation is already running');
|
|
34
|
-
const
|
|
35
|
-
?? (await import('./tsne-worker')).createTsneWorker;
|
|
36
|
-
const worker = create();
|
|
37
|
-
this.worker = worker;
|
|
49
|
+
const generation = ++this.generation;
|
|
38
50
|
this.settled = false;
|
|
39
|
-
|
|
51
|
+
this.starting = true;
|
|
52
|
+
let worker;
|
|
53
|
+
try {
|
|
54
|
+
// Awaited only when it IS a promise: a synchronous factory keeps the worker
|
|
55
|
+
// receiving its start message in the same tick, as callers already rely on.
|
|
56
|
+
const made = this.factory ? this.factory() : import('./tsne-worker').then((m) => m.createTsneWorker());
|
|
57
|
+
worker = made instanceof Promise ? await made : made;
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
if (generation === this.generation)
|
|
61
|
+
this.starting = false;
|
|
62
|
+
}
|
|
63
|
+
// Terminated while the worker was being created: nothing may start computing now.
|
|
64
|
+
if (generation !== this.generation) {
|
|
65
|
+
worker.terminate();
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
this.worker = worker;
|
|
69
|
+
const { scores, nObs, nDims, dims, perplexity = 30, iterations = 1000, seed = 0 } = request;
|
|
40
70
|
let backend = null;
|
|
41
71
|
return new Promise((resolve, reject) => {
|
|
42
72
|
const finish = (fn) => {
|
|
@@ -84,8 +114,8 @@ export class EmbeddingComputeRun {
|
|
|
84
114
|
meta: {
|
|
85
115
|
...meta,
|
|
86
116
|
derived: true,
|
|
87
|
-
params: `PCA(${nDims}) then t-SNE, perplexity ${data.perplexity}, `
|
|
88
|
-
|
|
117
|
+
params: `PCA(${nDims}) then t-SNE, perplexity ${data.perplexity}, ` +
|
|
118
|
+
`${iterations} iterations, seed ${seed}`,
|
|
89
119
|
},
|
|
90
120
|
x: planes[0],
|
|
91
121
|
y: planes[1],
|
|
@@ -129,6 +159,9 @@ export class EmbeddingComputeRun {
|
|
|
129
159
|
* settled here, with null, because nothing is left to deliver the answer.
|
|
130
160
|
*/
|
|
131
161
|
terminate() {
|
|
162
|
+
// Also reaches a run still waiting for its worker — see `starting`.
|
|
163
|
+
this.generation++;
|
|
164
|
+
this.starting = false;
|
|
132
165
|
const abandon = this.abandon;
|
|
133
166
|
this.abandon = null;
|
|
134
167
|
this.worker?.terminate();
|
|
@@ -136,7 +169,7 @@ export class EmbeddingComputeRun {
|
|
|
136
169
|
abandon?.();
|
|
137
170
|
}
|
|
138
171
|
get running() {
|
|
139
|
-
return this.worker !== null && !this.settled;
|
|
172
|
+
return (this.starting || this.worker !== null) && !this.settled;
|
|
140
173
|
}
|
|
141
174
|
}
|
|
142
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1iZWRkaW5nLWNvbXB1dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NwYXRpYWwvZW1iZWRkaW5nLWNvbXB1dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBcUNBLE1BQU0sT0FBTyxtQkFBbUI7SUFnQjlCOzs7Ozs7T0FNRztJQUNILFlBQTZCLE9BQXVCO1FBQXZCLFlBQU8sR0FBUCxPQUFPLENBQWdCO1FBdEI1QyxXQUFNLEdBQWtCLElBQUksQ0FBQztRQUU3QixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBRXhCOzs7Ozs7OztXQVFHO1FBQ0ssWUFBTyxHQUF3QixJQUFJLENBQUM7SUFTVyxDQUFDO0lBRXhEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxHQUFHLENBQ1AsT0FBdUIsRUFDdkIsSUFBMEIsRUFDMUIsVUFBK0M7UUFFL0MsSUFBSSxJQUFJLENBQUMsTUFBTTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztRQUNyRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTztlQUN0QixDQUFDLE1BQU0sTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUM7UUFDdEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFFckIsTUFBTSxFQUNKLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFDekIsVUFBVSxHQUFHLEVBQUUsRUFBRSxVQUFVLEdBQUcsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDLEdBQzdDLEdBQUcsT0FBTyxDQUFDO1FBQ1osSUFBSSxPQUFPLEdBQWtCLElBQUksQ0FBQztRQUVsQyxPQUFPLElBQUksT0FBTyxDQUEwQixDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUM5RCxNQUFNLE1BQU0sR0FBRyxDQUFDLEVBQWMsRUFBRSxFQUFFO2dCQUNoQyxJQUFJLElBQUksQ0FBQyxPQUFPO29CQUFFLE9BQU87Z0JBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO2dCQUNwQixpRkFBaUY7Z0JBQ2pGLGlEQUFpRDtnQkFDakQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDakIsRUFBRSxFQUFFLENBQUM7WUFDUCxDQUFDLENBQUM7WUFDRixrRkFBa0Y7WUFDbEYsaUZBQWlGO1lBQ2pGLHNFQUFzRTtZQUN0RSxJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUVqRCxNQUFNLENBQUMsU0FBUyxHQUFHLENBQUMsS0FBbUIsRUFBRSxFQUFFO2dCQUN6QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDOUIsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ2xCLEtBQUssU0FBUzt3QkFDWixPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQzt3QkFDdkIsVUFBVSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7d0JBQ3ZELE1BQU07b0JBQ1IsS0FBSyxTQUFTO3dCQUNaLFVBQVUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQzt3QkFDL0QsTUFBTTtvQkFDUixLQUFLLFVBQVU7d0JBQ2IsVUFBVSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7d0JBQ3pFLE1BQU07b0JBQ1IsS0FBSyxXQUFXO3dCQUNkLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzt3QkFDNUIsTUFBTTtvQkFDUixLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUM7d0JBQ1osTUFBTSxJQUFJLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUM5Qyw4RUFBOEU7d0JBQzlFLGlEQUFpRDt3QkFDakQsTUFBTSxNQUFNLEdBQW1CLEVBQUUsQ0FBQzt3QkFDbEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs0QkFDbkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7NEJBQ3JDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFO2dDQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7NEJBQ2xFLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ3JCLENBQUM7d0JBQ0QsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQzs0QkFDbkIsSUFBSSxFQUFFO2dDQUNKLEdBQUcsSUFBSTtnQ0FDUCxPQUFPLEVBQUUsSUFBSTtnQ0FDYixNQUFNLEVBQUUsT0FBTyxLQUFLLDRCQUE0QixJQUFJLENBQUMsVUFBVSxJQUFJO3NDQUMvRCxHQUFHLFVBQVUscUJBQXFCLElBQUksRUFBRTs2QkFDN0M7NEJBQ0QsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7NEJBQ1osQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7NEJBQ1osR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzt5QkFDdkMsQ0FBQyxDQUFDLENBQUM7d0JBQ0osTUFBTTtvQkFDUixDQUFDO29CQUNELEtBQUssT0FBTzt3QkFDVixNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQzlDLE1BQU07b0JBQ1I7d0JBQ0UsTUFBTTtnQkFDVixDQUFDO1lBQ0gsQ0FBQyxDQUFDO1lBQ0Ysa0ZBQWtGO1lBQ2xGLGtEQUFrRDtZQUNsRCxNQUFNLENBQUMsT0FBTyxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQ2hDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsS0FBSyxDQUFDLE9BQU8sSUFBSSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQ2xGLENBQUM7WUFFRixpRkFBaUY7WUFDakYscUNBQXFDO1lBQ3JDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMvQixNQUFNLENBQUMsV0FBVyxDQUNoQjtnQkFDRSxJQUFJLEVBQUUsT0FBTztnQkFDYixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07Z0JBQ3RCLElBQUk7Z0JBQ0osS0FBSztnQkFDTCxJQUFJO2dCQUNKLFVBQVU7Z0JBQ1YsVUFBVTtnQkFDVixJQUFJO2FBQ0wsRUFDRCxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FDakIsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGdFQUFnRTtJQUNoRSxNQUFNO1FBQ0osSUFBSSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxTQUFTO1FBQ1AsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUM3QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE9BQU8sRUFBRSxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDL0MsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3BhdGlhbEVtYmVkZGluZywgU3BhdGlhbEVtYmVkZGluZ01ldGEgfSBmcm9tICcuLi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0JztcblxuLyoqXG4gKiBSdW4gYSB0LVNORSBpbiBhIFdlYiBXb3JrZXIgYW5kIHJlcG9ydCBwcm9ncmVzcy5cbiAqXG4gKiBUaGUgcGFuZWwgb2ZmZXJzIHRoaXMgZm9yIGEgZGF0YXNldCB0aGF0IHB1Ymxpc2hlcyBubyB0LVNORSDigJQgYSBkcm9wcGVkLWluIGAuaDVhZGBcbiAqIHR5cGljYWxseSBjYXJyaWVzIG9uZSBVTUFQIGFuZCBub3RoaW5nIGVsc2UuIFRoZSBzZXJ2ZXIgcmVkdWNlcyB0byBQQ0EgKGl0IG5lZWRzIHRoZVxuICogd2hvbGUgZXhwcmVzc2lvbiBtYXRyaXgsIHdoaWNoIHRoZSBicm93c2VyIHNob3VsZCBub3QgZG93bmxvYWQpOyB0aGlzIHRha2VzIHRob3NlXG4gKiBzY29yZXMgYW5kIGVtYmVkcyB0aGVtIGhlcmUsIHdoZXJlIHRoZSBHUFUgaXMuXG4gKlxuICogQSB0aGluIHdyYXBwZXIgb24gcHVycG9zZTogbm8gQW5ndWxhciwgbm8gc3RvcmUuIEl0IG93bnMgb25lIHdvcmtlciBhbmQgb25lIHJ1biwgc28gYVxuICogY29tcG9uZW50IGNhbiBob2xkIGl0LCBzaG93IGEgcHJvZ3Jlc3MgYmFyLCBhbmQgY2FuY2VsIOKAlCBhbmQgc28gdGhlIHdob2xlIHRoaW5nIGNhbiBiZVxuICogdGVzdGVkIGJ5IHN1YnN0aXR1dGluZyBhIHdvcmtlci5cbiAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbXB1dGVQcm9ncmVzcyB7XG4gIC8qKiAwLi4xLCBvciBudWxsIGJlZm9yZSB0aGUgZmlyc3QgcmVwb3J0IOKAlCBhIHJ1biBzdGFydHMgd2l0aCBrTk4gYW5kIFAsIG5vdCBpdGVyYXRpb25zLiAqL1xuICBmcmFjdGlvbjogbnVtYmVyIHwgbnVsbDtcbiAgLyoqICd3ZWJncHUnLCAnd2FzbScgb3IgJ2NwdScgb25jZSBrbm93bjogaXQgY2hhbmdlcyB3aGF0IGEgbG9uZyB3YWl0IG1lYW5zLiAqL1xuICBiYWNrZW5kOiBzdHJpbmcgfCBudWxsO1xuICBtZXNzYWdlOiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXB1dGVSZXF1ZXN0IHtcbiAgLyoqIFBDQSBzY29yZXMsIHJvdy1tYWpvciBgbk9icyB4IG5EaW1zYC4gKi9cbiAgc2NvcmVzOiBGbG9hdDMyQXJyYXk7XG4gIG5PYnM6IG51bWJlcjtcbiAgbkRpbXM6IG51bWJlcjtcbiAgZGltczogMiB8IDM7XG4gIHBlcnBsZXhpdHk/OiBudW1iZXI7XG4gIGl0ZXJhdGlvbnM/OiBudW1iZXI7XG4gIHNlZWQ/OiBudW1iZXI7XG59XG5cbi8qKiBGYWN0b3J5LCBzbyBhIHRlc3QgY2FuIHN1cHBseSBhIHdvcmtlciB3aXRob3V0IGEgYnVuZGxlci4gKi9cbmV4cG9ydCB0eXBlIFdvcmtlckZhY3RvcnkgPSAoKSA9PiBXb3JrZXI7XG5cbmV4cG9ydCBjbGFzcyBFbWJlZGRpbmdDb21wdXRlUnVuIHtcbiAgcHJpdmF0ZSB3b3JrZXI6IFdvcmtlciB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgc2V0dGxlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBTZXR0bGVzIGEgcnVuIHRoYXQgaXMgc3RpbGwgd2FpdGluZywgc2V0IGZvciBhcyBsb25nIGFzIG9uZSBpcy5cbiAgICpcbiAgICogYHRlcm1pbmF0ZSgpYCBpcyBjYWxsZWQgZnJvbSBvdXRzaWRlIOKAlCBhIGRhdGFzZXQgc3dpdGNoLCBhIGNvbXBvbmVudCBiZWluZyBkZXN0cm95ZWQg4oCUXG4gICAqIGFuZCBraWxsaW5nIHRoZSB3b3JrZXIgb24gaXRzIG93biBsZWF2ZXMgdGhlIHByb21pc2UgYHJ1bigpYCByZXR1cm5lZCBwZW5kaW5nIEZPUlxuICAgKiBFVkVSLCBiZWNhdXNlIHRoZSBzZXR0bGVtZW50IGl0IHdhcyB3YWl0aW5nIGZvciBhcnJpdmVzIGFzIGEgd29ya2VyIG1lc3NhZ2UuIFRoZVxuICAgKiBhd2FpdGluZyBjbG9zdXJlLCBhbmQgZXZlcnl0aGluZyBpdCBjYXB0dXJlZCwgaXMgcmV0YWluZWQgd2l0aCBpdC4gU28gdGVybWluYXRpb25cbiAgICogc2V0dGxlcyB0aGUgcnVuIGl0c2VsZi5cbiAgICovXG4gIHByaXZhdGUgYWJhbmRvbjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIGBmYWN0b3J5YCBpcyBvcHRpb25hbDogd2l0aG91dCBvbmUgdGhlIHJlYWwgd29ya2VyIG1vZHVsZSBpcyBpbXBvcnRlZCBvbiBkZW1hbmQuXG4gICAqXG4gICAqIER5bmFtaWNhbGx5LCBhbmQgdGhhdCBpcyBub3QgbGF6aW5lc3MgZm9yIGl0cyBvd24gc2FrZSDigJQgdGhlIG1vZHVsZSBob2xkcyBhblxuICAgKiBgaW1wb3J0Lm1ldGEudXJsYCwgd2hpY2ggdHMtamVzdCdzIENvbW1vbkpTIGNvbXBpbGUgcmVqZWN0cyBvdXRyaWdodCwgc28gYSBzdGF0aWNcbiAgICogaW1wb3J0IGhlcmUgd291bGQgYnJlYWsgZXZlcnkgc3BlYyB0aGF0IHRvdWNoZXMgdGhpcyBmaWxlLlxuICAgKi9cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBmYWN0b3J5PzogV29ya2VyRmFjdG9yeSkge31cblxuICAvKipcbiAgICogU3RhcnQgYSBydW4uIFJlc29sdmVzIHdpdGggdGhlIGNvb3JkaW5hdGVzLCBvciBudWxsIGlmIGNhbmNlbGxlZC5cbiAgICpcbiAgICogUmVqZWN0cyBvbmx5IG9uIGEgcmVhbCBmYWlsdXJlLiBDYW5jZWxsYXRpb24gaXMgYSBOVUxMIHJhdGhlciB0aGFuIGEgcmVqZWN0aW9uOiBhIHVzZXJcbiAgICogcHJlc3NpbmcgQ2FuY2VsIGlzIG5vdCBhbiBlcnJvciwgYW5kIG1ha2luZyBjYWxsZXJzIHRlbGwgdGhlIHR3byBhcGFydCBpbiBhIGNhdGNoXG4gICAqIGJsb2NrIGlzIGhvdyBhIGNhbmNlbGxlZCBydW4gZW5kcyB1cCByZXBvcnRlZCBhcyBhIGNyYXNoLlxuICAgKi9cbiAgYXN5bmMgcnVuKFxuICAgIHJlcXVlc3Q6IENvbXB1dGVSZXF1ZXN0LFxuICAgIG1ldGE6IFNwYXRpYWxFbWJlZGRpbmdNZXRhLFxuICAgIG9uUHJvZ3Jlc3M6IChwcm9ncmVzczogQ29tcHV0ZVByb2dyZXNzKSA9PiB2b2lkLFxuICApOiBQcm9taXNlPFNwYXRpYWxFbWJlZGRpbmcgfCBudWxsPiB7XG4gICAgaWYgKHRoaXMud29ya2VyKSB0aHJvdyBuZXcgRXJyb3IoJ2EgY29tcHV0YXRpb24gaXMgYWxyZWFkeSBydW5uaW5nJyk7XG4gICAgY29uc3QgY3JlYXRlID0gdGhpcy5mYWN0b3J5XG4gICAgICA/PyAoYXdhaXQgaW1wb3J0KCcuL3RzbmUtd29ya2VyJykpLmNyZWF0ZVRzbmVXb3JrZXI7XG4gICAgY29uc3Qgd29ya2VyID0gY3JlYXRlKCk7XG4gICAgdGhpcy53b3JrZXIgPSB3b3JrZXI7XG4gICAgdGhpcy5zZXR0bGVkID0gZmFsc2U7XG5cbiAgICBjb25zdCB7XG4gICAgICBzY29yZXMsIG5PYnMsIG5EaW1zLCBkaW1zLFxuICAgICAgcGVycGxleGl0eSA9IDMwLCBpdGVyYXRpb25zID0gMTAwMCwgc2VlZCA9IDAsXG4gICAgfSA9IHJlcXVlc3Q7XG4gICAgbGV0IGJhY2tlbmQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFNwYXRpYWxFbWJlZGRpbmcgfCBudWxsPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBmaW5pc2ggPSAoZm46ICgpID0+IHZvaWQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICB0aGlzLnNldHRsZWQgPSB0cnVlO1xuICAgICAgICAvLyBDbGVhcmVkIEJFRk9SRSB0ZXJtaW5hdGluZzogYHRlcm1pbmF0ZSgpYCBjYWxscyBpdCwgYW5kIHRoaXMgaXMgd2hhdCBrZWVwcyB0aGVcbiAgICAgICAgLy8gdHdvIGZyb20gY2FsbGluZyBlYWNoIG90aGVyIHJvdW5kIGluIGEgY2lyY2xlLlxuICAgICAgICB0aGlzLmFiYW5kb24gPSBudWxsO1xuICAgICAgICB0aGlzLnRlcm1pbmF0ZSgpO1xuICAgICAgICBmbigpO1xuICAgICAgfTtcbiAgICAgIC8vIEFuIGFiYW5kb25lZCBydW4gcmVzb2x2ZXMgTlVMTCwgZXhhY3RseSBhcyBhIGNhbmNlbGxlZCBvbmUgZG9lcy4gSXQgaXMgdGhlIHNhbWVcbiAgICAgIC8vIGV2ZW50IGZyb20gdGhlIGNhbGxlcidzIHNpZGUg4oCUIHRoZSBhbnN3ZXIgd2FzIG5vIGxvbmdlciB3YW50ZWQg4oCUIGFuZCByZWplY3RpbmdcbiAgICAgIC8vIHdvdWxkIG1ha2UgYSByb3V0aW5lIGRhdGFzZXQgc3dpdGNoIGxvb2sgbGlrZSBhIGZhaWxlZCBjb21wdXRhdGlvbi5cbiAgICAgIHRoaXMuYWJhbmRvbiA9ICgpID0+IGZpbmlzaCgoKSA9PiByZXNvbHZlKG51bGwpKTtcblxuICAgICAgd29ya2VyLm9ubWVzc2FnZSA9IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBldmVudC5kYXRhID8/IHt9O1xuICAgICAgICBzd2l0Y2ggKGRhdGEudHlwZSkge1xuICAgICAgICAgIGNhc2UgJ2JhY2tlbmQnOlxuICAgICAgICAgICAgYmFja2VuZCA9IGRhdGEuYmFja2VuZDtcbiAgICAgICAgICAgIG9uUHJvZ3Jlc3MoeyBmcmFjdGlvbjogbnVsbCwgYmFja2VuZCwgbWVzc2FnZTogbnVsbCB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3dhcm5pbmcnOlxuICAgICAgICAgICAgb25Qcm9ncmVzcyh7IGZyYWN0aW9uOiBudWxsLCBiYWNrZW5kLCBtZXNzYWdlOiBkYXRhLm1lc3NhZ2UgfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdwcm9ncmVzcyc6XG4gICAgICAgICAgICBvblByb2dyZXNzKHsgZnJhY3Rpb246IGRhdGEuZG9uZSAvIGRhdGEudG90YWwsIGJhY2tlbmQsIG1lc3NhZ2U6IG51bGwgfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdjYW5jZWxsZWQnOlxuICAgICAgICAgICAgZmluaXNoKCgpID0+IHJlc29sdmUobnVsbCkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnZG9uZSc6IHtcbiAgICAgICAgICAgIGNvbnN0IGZsYXQgPSBuZXcgRmxvYXQzMkFycmF5KGRhdGEuZW1iZWRkaW5nKTtcbiAgICAgICAgICAgIC8vIFN0cnVjdCBvZiBhcnJheXMsIG1hdGNoaW5nIHdoYXQgdGhlIHBvcnQgc2VydmVzLCBzbyB0aGUgY2hhcnQgY2Fubm90IHRlbGwgYVxuICAgICAgICAgICAgLy8gbG9jYWxseS1jb21wdXRlZCBlbWJlZGRpbmcgZnJvbSBhIGZldGNoZWQgb25lLlxuICAgICAgICAgICAgY29uc3QgcGxhbmVzOiBGbG9hdDMyQXJyYXlbXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCBkYXRhLmRpbXM7IGQrKykge1xuICAgICAgICAgICAgICBjb25zdCBwbGFuZSA9IG5ldyBGbG9hdDMyQXJyYXkobk9icyk7XG4gICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbk9iczsgaSsrKSBwbGFuZVtpXSA9IGZsYXRbaSAqIGRhdGEuZGltcyArIGRdO1xuICAgICAgICAgICAgICBwbGFuZXMucHVzaChwbGFuZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5pc2goKCkgPT4gcmVzb2x2ZSh7XG4gICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAuLi5tZXRhLFxuICAgICAgICAgICAgICAgIGRlcml2ZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBgUENBKCR7bkRpbXN9KSB0aGVuIHQtU05FLCBwZXJwbGV4aXR5ICR7ZGF0YS5wZXJwbGV4aXR5fSwgYFxuICAgICAgICAgICAgICAgICAgKyBgJHtpdGVyYXRpb25zfSBpdGVyYXRpb25zLCBzZWVkICR7c2VlZH1gLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB4OiBwbGFuZXNbMF0sXG4gICAgICAgICAgICAgIHk6IHBsYW5lc1sxXSxcbiAgICAgICAgICAgICAgLi4uKHBsYW5lc1syXSA/IHsgejogcGxhbmVzWzJdIH0gOiB7fSksXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICAgICAgZmluaXNoKCgpID0+IHJlamVjdChuZXcgRXJyb3IoZGF0YS5tZXNzYWdlKSkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLy8gQSB3b3JrZXIgdGhhdCBkaWVzIHRha2VzIHRoZSBwcm9taXNlIHdpdGggaXQ7IHdpdGhvdXQgdGhpcyB0aGUgY2FsbGVyIHdhaXRzIGZvclxuICAgICAgLy8gZXZlciBvbiBhIHByb2dyZXNzIGJhciB0aGF0IGhhcyBzdG9wcGVkIG1vdmluZy5cbiAgICAgIHdvcmtlci5vbmVycm9yID0gKGV2ZW50KSA9PiBmaW5pc2goXG4gICAgICAgICgpID0+IHJlamVjdChuZXcgRXJyb3IoYGVtYmVkZGluZyB3b3JrZXIgZmFpbGVkOiAke2V2ZW50Lm1lc3NhZ2UgPz8gJ3Vua25vd24nfWApKSxcbiAgICAgICk7XG5cbiAgICAgIC8vIENvcGllZCwgdGhlbiB0cmFuc2ZlcnJlZDogdGhlIGNhbGxlciBrZWVwcyBpdHMgc2NvcmVzLCBhbmQgdGhlIHdvcmtlciBnZXRzIHRoZVxuICAgICAgLy8gYnVmZmVyIHdpdGhvdXQgYSBzdHJ1Y3R1cmVkIGNsb25lLlxuICAgICAgY29uc3QgcGF5bG9hZCA9IHNjb3Jlcy5zbGljZSgpO1xuICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ3N0YXJ0JyxcbiAgICAgICAgICBzY29yZXM6IHBheWxvYWQuYnVmZmVyLFxuICAgICAgICAgIG5PYnMsXG4gICAgICAgICAgbkRpbXMsXG4gICAgICAgICAgZGltcyxcbiAgICAgICAgICBwZXJwbGV4aXR5LFxuICAgICAgICAgIGl0ZXJhdGlvbnMsXG4gICAgICAgICAgc2VlZCxcbiAgICAgICAgfSxcbiAgICAgICAgW3BheWxvYWQuYnVmZmVyXSxcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogQXNrIHRoZSBydW4gdG8gc3RvcC4gSXQgcmVzb2x2ZXMgd2l0aCBudWxsIHNob3J0bHkgYWZ0ZXIuICovXG4gIGNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLndvcmtlcj8ucG9zdE1lc3NhZ2UoeyB0eXBlOiAnY2FuY2VsJyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIGltbWVkaWF0ZWx5LCBhYmFuZG9uaW5nIGFueSByZXN1bHQuIFNhZmUgdG8gY2FsbCB0d2ljZS5cbiAgICpcbiAgICogVW5saWtlIHtAbGluayBjYW5jZWx9LCB0aGlzIGRvZXMgbm90IHdhaXQgZm9yIHRoZSB3b3JrZXIgdG8gYWNrbm93bGVkZ2Ug4oCUIHRoZSBydW4gaXNcbiAgICogc2V0dGxlZCBoZXJlLCB3aXRoIG51bGwsIGJlY2F1c2Ugbm90aGluZyBpcyBsZWZ0IHRvIGRlbGl2ZXIgdGhlIGFuc3dlci5cbiAgICovXG4gIHRlcm1pbmF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBhYmFuZG9uID0gdGhpcy5hYmFuZG9uO1xuICAgIHRoaXMuYWJhbmRvbiA9IG51bGw7XG4gICAgdGhpcy53b3JrZXI/LnRlcm1pbmF0ZSgpO1xuICAgIHRoaXMud29ya2VyID0gbnVsbDtcbiAgICBhYmFuZG9uPy4oKTtcbiAgfVxuXG4gIGdldCBydW5uaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLndvcmtlciAhPT0gbnVsbCAmJiAhdGhpcy5zZXR0bGVkO1xuICB9XG59XG4iXX0=
|
|
175
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1iZWRkaW5nLWNvbXB1dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NwYXRpYWwvZW1iZWRkaW5nLWNvbXB1dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBeUNBOzs7R0FHRztBQUNILE1BQU0sT0FBTyxtQkFBbUI7SUE2QjlCOzs7Ozs7T0FNRztJQUNILFlBQTZCLE9BQXVCO1FBQXZCLFlBQU8sR0FBUCxPQUFPLENBQWdCO1FBbkM1QyxXQUFNLEdBQWtCLElBQUksQ0FBQztRQUU3QixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBRXhCOzs7Ozs7O1dBT0c7UUFDSyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRXpCLDBGQUEwRjtRQUNsRixlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBRXZCOzs7Ozs7OztXQVFHO1FBQ0ssWUFBTyxHQUF3QixJQUFJLENBQUM7SUFTVyxDQUFDO0lBRXhEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxHQUFHLENBQ1AsT0FBdUIsRUFDdkIsSUFBMEIsRUFDMUIsVUFBK0M7UUFFL0MsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1FBQ3RGLE1BQU0sVUFBVSxHQUFHLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNyQyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLE1BQWMsQ0FBQztRQUNuQixJQUFJLENBQUM7WUFDSCw0RUFBNEU7WUFDNUUsNEVBQTRFO1lBQzVFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMs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TyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDbEUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3BhdGlhbEVtYmVkZGluZywgU3BhdGlhbEVtYmVkZGluZ01ldGEgfSBmcm9tICcuLi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0JztcblxuLyoqXG4gKiBSdW4gYSB0LVNORSBpbiBhIFdlYiBXb3JrZXIgYW5kIHJlcG9ydCBwcm9ncmVzcy5cbiAqXG4gKiBUaGUgcGFuZWwgb2ZmZXJzIHRoaXMgZm9yIGEgZGF0YXNldCB0aGF0IHB1Ymxpc2hlcyBubyB0LVNORSDigJQgYSBkcm9wcGVkLWluIGAuaDVhZGBcbiAqIHR5cGljYWxseSBjYXJyaWVzIG9uZSBVTUFQIGFuZCBub3RoaW5nIGVsc2UuIFRoZSBzZXJ2ZXIgcmVkdWNlcyB0byBQQ0EgKGl0IG5lZWRzIHRoZVxuICogd2hvbGUgZXhwcmVzc2lvbiBtYXRyaXgsIHdoaWNoIHRoZSBicm93c2VyIHNob3VsZCBub3QgZG93bmxvYWQpOyB0aGlzIHRha2VzIHRob3NlXG4gKiBzY29yZXMgYW5kIGVtYmVkcyB0aGVtIGhlcmUsIHdoZXJlIHRoZSBHUFUgaXMuXG4gKlxuICogQSB0aGluIHdyYXBwZXIgb24gcHVycG9zZTogbm8gQW5ndWxhciwgbm8gc3RvcmUuIEl0IG93bnMgb25lIHdvcmtlciBhbmQgb25lIHJ1biwgc28gYVxuICogY29tcG9uZW50IGNhbiBob2xkIGl0LCBzaG93IGEgcHJvZ3Jlc3MgYmFyLCBhbmQgY2FuY2VsIOKAlCBhbmQgc28gdGhlIHdob2xlIHRoaW5nIGNhbiBiZVxuICogdGVzdGVkIGJ5IHN1YnN0aXR1dGluZyBhIHdvcmtlci5cbiAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbXB1dGVQcm9ncmVzcyB7XG4gIC8qKiAwLi4xLCBvciBudWxsIGJlZm9yZSB0aGUgZmlyc3QgcmVwb3J0IOKAlCBhIHJ1biBzdGFydHMgd2l0aCBrTk4gYW5kIFAsIG5vdCBpdGVyYXRpb25zLiAqL1xuICBmcmFjdGlvbjogbnVtYmVyIHwgbnVsbDtcbiAgLyoqICd3ZWJncHUnLCAnd2FzbScgb3IgJ2NwdScgb25jZSBrbm93bjogaXQgY2hhbmdlcyB3aGF0IGEgbG9uZyB3YWl0IG1lYW5zLiAqL1xuICBiYWNrZW5kOiBzdHJpbmcgfCBudWxsO1xuICBtZXNzYWdlOiBzdHJpbmcgfCBudWxsO1xufVxuXG4vKiogT25lIHQtU05FIHRvIGNvbXB1dGU6IHRoZSBQQ0Egc2NvcmVzIHRvIGVtYmVkIGFuZCB0aGUgcnVuJ3MgcGFyYW1ldGVycy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcHV0ZVJlcXVlc3Qge1xuICAvKiogUENBIHNjb3Jlcywgcm93LW1ham9yIGBuT2JzIHggbkRpbXNgLiAqL1xuICBzY29yZXM6IEZsb2F0MzJBcnJheTtcbiAgbk9iczogbnVtYmVyO1xuICBuRGltczogbnVtYmVyO1xuICBkaW1zOiAyIHwgMztcbiAgcGVycGxleGl0eT86IG51bWJlcjtcbiAgaXRlcmF0aW9ucz86IG51bWJlcjtcbiAgc2VlZD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBGYWN0b3J5LCBzbyBhIHRlc3QgY2FuIHN1cHBseSBhIHdvcmtlciB3aXRob3V0IGEgYnVuZGxlci4gTWF5IGJlIGFzeW5jaHJvbm91cywgYXMgdGhlXG4gKiBkZWZhdWx0IG9uZSBpczogaXQgaW1wb3J0cyB0aGUgd29ya2VyIG1vZHVsZSBvbiBkZW1hbmQuXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtlckZhY3RvcnkgPSAoKSA9PiBXb3JrZXIgfCBQcm9taXNlPFdvcmtlcj47XG5cbi8qKlxuICogT25lIHQtU05FIHJ1biBpbiBpdHMgb3duIHdvcmtlcjogc3RhcnQgaXQsIGZvbGxvdyBpdHMgcHJvZ3Jlc3MsIGNhbmNlbCBpdC4gU2luZ2xlIHVzZSDigJRcbiAqIGEgbmV3IGNvbXB1dGF0aW9uIHRha2VzIGEgbmV3IHJ1bi5cbiAqL1xuZXhwb3J0IGNsYXNzIEVtYmVkZGluZ0NvbXB1dGVSdW4ge1xuICBwcml2YXRlIHdvcmtlcjogV29ya2VyIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBzZXR0bGVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEJldHdlZW4gYHJ1bigpYCBiZWluZyBjYWxsZWQgYW5kIHRoZSB3b3JrZXIgZXhpc3RpbmcuXG4gICAqXG4gICAqIFRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wb3J0cyB0aGUgd29ya2VyIG1vZHVsZSBmaXJzdCwgYW5kIGEgZGF0YXNldCBzd2l0Y2ggb3IgYVxuICAgKiB0ZWFyZG93biBjYW4gY2FsbCB7QGxpbmsgdGVybWluYXRlfSBpbiB0aGF0IHdpbmRvdy4gV2l0aCBubyB3b3JrZXIgeWV0IHRoZXJlIGlzXG4gICAqIG5vdGhpbmcgdG8ga2lsbCwgc28gdGVybWluYXRpbmcgYnVtcHMge0BsaW5rIGdlbmVyYXRpb259IGluc3RlYWQgYW5kIHRoZSBydW4gc3RvcHNcbiAgICogaXRzZWxmIHRoZSBtb21lbnQgdGhlIHdvcmtlciBhcnJpdmVzLCBiZWZvcmUgcG9zdGluZyBpdCBhbnkgd29yay5cbiAgICovXG4gIHByaXZhdGUgc3RhcnRpbmcgPSBmYWxzZTtcblxuICAvKiogQnVtcGVkIGJ5IHtAbGluayB0ZXJtaW5hdGV9OyBhIHJ1biB0aGF0IGZpbmRzIGl0IGNoYW5nZWQgYWNyb3NzIGl0cyBhd2FpdCBnaXZlcyB1cC4gKi9cbiAgcHJpdmF0ZSBnZW5lcmF0aW9uID0gMDtcblxuICAvKipcbiAgICogU2V0dGxlcyBhIHJ1biB0aGF0IGlzIHN0aWxsIHdhaXRpbmcsIHNldCBmb3IgYXMgbG9uZyBhcyBvbmUgaXMuXG4gICAqXG4gICAqIGB0ZXJtaW5hdGUoKWAgaXMgY2FsbGVkIGZyb20gb3V0c2lkZSDigJQgYSBkYXRhc2V0IHN3aXRjaCwgYSBjb21wb25lbnQgYmVpbmcgZGVzdHJveWVkIOKAlFxuICAgKiBhbmQga2lsbGluZyB0aGUgd29ya2VyIG9uIGl0cyBvd24gbGVhdmVzIHRoZSBwcm9taXNlIGBydW4oKWAgcmV0dXJuZWQgcGVuZGluZyBGT1JcbiAgICogRVZFUiwgYmVjYXVzZSB0aGUgc2V0dGxlbWVudCBpdCB3YXMgd2FpdGluZyBmb3IgYXJyaXZlcyBhcyBhIHdvcmtlciBtZXNzYWdlLiBUaGVcbiAgICogYXdhaXRpbmcgY2xvc3VyZSwgYW5kIGV2ZXJ5dGhpbmcgaXQgY2FwdHVyZWQsIGlzIHJldGFpbmVkIHdpdGggaXQuIFNvIHRlcm1pbmF0aW9uXG4gICAqIHNldHRsZXMgdGhlIHJ1biBpdHNlbGYuXG4gICAqL1xuICBwcml2YXRlIGFiYW5kb246ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBgZmFjdG9yeWAgaXMgb3B0aW9uYWw6IHdpdGhvdXQgb25lIHRoZSByZWFsIHdvcmtlciBtb2R1bGUgaXMgaW1wb3J0ZWQgb24gZGVtYW5kLlxuICAgKlxuICAgKiBEeW5hbWljYWxseSwgYW5kIHRoYXQgaXMgbm90IGxhemluZXNzIGZvciBpdHMgb3duIHNha2Ug4oCUIHRoZSBtb2R1bGUgaG9sZHMgYW5cbiAgICogYGltcG9ydC5tZXRhLnVybGAsIHdoaWNoIHRzLWplc3QncyBDb21tb25KUyBjb21waWxlIHJlamVjdHMgb3V0cmlnaHQsIHNvIGEgc3RhdGljXG4gICAqIGltcG9ydCBoZXJlIHdvdWxkIGJyZWFrIGV2ZXJ5IHNwZWMgdGhhdCB0b3VjaGVzIHRoaXMgZmlsZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZmFjdG9yeT86IFdvcmtlckZhY3RvcnkpIHt9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGEgcnVuLiBSZXNvbHZlcyB3aXRoIHRoZSBjb29yZGluYXRlcywgb3IgbnVsbCBpZiBjYW5jZWxsZWQuXG4gICAqXG4gICAqIFJlamVjdHMgb25seSBvbiBhIHJlYWwgZmFpbHVyZS4gQ2FuY2VsbGF0aW9uIGlzIGEgTlVMTCByYXRoZXIgdGhhbiBhIHJlamVjdGlvbjogYSB1c2VyXG4gICAqIHByZXNzaW5nIENhbmNlbCBpcyBub3QgYW4gZXJyb3IsIGFuZCBtYWtpbmcgY2FsbGVycyB0ZWxsIHRoZSB0d28gYXBhcnQgaW4gYSBjYXRjaFxuICAgKiBibG9jayBpcyBob3cgYSBjYW5jZWxsZWQgcnVuIGVuZHMgdXAgcmVwb3J0ZWQgYXMgYSBjcmFzaC5cbiAgICovXG4gIGFzeW5jIHJ1bihcbiAgICByZXF1ZXN0OiBDb21wdXRlUmVxdWVzdCxcbiAgICBtZXRhOiBTcGF0aWFsRW1iZWRkaW5nTWV0YSxcbiAgICBvblByb2dyZXNzOiAocHJvZ3Jlc3M6IENvbXB1dGVQcm9ncmVzcykgPT4gdm9pZCxcbiAgKTogUHJvbWlzZTxTcGF0aWFsRW1iZWRkaW5nIHwgbnVsbD4ge1xuICAgIGlmICh0aGlzLndvcmtlciB8fCB0aGlzLnN0YXJ0aW5nKSB0aHJvdyBuZXcgRXJyb3IoJ2EgY29tcHV0YXRpb24gaXMgYWxyZWFkeSBydW5uaW5nJyk7XG4gICAgY29uc3QgZ2VuZXJhdGlvbiA9ICsrdGhpcy5nZW5lcmF0aW9uO1xuICAgIHRoaXMuc2V0dGxlZCA9IGZhbHNlO1xuICAgIHRoaXMuc3RhcnRpbmcgPSB0cnVlO1xuICAgIGxldCB3b3JrZXI6IFdvcmtlcjtcbiAgICB0cnkge1xuICAgICAgLy8gQXdhaXRlZCBvbmx5IHdoZW4gaXQgSVMgYSBwcm9taXNlOiBhIHN5bmNocm9ub3VzIGZhY3Rvcnkga2VlcHMgdGhlIHdvcmtlclxuICAgICAgLy8gcmVjZWl2aW5nIGl0cyBzdGFydCBtZXNzYWdlIGluIHRoZSBzYW1lIHRpY2ssIGFzIGNhbGxlcnMgYWxyZWFkeSByZWx5IG9uLlxuICAgICAgY29uc3QgbWFkZSA9IHRoaXMuZmFjdG9yeSA/IHRoaXMuZmFjdG9yeSgpIDogaW1wb3J0KCcuL3RzbmUtd29ya2VyJykudGhlbigobSkgPT4gbS5jcmVhdGVUc25lV29ya2VyKCkpO1xuICAgICAgd29ya2VyID0gbWFkZSBpbnN0YW5jZW9mIFByb21pc2UgPyBhd2FpdCBtYWRlIDogbWFkZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKGdlbmVyYXRpb24gPT09IHRoaXMuZ2VuZXJhdGlvbikgdGhpcy5zdGFydGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICAvLyBUZXJtaW5hdGVkIHdoaWxlIHRoZSB3b3JrZXIgd2FzIGJlaW5nIGNyZWF0ZWQ6IG5vdGhpbmcgbWF5IHN0YXJ0IGNvbXB1dGluZyBub3cuXG4gICAgaWYgKGdlbmVyYXRpb24gIT09IHRoaXMuZ2VuZXJhdGlvbikge1xuICAgICAgd29ya2VyLnRlcm1pbmF0ZSgpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRoaXMud29ya2VyID0gd29ya2VyO1xuXG4gICAgY29uc3QgeyBzY29yZXMsIG5PYnMsIG5EaW1zLCBkaW1zLCBwZXJwbGV4aXR5ID0gMzAsIGl0ZXJhdGlvbnMgPSAxMDAwLCBzZWVkID0gMCB9ID0gcmVxdWVzdDtcbiAgICBsZXQgYmFja2VuZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2U8U3BhdGlhbEVtYmVkZGluZyB8IG51bGw+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGZpbmlzaCA9IChmbjogKCkgPT4gdm9pZCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5zZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHRoaXMuc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIC8vIENsZWFyZWQgQkVGT1JFIHRlcm1pbmF0aW5nOiBgdGVybWluYXRlKClgIGNhbGxzIGl0LCBhbmQgdGhpcyBpcyB3aGF0IGtlZXBzIHRoZVxuICAgICAgICAvLyB0d28gZnJvbSBjYWxsaW5nIGVhY2ggb3RoZXIgcm91bmQgaW4gYSBjaXJjbGUuXG4gICAgICAgIHRoaXMuYWJhbmRvbiA9IG51bGw7XG4gICAgICAgIHRoaXMudGVybWluYXRlKCk7XG4gICAgICAgIGZuKCk7XG4gICAgICB9O1xuICAgICAgLy8gQW4gYWJhbmRvbmVkIHJ1biByZXNvbHZlcyBOVUxMLCBleGFjdGx5IGFzIGEgY2FuY2VsbGVkIG9uZSBkb2VzLiBJdCBpcyB0aGUgc2FtZVxuICAgICAgLy8gZXZlbnQgZnJvbSB0aGUgY2FsbGVyJ3Mgc2lkZSDigJQgdGhlIGFuc3dlciB3YXMgbm8gbG9uZ2VyIHdhbnRlZCDigJQgYW5kIHJlamVjdGluZ1xuICAgICAgLy8gd291bGQgbWFrZSBhIHJvdXRpbmUgZGF0YXNldCBzd2l0Y2ggbG9vayBsaWtlIGEgZmFpbGVkIGNvbXB1dGF0aW9uLlxuICAgICAgdGhpcy5hYmFuZG9uID0gKCkgPT4gZmluaXNoKCgpID0+IHJlc29sdmUobnVsbCkpO1xuXG4gICAgICB3b3JrZXIub25tZXNzYWdlID0gKGV2ZW50OiBNZXNzYWdlRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGV2ZW50LmRhdGEgPz8ge307XG4gICAgICAgIHN3aXRjaCAoZGF0YS50eXBlKSB7XG4gICAgICAgICAgY2FzZSAnYmFja2VuZCc6XG4gICAgICAgICAgICBiYWNrZW5kID0gZGF0YS5iYWNrZW5kO1xuICAgICAgICAgICAgb25Qcm9ncmVzcyh7IGZyYWN0aW9uOiBudWxsLCBiYWNrZW5kLCBtZXNzYWdlOiBudWxsIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnd2FybmluZyc6XG4gICAgICAgICAgICBvblByb2dyZXNzKHsgZnJhY3Rpb246IG51bGwsIGJhY2tlbmQsIG1lc3NhZ2U6IGRhdGEubWVzc2FnZSB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3Byb2dyZXNzJzpcbiAgICAgICAgICAgIG9uUHJvZ3Jlc3MoeyBmcmFjdGlvbjogZGF0YS5kb25lIC8gZGF0YS50b3RhbCwgYmFja2VuZCwgbWVzc2FnZTogbnVsbCB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2NhbmNlbGxlZCc6XG4gICAgICAgICAgICBmaW5pc2goKCkgPT4gcmVzb2x2ZShudWxsKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdkb25lJzoge1xuICAgICAgICAgICAgY29uc3QgZmxhdCA9IG5ldyBGbG9hdDMyQXJyYXkoZGF0YS5lbWJlZGRpbmcpO1xuICAgICAgICAgICAgLy8gU3RydWN0IG9mIGFycmF5cywgbWF0Y2hpbmcgd2hhdCB0aGUgcG9ydCBzZXJ2ZXMsIHNvIHRoZSBjaGFydCBjYW5ub3QgdGVsbCBhXG4gICAgICAgICAgICAvLyBsb2NhbGx5LWNvbXB1dGVkIGVtYmVkZGluZyBmcm9tIGEgZmV0Y2hlZCBvbmUuXG4gICAgICAgICAgICBjb25zdCBwbGFuZXM6IEZsb2F0MzJBcnJheVtdID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBkID0gMDsgZCA8IGRhdGEuZGltczsgZCsrKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHBsYW5lID0gbmV3IEZsb2F0MzJBcnJheShuT2JzKTtcbiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuT2JzOyBpKyspIHBsYW5lW2ldID0gZmxhdFtpICogZGF0YS5kaW1zICsgZF07XG4gICAgICAgICAgICAgIHBsYW5lcy5wdXNoKHBsYW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmlzaCgoKSA9PlxuICAgICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAuLi5tZXRhLFxuICAgICAgICAgICAgICAgICAgZGVyaXZlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIHBhcmFtczpcbiAgICAgICAgICAgICAgICAgICAgYFBDQSgke25EaW1zfSkgdGhlbiB0LVNORSwgcGVycGxleGl0eSAke2RhdGEucGVycGxleGl0eX0sIGAgK1xuICAgICAgICAgICAgICAgICAgICBgJHtpdGVyYXRpb25zfSBpdGVyYXRpb25zLCBzZWVkICR7c2VlZH1gLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgeDogcGxhbmVzWzBdLFxuICAgICAgICAgICAgICAgIHk6IHBsYW5lc1sxXSxcbiAgICAgICAgICAgICAgICAuLi4ocGxhbmVzWzJdID8geyB6OiBwbGFuZXNbMl0gfSA6IHt9KSxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgICAgICAgIGZpbmlzaCgoKSA9PiByZWplY3QobmV3IEVycm9yKGRhdGEubWVzc2FnZSkpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8vIEEgd29ya2VyIHRoYXQgZGllcyB0YWtlcyB0aGUgcHJvbWlzZSB3aXRoIGl0OyB3aXRob3V0IHRoaXMgdGhlIGNhbGxlciB3YWl0cyBmb3JcbiAgICAgIC8vIGV2ZXIgb24gYSBwcm9ncmVzcyBiYXIgdGhhdCBoYXMgc3RvcHBlZCBtb3ZpbmcuXG4gICAgICB3b3JrZXIub25lcnJvciA9IChldmVudCkgPT5cbiAgICAgICAgZmluaXNoKCgpID0+IHJlamVjdChuZXcgRXJyb3IoYGVtYmVkZGluZyB3b3JrZXIgZmFpbGVkOiAke2V2ZW50Lm1lc3NhZ2UgPz8gJ3Vua25vd24nfWApKSk7XG5cbiAgICAgIC8vIENvcGllZCwgdGhlbiB0cmFuc2ZlcnJlZDogdGhlIGNhbGxlciBrZWVwcyBpdHMgc2NvcmVzLCBhbmQgdGhlIHdvcmtlciBnZXRzIHRoZVxuICAgICAgLy8gYnVmZmVyIHdpdGhvdXQgYSBzdHJ1Y3R1cmVkIGNsb25lLlxuICAgICAgY29uc3QgcGF5bG9hZCA9IHNjb3Jlcy5zbGljZSgpO1xuICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ3N0YXJ0JyxcbiAgICAgICAgICBzY29yZXM6IHBheWxvYWQuYnVmZmVyLFxuICAgICAgICAgIG5PYnMsXG4gICAgICAgICAgbkRpbXMsXG4gICAgICAgICAgZGltcyxcbiAgICAgICAgICBwZXJwbGV4aXR5LFxuICAgICAgICAgIGl0ZXJhdGlvbnMsXG4gICAgICAgICAgc2VlZCxcbiAgICAgICAgfSxcbiAgICAgICAgW3BheWxvYWQuYnVmZmVyXSxcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogQXNrIHRoZSBydW4gdG8gc3RvcC4gSXQgcmVzb2x2ZXMgd2l0aCBudWxsIHNob3J0bHkgYWZ0ZXIuICovXG4gIGNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLndvcmtlcj8ucG9zdE1lc3NhZ2UoeyB0eXBlOiAnY2FuY2VsJyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIGltbWVkaWF0ZWx5LCBhYmFuZG9uaW5nIGFueSByZXN1bHQuIFNhZmUgdG8gY2FsbCB0d2ljZS5cbiAgICpcbiAgICogVW5saWtlIHtAbGluayBjYW5jZWx9LCB0aGlzIGRvZXMgbm90IHdhaXQgZm9yIHRoZSB3b3JrZXIgdG8gYWNrbm93bGVkZ2Ug4oCUIHRoZSBydW4gaXNcbiAgICogc2V0dGxlZCBoZXJlLCB3aXRoIG51bGwsIGJlY2F1c2Ugbm90aGluZyBpcyBsZWZ0IHRvIGRlbGl2ZXIgdGhlIGFuc3dlci5cbiAgICovXG4gIHRlcm1pbmF0ZSgpOiB2b2lkIHtcbiAgICAvLyBBbHNvIHJlYWNoZXMgYSBydW4gc3RpbGwgd2FpdGluZyBmb3IgaXRzIHdvcmtlciDigJQgc2VlIGBzdGFydGluZ2AuXG4gICAgdGhpcy5nZW5lcmF0aW9uKys7XG4gICAgdGhpcy5zdGFydGluZyA9IGZhbHNlO1xuICAgIGNvbnN0IGFiYW5kb24gPSB0aGlzLmFiYW5kb247XG4gICAgdGhpcy5hYmFuZG9uID0gbnVsbDtcbiAgICB0aGlzLndvcmtlcj8udGVybWluYXRlKCk7XG4gICAgdGhpcy53b3JrZXIgPSBudWxsO1xuICAgIGFiYW5kb24/LigpO1xuICB9XG5cbiAgZ2V0IHJ1bm5pbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLnN0YXJ0aW5nIHx8IHRoaXMud29ya2VyICE9PSBudWxsKSAmJiAhdGhpcy5zZXR0bGVkO1xuICB9XG59XG4iXX0=
|
|
@@ -74,4 +74,4 @@ export function geneOptionsFor(names, query, selected = [], limit = GENE_OPTIONS
|
|
|
74
74
|
const seen = new Set(selected);
|
|
75
75
|
return [...selected, ...matches.filter((n) => !seen.has(n))];
|
|
76
76
|
}
|
|
77
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZS1zZWFyY2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NwYXRpYWwvZ2VuZS1zZWFyY2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFFSDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLEdBQUcsQ0FBQztBQUVwQzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxLQUF3QixFQUFFLEtBQWEsRUFBRSxLQUFLLEdBQUcsZ0JBQWdCO0lBQy9GLElBQUksS0FBSyxJQUFJLENBQUM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUMxQixNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckMsSUFBSSxDQUFDLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRXJDLE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztJQUM1QixNQUFNLFFBQVEsR0FBYSxFQUFFLENBQUM7SUFDOUIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN6QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakMsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQiw4RUFBOEU7WUFDOUUsMEVBQTBFO1lBQzFFLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxLQUFLO2dCQUFFLE9BQU8sTUFBTSxDQUFDO1FBQzVDLENBQUM7YUFBTSxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxLQUFLLEVBQUUsQ0FBQztZQUN4RCxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxDQUFDLEdBQUcsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQzVCLEtBQXdCLEVBQ3hCLEtBQWEsRUFDYixXQUE4QixFQUFFLEVBQ2hDLEtBQUssR0FBRyxnQkFBZ0I7SUFFeEIsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDckQsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLE9BQU8sQ0FBQztJQUMxQyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMvQixPQUFPLENBQUMsR0FBRyxRQUFRLEVBQUUsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE5hcnJvd2luZyBhIGdlbmUgbGlzdCB0byB0aGUgaGFuZGZ1bCBhIHBpY2tlciBzaG91bGQgYWN0dWFsbHkgcmVuZGVyLlxuICpcbiAqIEEgdGFyZ2V0ZWQgcGFuZWwgaGFzIGEgZmV3IGh1bmRyZWQgZ2VuZXMgYW5kIGNhbiBzaW1wbHkgYmUgbGlzdGVkLiBBXG4gKiB3aG9sZS10cmFuc2NyaXB0b21lIGFzc2F5IGhhcyB+MThrLTMxaywgYW5kIGhhbmRpbmcgdGhhdCBtYW55IG9wdGlvbnMgdG8gYSBkcm9wZG93blxuICogY29zdHMgYSB2aXNpYmxlIGZyZWV6ZSBvbiBldmVyeSBrZXlzdHJva2Ug4oCUIHRoZSBjb250cm9sIHJlYnVpbGRzIGFuZCByZS1maWx0ZXJzIHRoZVxuICogd2hvbGUgYXJyYXksIGFuZCB0aGUgYnJvd3NlciBsYXlzIG91dCB3aGF0IHRoZSB2aXJ0dWFsIHNjcm9sbGVyIGhhcyBub3QgeWV0IGNsaXBwZWQuXG4gKiBNZWFzdXJlZCBvbiB0aGUgVmlzaXVtIEgmRSBidW5kbGU6IDE4LDA3OCBuYW1lcy5cbiAqXG4gKiBUaGUgbmFtZXMgdGhlbXNlbHZlcyBhcmUgY2hlYXAgdG8gaG9sZCDigJQgc3RyaW5ncyBhbHJlYWR5IHBhcnNlZCBmcm9tIHRoZSBtYW5pZmVzdCDigJQgc29cbiAqIHRoaXMgZG9lcyBub3QgZmV0Y2ggYW55dGhpbmcuIFdoYXQgaXQgY2FwcyBpcyBob3cgbWFueSBPUFRJT04gT0JKRUNUUyBhcmUgZXZlclxuICogbWF0ZXJpYWxpc2VkIGZvciB0aGUgdmlldy4gVGhlIHJlc3Qgb2YgdGhlIGNvcnB1cyBzdGF5cyBhIHBsYWluIGFycmF5LCBzZWFyY2hlZCBwZXJcbiAqIGtleXN0cm9rZSwgd2hpY2ggaXMgdGhlIHdvcmsgYSBkcm9wZG93biB3YXMgZG9pbmcgYW55d2F5OyB0aGUgc2F2aW5nIGlzIGluIG5vdCBhc2tpbmdcbiAqIGEgY29tcG9uZW50IHRvIHJlbmRlciwgZGlmZiBhbmQgcmUtZmlsdGVyIHRob3VzYW5kcyBvZiByb3dzIGl0IHdpbGwgbmV2ZXIgc2hvdy5cbiAqXG4gKiBSYW5raW5nIGlzIFBSRUZJWCBGSVJTVCwgdGhlbiBzdWJzdHJpbmcuIFR5cGluZyBcIk1iXCIgc2hvdWxkIHN1cmZhY2UgYE1icGAgYWJvdmVcbiAqIGBBZGFtMWJgLCB3aGljaCBhIHBsYWluIGBpbmNsdWRlc2Agd291bGQgbm90IGRvLiBJdCBkZWxpYmVyYXRlbHkgbWlycm9ycyB0aGUgZXhhbXBsZVxuICogc2VydmVyJ3MgYC9zcGF0aWFsLzppZC9mZWF0dXJlcz9xPWAgKHNlZSBgbGliL3NwYXRpYWwubWpzYCkgc28gYSBkYXRhc2V0IHRoYXQgaW5saW5lc1xuICogaXRzIG5hbWVzIGFuZCBvbmUgdGhhdCBkb2VzIG5vdCBvcmRlciB0aGVpciBzdWdnZXN0aW9ucyB0aGUgc2FtZSB3YXkg4oCUIHRoZSBwaWNrZXIgbXVzdFxuICogbm90IGFwcGVhciB0byByYW5rIGRpZmZlcmVudGx5IGRlcGVuZGluZyBvbiBob3cgdGhlIGRhdGEgaGFwcGVucyB0byBiZSBzZXJ2ZWQuXG4gKlxuICogUHVyZSDigJQgbm8gQW5ndWxhciwgbm8gcG9ydCwgbm8gRE9NIOKAlCBsaWtlIGBzcGF0aWFsLWhlYXRtYXAudHNgLCBhbmQgdGVzdGVkIHRoZSBzYW1lIHdheS5cbiAqL1xuXG4vKipcbiAqIEhvdyBtYW55IG9wdGlvbnMgYSBwaWNrZXIgd2lsbCBtYXRlcmlhbGlzZSBhdCBvbmNlLlxuICpcbiAqIEFib3ZlIHRoZSB2aXJ0dWFsLXNjcm9sbCB0aHJlc2hvbGQsIHNvIGEgY2FwcGVkIGxpc3QgaXMgc3RpbGwgc2Nyb2xsZWQgcmF0aGVyIHRoYW4gbGFpZFxuICogb3V0IGluIGZ1bGwsIGFuZCBmYXIgYmVsb3cgdGhlIHBvaW50IHdoZXJlIHJlYnVpbGRpbmcgdGhlIGFycmF5IGlzIHBlcmNlcHRpYmxlLlxuICovXG5leHBvcnQgY29uc3QgR0VORV9PUFRJT05TX01BWCA9IDUwMDtcblxuLyoqXG4gKiBUaGUgYmVzdCBgbGltaXRgIG1hdGNoZXMgZm9yIGBxdWVyeWAsIHByZWZpeCBtYXRjaGVzIGZpcnN0LlxuICpcbiAqIEFuIGVtcHR5IHF1ZXJ5IHJldHVybnMgdGhlIGhlYWQgb2YgdGhlIGxpc3QgcmF0aGVyIHRoYW4gbm90aGluZzogdGhlIGRyb3Bkb3duIG9wZW5zXG4gKiBiZWZvcmUgYW55dGhpbmcgaXMgdHlwZWQsIGFuZCBhbiBlbXB0eSBtZW51IHJlYWRzIGFzIFwibm8gZ2VuZXNcIiByYXRoZXIgdGhhbiBcInN0YXJ0XG4gKiB0eXBpbmdcIi4gTWF0Y2hpbmcgaXMgY2FzZS1pbnNlbnNpdGl2ZSwgYmVjYXVzZSBnZW5lIHN5bWJvbHMgYXJlIGNhcGl0YWxpc2VkIGJ5XG4gKiBjb252ZW50aW9uIGFuZCBub2JvZHkgdHlwZXMgYFNsYzE3YTdgIGV4YWN0bHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWFyY2hHZW5lTmFtZXMobmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdLCBxdWVyeTogc3RyaW5nLCBsaW1pdCA9IEdFTkVfT1BUSU9OU19NQVgpOiBzdHJpbmdbXSB7XG4gIGlmIChsaW1pdCA8PSAwKSByZXR1cm4gW107XG4gIGNvbnN0IHEgPSBxdWVyeS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgaWYgKCFxKSByZXR1cm4gbmFtZXMuc2xpY2UoMCwgbGltaXQpO1xuXG4gIGNvbnN0IHByZWZpeDogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgY29udGFpbnM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgIGNvbnN0IGxvd2VyID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChsb3dlci5zdGFydHNXaXRoKHEpKSB7XG4gICAgICBwcmVmaXgucHVzaChuYW1lKTtcbiAgICAgIC8vIEVub3VnaCBwcmVmaXggbWF0Y2hlcyB0byBmaWxsIHRoZSBsaXN0OiBub3RoaW5nIGEgc3Vic3RyaW5nIG1hdGNoIGNvdWxkIGFkZFxuICAgICAgLy8gd291bGQgb3V0cmFuayB0aGVtLCBzbyB0aGUgcmVzdCBvZiB0aGUgY29ycHVzIGNhbm5vdCBjaGFuZ2UgdGhlIGFuc3dlci5cbiAgICAgIGlmIChwcmVmaXgubGVuZ3RoID49IGxpbWl0KSByZXR1cm4gcHJlZml4O1xuICAgIH0gZWxzZSBpZiAobG93ZXIuaW5jbHVkZXMocSkgJiYgY29udGFpbnMubGVuZ3RoIDwgbGltaXQpIHtcbiAgICAgIGNvbnRhaW5zLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbLi4ucHJlZml4LCAuLi5jb250YWluc10uc2xpY2UoMCwgbGltaXQpO1xufVxuXG4vKipcbiAqIFRoZSBvcHRpb25zIGEgcGlja2VyIHNob3VsZCBzaG93OiB0aGUgYmVzdCBtYXRjaGVzLCBwbHVzIGFueXRoaW5nIGFscmVhZHkgY2hvc2VuLlxuICpcbiAqIEEgbXVsdGktc2VsZWN0IHdob3NlIG9wdGlvbiBsaXN0IGlzIGNhcHBlZCBtdXN0IHN0aWxsIGNhcnJ5IGl0cyBTRUxFQ1RFRCB2YWx1ZXMsIG9yIHRoZVxuICogY29udHJvbCBjYW5ub3QgcmVzb2x2ZSB0aGVtIOKAlCB0aGUgY2hpcHMgbG9zZSB0aGVpciBsYWJlbHMgYW5kLCB3b3JzZSwgYSB2YWx1ZSBhYnNlbnRcbiAqIGZyb20gdGhlIG9wdGlvbnMgY2FuIGJlIGRyb3BwZWQgZnJvbSB0aGUgbW9kZWwgb24gdGhlIG5leHQgY2hhbmdlLiBTZWxlY3Rpb25zIGNvbWVcbiAqIGZpcnN0IHNvIHRoZXkgc3RheSB2aXNpYmxlIHdoaWxlIGEgc2VhcmNoIG5hcnJvd3MgZXZlcnl0aGluZyBlbHNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZU9wdGlvbnNGb3IoXG4gIG5hbWVzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgcXVlcnk6IHN0cmluZyxcbiAgc2VsZWN0ZWQ6IHJlYWRvbmx5IHN0cmluZ1tdID0gW10sXG4gIGxpbWl0ID0gR0VORV9PUFRJT05TX01BWCxcbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgbWF0Y2hlcyA9IHNlYXJjaEdlbmVOYW1lcyhuYW1lcywgcXVlcnksIGxpbWl0KTtcbiAgaWYgKHNlbGVjdGVkLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG1hdGNoZXM7XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0KHNlbGVjdGVkKTtcbiAgcmV0dXJuIFsuLi5zZWxlY3RlZCwgLi4ubWF0Y2hlcy5maWx0ZXIoKG4pID0+ICFzZWVuLmhhcyhuKSldO1xufVxuIl19
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transcript "icon" mode: the marker shapes, and their outlines for the panel's previews.
|
|
3
|
+
* The napari view draws them as napari-js point symbols (`GLYPH_SYMBOLS` in
|
|
4
|
+
* `spatial-tiles/transcript-layers.ts`), with these outlines' proportions.
|
|
5
|
+
*/
|
|
6
|
+
/** Marker shapes for the transcript "icon" mode. */
|
|
7
|
+
export const TRANSCRIPT_GLYPHS = [
|
|
8
|
+
'circle',
|
|
9
|
+
'star',
|
|
10
|
+
'triangle',
|
|
11
|
+
'square',
|
|
12
|
+
'diamond',
|
|
13
|
+
'cross',
|
|
14
|
+
'hexagon',
|
|
15
|
+
'triangle-down',
|
|
16
|
+
'pentagon',
|
|
17
|
+
'x',
|
|
18
|
+
];
|
|
19
|
+
// The view state names glyphs without importing this module; keep the two in step.
|
|
20
|
+
const _glyphNamesMatch = true;
|
|
21
|
+
void _glyphNamesMatch;
|
|
22
|
+
/**
|
|
23
|
+
* Unit outline of a glyph, radius ≈ 1, centred on the origin, as `[x0, y0, x1, y1, …]` — the
|
|
24
|
+
* panel's preview of the point symbol the canvas draws.
|
|
25
|
+
*/
|
|
26
|
+
export function glyphOutline(glyph) {
|
|
27
|
+
const poly = (n, rot = -Math.PI / 2, r = 1) => {
|
|
28
|
+
const out = new Float32Array(n * 2);
|
|
29
|
+
for (let i = 0; i < n; i++) {
|
|
30
|
+
const a = rot + (i * 2 * Math.PI) / n;
|
|
31
|
+
out[2 * i] = Math.cos(a) * r;
|
|
32
|
+
out[2 * i + 1] = Math.sin(a) * r;
|
|
33
|
+
}
|
|
34
|
+
return out;
|
|
35
|
+
};
|
|
36
|
+
const star = (points, inner, rot = -Math.PI / 2) => {
|
|
37
|
+
const out = new Float32Array(points * 4);
|
|
38
|
+
for (let i = 0; i < points * 2; i++) {
|
|
39
|
+
const a = rot + (i * Math.PI) / points;
|
|
40
|
+
const r = i % 2 === 0 ? 1 : inner;
|
|
41
|
+
out[2 * i] = Math.cos(a) * r;
|
|
42
|
+
out[2 * i + 1] = Math.sin(a) * r;
|
|
43
|
+
}
|
|
44
|
+
return out;
|
|
45
|
+
};
|
|
46
|
+
// A plus built as a 12-gon: arms of half-width w.
|
|
47
|
+
const plus = (w, rotate) => {
|
|
48
|
+
const pts = [
|
|
49
|
+
[w, -1],
|
|
50
|
+
[w, -w],
|
|
51
|
+
[1, -w],
|
|
52
|
+
[1, w],
|
|
53
|
+
[w, w],
|
|
54
|
+
[w, 1],
|
|
55
|
+
[-w, 1],
|
|
56
|
+
[-w, w],
|
|
57
|
+
[-1, w],
|
|
58
|
+
[-1, -w],
|
|
59
|
+
[-w, -w],
|
|
60
|
+
[-w, -1],
|
|
61
|
+
];
|
|
62
|
+
const out = new Float32Array(pts.length * 2);
|
|
63
|
+
const c = Math.SQRT1_2;
|
|
64
|
+
pts.forEach(([x, y], i) => {
|
|
65
|
+
out[2 * i] = rotate ? (x - y) * c : x;
|
|
66
|
+
out[2 * i + 1] = rotate ? (x + y) * c : y;
|
|
67
|
+
});
|
|
68
|
+
return out;
|
|
69
|
+
};
|
|
70
|
+
switch (glyph) {
|
|
71
|
+
case 'circle':
|
|
72
|
+
return poly(12);
|
|
73
|
+
case 'star':
|
|
74
|
+
return star(5, 0.45);
|
|
75
|
+
case 'triangle':
|
|
76
|
+
return poly(3);
|
|
77
|
+
case 'triangle-down':
|
|
78
|
+
return poly(3, Math.PI / 2);
|
|
79
|
+
case 'square':
|
|
80
|
+
return poly(4, Math.PI / 4, Math.SQRT2 * 0.8);
|
|
81
|
+
case 'diamond':
|
|
82
|
+
return poly(4, -Math.PI / 2);
|
|
83
|
+
case 'hexagon':
|
|
84
|
+
return poly(6, 0);
|
|
85
|
+
case 'pentagon':
|
|
86
|
+
return poly(5);
|
|
87
|
+
case 'cross':
|
|
88
|
+
return plus(0.32, false);
|
|
89
|
+
case 'x':
|
|
90
|
+
return plus(0.28, true);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/** The glyph a gene gets by default: by its position in the selected list. */
|
|
94
|
+
export function defaultGlyphFor(slot) {
|
|
95
|
+
return TRANSCRIPT_GLYPHS[slot % TRANSCRIPT_GLYPHS.length];
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2x5cGhzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zcGF0aWFsL2dseXBocy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBSUgsb0RBQW9EO0FBQ3BELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHO0lBQy9CLFFBQVE7SUFDUixNQUFNO0lBQ04sVUFBVTtJQUNWLFFBQVE7SUFDUixTQUFTO0lBQ1QsT0FBTztJQUNQLFNBQVM7SUFDVCxlQUFlO0lBQ2YsVUFBVTtJQUNWLEdBQUc7Q0FDSyxDQUFDO0FBR1gsbUZBQW1GO0FBQ25GLE1BQU0sZ0JBQWdCLEdBSVYsSUFBSSxDQUFDO0FBQ2pCLEtBQUssZ0JBQWdCLENBQUM7QUFFdEI7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxLQUFzQjtJQUNqRCxNQUFNLElBQUksR0FBRyxDQUFDLENBQVMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUU7UUFDcEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMzQixNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdEMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3QixHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMs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QUssTUFBTTtZQUNULE9BQU8sSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN2QixLQUFLLFVBQVU7WUFDYixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQixLQUFLLGVBQWU7WUFDbEIsT0FBTyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDOUIsS0FBSyxRQUFRO1lBQ1gsT0FBTyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDaEQsS0FBSyxTQUFTO1lBQ1osT0FBTyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMvQixLQUFLLFNBQVM7WUFDWixPQUFPLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEIsS0FBSyxVQUFVO1lBQ2IsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakIsS0FBSyxPQUFPO1lBQ1YsT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNCLEtBQUssR0FBRztZQUNOLE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM1QixDQUFDO0FBQ0gsQ0FBQztBQUVELDhFQUE4RTtBQUM5RSxNQUFNLFVBQVUsZUFBZSxDQUFDLElBQVk7SUFDMUMsT0FBTyxpQkFBaUIsQ0FBQyxJQUFJLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDNUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVHJhbnNjcmlwdCBcImljb25cIiBtb2RlOiB0aGUgbWFya2VyIHNoYXBlcywgYW5kIHRoZWlyIG91dGxpbmVzIGZvciB0aGUgcGFuZWwncyBwcmV2aWV3cy5cbiAqIFRoZSBuYXBhcmkgdmlldyBkcmF3cyB0aGVtIGFzIG5hcGFyaS1qcyBwb2ludCBzeW1ib2xzIChgR0xZUEhfU1lNQk9MU2AgaW5cbiAqIGBzcGF0aWFsLXRpbGVzL3RyYW5zY3JpcHQtbGF5ZXJzLnRzYCksIHdpdGggdGhlc2Ugb3V0bGluZXMnIHByb3BvcnRpb25zLlxuICovXG5cbmltcG9ydCB0eXBlIHsgVHJhbnNjcmlwdEdseXBoTmFtZSB9IGZyb20gJy4uL2NvbnRyYWN0cy9kaXNwbGF5LXR5cGVzJztcblxuLyoqIE1hcmtlciBzaGFwZXMgZm9yIHRoZSB0cmFuc2NyaXB0IFwiaWNvblwiIG1vZGUuICovXG5leHBvcnQgY29uc3QgVFJBTlNDUklQVF9HTFlQSFMgPSBbXG4gICdjaXJjbGUnLFxuICAnc3RhcicsXG4gICd0cmlhbmdsZScsXG4gICdzcXVhcmUnLFxuICAnZGlhbW9uZCcsXG4gICdjcm9zcycsXG4gICdoZXhhZ29uJyxcbiAgJ3RyaWFuZ2xlLWRvd24nLFxuICAncGVudGFnb24nLFxuICAneCcsXG5dIGFzIGNvbnN0O1xuLyoqIE9uZSBvZiB0aGUgbWFya2VyIHNoYXBlcyBpbiB7QGxpbmsgVFJBTlNDUklQVF9HTFlQSFN9LiAqL1xuZXhwb3J0IHR5cGUgVHJhbnNjcmlwdEdseXBoID0gKHR5cGVvZiBUUkFOU0NSSVBUX0dMWVBIUylbbnVtYmVyXTtcbi8vIFRoZSB2aWV3IHN0YXRlIG5hbWVzIGdseXBocyB3aXRob3V0IGltcG9ydGluZyB0aGlzIG1vZHVsZTsga2VlcCB0aGUgdHdvIGluIHN0ZXAuXG5jb25zdCBfZ2x5cGhOYW1lc01hdGNoOiBUcmFuc2NyaXB0R2x5cGggZXh0ZW5kcyBUcmFuc2NyaXB0R2x5cGhOYW1lXG4gID8gVHJhbnNjcmlwdEdseXBoTmFtZSBleHRlbmRzIFRyYW5zY3JpcHRHbHlwaFxuICAgID8gdHJ1ZVxuICAgIDogbmV2ZXJcbiAgOiBuZXZlciA9IHRydWU7XG52b2lkIF9nbHlwaE5hbWVzTWF0Y2g7XG5cbi8qKlxuICogVW5pdCBvdXRsaW5lIG9mIGEgZ2x5cGgsIHJhZGl1cyDiiYggMSwgY2VudHJlZCBvbiB0aGUgb3JpZ2luLCBhcyBgW3gwLCB5MCwgeDEsIHkxLCDigKZdYCDigJQgdGhlXG4gKiBwYW5lbCdzIHByZXZpZXcgb2YgdGhlIHBvaW50IHN5bWJvbCB0aGUgY2FudmFzIGRyYXdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2x5cGhPdXRsaW5lKGdseXBoOiBUcmFuc2NyaXB0R2x5cGgpOiBGbG9hdDMyQXJyYXkge1xuICBjb25zdCBwb2x5ID0gKG46IG51bWJlciwgcm90ID0gLU1hdGguUEkgLyAyLCByID0gMSkgPT4ge1xuICAgIGNvbnN0IG91dCA9IG5ldyBGbG9hdDMyQXJyYXkobiAqIDIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICBjb25zdCBhID0gcm90ICsgKGkgKiAyICogTWF0aC5QSSkgLyBuO1xuICAgICAgb3V0WzIgKiBpXSA9IE1hdGguY29zKGEpICogcjtcbiAgICAgIG91dFsyICogaSArIDFdID0gTWF0aC5zaW4oYSkgKiByO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9O1xuICBjb25zdCBzdGFyID0gKHBvaW50czogbnVtYmVyLCBpbm5lcjogbnVtYmVyLCByb3QgPSAtTWF0aC5QSSAvIDIpID0+IHtcbiAgICBjb25zdCBvdXQgPSBuZXcgRmxvYXQzMkFycmF5KHBvaW50cyAqIDQpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzICogMjsgaSsrKSB7XG4gICAgICBjb25zdCBhID0gcm90ICsgKGkgKiBNYXRoLlBJKSAvIHBvaW50cztcbiAgICAgIGNvbnN0IHIgPSBpICUgMiA9PT0gMCA/IDEgOiBpbm5lcjtcbiAgICAgIG91dFsyICogaV0gPSBNYXRoLmNvcyhhKSAqIHI7XG4gICAgICBvdXRbMiAqIGkgKyAxXSA9IE1hdGguc2luKGEpICogcjtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfTtcbiAgLy8gQSBwbHVzIGJ1aWx0IGFzIGEgMTItZ29uOiBhcm1zIG9mIGhhbGYtd2lkdGggdy5cbiAgY29uc3QgcGx1cyA9ICh3OiBudW1iZXIsIHJvdGF0ZTogYm9vbGVhbikgPT4ge1xuICAgIGNvbnN0IHB0cyA9IFtcbiAgICAgIFt3LCAtMV0sXG4gICAgICBbdywgLXddLFxuICAgICAgWzEsIC13XSxcbiAgICAgIFsxLCB3XSxcbiAgICAgIFt3LCB3XSxcbiAgICAgIFt3LCAxXSxcbiAgICAgIFstdywgMV0sXG4gICAgICBbLXcsIHddLFxuICAgICAgWy0xLCB3XSxcbiAgICAgIFstMSwgLXddLFxuICAgICAgWy13LCAtd10sXG4gICAgICBbLXcsIC0xXSxcbiAgICBdO1xuICAgIGNvbnN0IG91dCA9IG5ldyBGbG9hdDMyQXJyYXkocHRzLmxlbmd0aCAqIDIpO1xuICAgIGNvbnN0IGMgPSBNYXRoLlNRUlQxXzI7XG4gICAgcHRzLmZvckVhY2goKFt4LCB5XSwgaSkgPT4ge1xuICAgICAgb3V0WzIgKiBpXSA9IHJvdGF0ZSA/ICh4IC0geSkgKiBjIDogeDtcbiAgICAgIG91dFsyICogaSArIDFdID0gcm90YXRlID8gKHggKyB5KSAqIGMgOiB5O1xuICAgIH0pO1xuICAgIHJldHVybiBvdXQ7XG4gIH07XG4gIHN3aXRjaCAoZ2x5cGgpIHtcbiAgICBjYXNlICdjaXJjbGUnOlxuICAgICAgcmV0dXJuIHBvbHkoMTIpO1xuICAgIGNhc2UgJ3N0YXInOlxuICAgICAgcmV0dXJuIHN0YXIoNSwgMC40NSk7XG4gICAgY2FzZSAndHJpYW5nbGUnOlxuICAgICAgcmV0dXJuIHBvbHkoMyk7XG4gICAgY2FzZSAndHJpYW5nbGUtZG93bic6XG4gICAgICByZXR1cm4gcG9seSgzLCBNYXRoLlBJIC8gMik7XG4gICAgY2FzZSAnc3F1YXJlJzpcbiAgICAgIHJldHVybiBwb2x5KDQsIE1hdGguUEkgLyA0LCBNYXRoLlNRUlQyICogMC44KTtcbiAgICBjYXNlICdkaWFtb25kJzpcbiAgICAgIHJldHVybiBwb2x5KDQsIC1NYXRoLlBJIC8gMik7XG4gICAgY2FzZSAnaGV4YWdvbic6XG4gICAgICByZXR1cm4gcG9seSg2LCAwKTtcbiAgICBjYXNlICdwZW50YWdvbic6XG4gICAgICByZXR1cm4gcG9seSg1KTtcbiAgICBjYXNlICdjcm9zcyc6XG4gICAgICByZXR1cm4gcGx1cygwLjMyLCBmYWxzZSk7XG4gICAgY2FzZSAneCc6XG4gICAgICByZXR1cm4gcGx1cygwLjI4LCB0cnVlKTtcbiAgfVxufVxuXG4vKiogVGhlIGdseXBoIGEgZ2VuZSBnZXRzIGJ5IGRlZmF1bHQ6IGJ5IGl0cyBwb3NpdGlvbiBpbiB0aGUgc2VsZWN0ZWQgbGlzdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0R2x5cGhGb3Ioc2xvdDogbnVtYmVyKTogVHJhbnNjcmlwdEdseXBoIHtcbiAgcmV0dXJuIFRSQU5TQ1JJUFRfR0xZUEhTW3Nsb3QgJSBUUkFOU0NSSVBUX0dMWVBIUy5sZW5ndGhdO1xufVxuIl19
|