@jax-data-science/sci-image-visualizer 0.8.2 → 0.9.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 +28 -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/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/sam.contract.mjs +1 -1
- 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/raster.mjs +98 -0
- package/esm2022/lib/geometry/ring.mjs +201 -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 +3 -4
- package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +66 -0
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +157 -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 +263 -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 +344 -0
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +361 -4184
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +439 -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 +182 -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 +153 -0
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +185 -718
- 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 +118 -0
- package/esm2022/lib/models/region-clone.mjs +68 -0
- package/esm2022/lib/models/region-geojson.mjs +373 -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/classes-panel/classes-panel.component.mjs +99 -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 +402 -651
- package/esm2022/lib/region-editor/region-metrics.mjs +68 -0
- package/esm2022/lib/region-editor/region-persistence.service.mjs +134 -0
- package/esm2022/lib/region-editor/region-table/region-table.component.mjs +153 -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/svg-region-renderer.mjs +228 -0
- package/esm2022/lib/render-orchestrator.mjs +14 -11
- package/esm2022/lib/render-session.mjs +207 -0
- package/esm2022/lib/routing-visualizer.service.mjs +459 -411
- 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 +46 -3
- package/esm2022/lib/store/region-history.mjs +146 -0
- package/esm2022/lib/store/region-scope-cache.mjs +140 -0
- package/esm2022/lib/store/region-selection.mjs +82 -0
- package/esm2022/lib/store/region-store.service.mjs +279 -675
- package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
- package/esm2022/lib/store/visualizer-store.service.mjs +49 -71
- 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 +114 -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 +81 -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 +68 -117
- 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 +60 -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.component.mjs +480 -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-Csxlnq7I.mjs +41083 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs +238 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.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 -34430
- 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/spatial-math.worker.js +471 -0
- package/fesm2022/tsne.worker.js +32 -15
- package/index.d.ts +13 -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/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 +1 -1
- package/lib/contracts/region-overlay.contract.d.ts +5 -0
- package/lib/contracts/sam.contract.d.ts +7 -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 +221 -54
- package/lib/contracts/viz-config.d.ts +1 -0
- package/lib/geometry/contour.d.ts +24 -0
- package/lib/geometry/raster.d.ts +42 -0
- package/lib/geometry/ring.d.ts +67 -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 +0 -1
- package/lib/implementations/napari-js/napari-loading-state.d.ts +30 -0
- package/lib/implementations/napari-js/napari-region-overlay.d.ts +62 -70
- package/lib/implementations/napari-js/napari-scene.d.ts +93 -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 +89 -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 +121 -878
- package/lib/implementations/napari-js/napari-volume-scene.d.ts +104 -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 +37 -0
- package/lib/implementations/osd/osd-region-overlay.d.ts +36 -48
- 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 +80 -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 +18 -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 +40 -0
- package/lib/models/region-clone.d.ts +20 -0
- package/lib/models/region-geojson.d.ts +17 -0
- package/lib/models/region.d.ts +40 -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/classes-panel/classes-panel.component.d.ts +56 -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 +166 -199
- package/lib/region-editor/region-metrics.d.ts +26 -0
- package/lib/region-editor/region-persistence.service.d.ts +69 -0
- package/lib/region-editor/region-table/region-table.component.d.ts +83 -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 +157 -0
- package/lib/region-overlay/region-hit-test.d.ts +38 -0
- package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
- package/lib/render-orchestrator.d.ts +6 -2
- package/lib/render-session.d.ts +75 -0
- package/lib/routing-visualizer.service.d.ts +110 -58
- 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 +35 -1
- package/lib/store/region-history.d.ts +66 -0
- package/lib/store/region-scope-cache.d.ts +63 -0
- package/lib/store/region-selection.d.ts +36 -0
- package/lib/store/region-store.service.d.ts +104 -112
- package/lib/store/visualizer-store.service.d.ts +22 -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 +60 -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 +40 -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 +47 -83
- 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 +27 -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.component.d.ts +201 -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/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
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { pointInRing as ringContainsPoint, ringBounds } from '../geometry/ring';
|
|
1
2
|
/** An empty selection over `count` observations. */
|
|
2
3
|
export function emptySelection(count = 0) {
|
|
3
4
|
return { mask: new Uint8Array(count), count: 0 };
|
|
@@ -32,35 +33,14 @@ export function mutedFromSelection(selection) {
|
|
|
32
33
|
muted[i] = selection.mask[i] ? 0 : 1;
|
|
33
34
|
return muted;
|
|
34
35
|
}
|
|
35
|
-
/**
|
|
36
|
+
/**
|
|
37
|
+
* Even-odd ray cast: is (px, py) inside the closed ring xs/ys?
|
|
38
|
+
*
|
|
39
|
+
* Public API kept with its (ring, point) argument order; the test itself is
|
|
40
|
+
* the shared `geometry/ring` one the region overlays and tools use.
|
|
41
|
+
*/
|
|
36
42
|
export function pointInRing(xs, ys, px, py) {
|
|
37
|
-
|
|
38
|
-
const n = xs.length;
|
|
39
|
-
for (let i = 0, j = n - 1; i < n; j = i++) {
|
|
40
|
-
const yi = ys[i];
|
|
41
|
-
const yj = ys[j];
|
|
42
|
-
// Half-open comparison so a vertex on the ray is counted once, not twice.
|
|
43
|
-
if ((yi > py) !== (yj > py)) {
|
|
44
|
-
const t = (py - yi) / (yj - yi);
|
|
45
|
-
if (px < xs[i] + t * (xs[j] - xs[i]))
|
|
46
|
-
inside = !inside;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
return inside;
|
|
50
|
-
}
|
|
51
|
-
function ringBounds(xs, ys) {
|
|
52
|
-
let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
|
|
53
|
-
for (let i = 0; i < xs.length; i++) {
|
|
54
|
-
if (xs[i] < minX)
|
|
55
|
-
minX = xs[i];
|
|
56
|
-
if (xs[i] > maxX)
|
|
57
|
-
maxX = xs[i];
|
|
58
|
-
if (ys[i] < minY)
|
|
59
|
-
minY = ys[i];
|
|
60
|
-
if (ys[i] > maxY)
|
|
61
|
-
maxY = ys[i];
|
|
62
|
-
}
|
|
63
|
-
return { minX, minY, maxX, maxY };
|
|
43
|
+
return ringContainsPoint(px, py, xs, ys);
|
|
64
44
|
}
|
|
65
45
|
function inBounds(b, px, py) {
|
|
66
46
|
return px >= b.minX && px <= b.maxX && py >= b.minY && py <= b.maxY;
|
|
@@ -70,6 +50,15 @@ function polygonShape(xs, ys, holes) {
|
|
|
70
50
|
if (xs.length < 3)
|
|
71
51
|
return null;
|
|
72
52
|
const bounds = ringBounds(xs, ys);
|
|
53
|
+
// Split and bounded ONCE per shape: the hit test runs for every candidate point
|
|
54
|
+
// inside the exterior — up to millions of cells per selection.
|
|
55
|
+
const holeRings = (holes ?? [])
|
|
56
|
+
.filter((ring) => ring.length >= 3)
|
|
57
|
+
.map((ring) => {
|
|
58
|
+
const hx = ring.map((p) => p[0]);
|
|
59
|
+
const hy = ring.map((p) => p[1]);
|
|
60
|
+
return { xs: hx, ys: hy, bounds: ringBounds(hx, hy) };
|
|
61
|
+
});
|
|
73
62
|
return {
|
|
74
63
|
bounds,
|
|
75
64
|
hit: (px, py) => {
|
|
@@ -77,11 +66,9 @@ function polygonShape(xs, ys, holes) {
|
|
|
77
66
|
return false;
|
|
78
67
|
// The region model is explicit: a point inside the exterior AND inside a
|
|
79
68
|
// hole is OUTSIDE the region.
|
|
80
|
-
for (const
|
|
81
|
-
if (
|
|
82
|
-
&& pointInRing(ring.map((p) => p[0]), ring.map((p) => p[1]), px, py)) {
|
|
69
|
+
for (const hole of holeRings) {
|
|
70
|
+
if (inBounds(hole.bounds, px, py) && pointInRing(hole.xs, hole.ys, px, py))
|
|
83
71
|
return false;
|
|
84
|
-
}
|
|
85
72
|
}
|
|
86
73
|
return true;
|
|
87
74
|
},
|
|
@@ -123,18 +110,6 @@ export function regionShapes(region) {
|
|
|
123
110
|
}
|
|
124
111
|
return [];
|
|
125
112
|
}
|
|
126
|
-
/**
|
|
127
|
-
* Observations inside ANY of `regions` (union). Coordinates are transformed by
|
|
128
|
-
* `imageRef` first, so the test happens in the same world space the regions were
|
|
129
|
-
* drawn in.
|
|
130
|
-
*
|
|
131
|
-
* `candidates`, when given, restricts the test to those observation indices — how
|
|
132
|
-
* a 2D view of a 3D dataset keeps a drawn region meaning what it looks like it
|
|
133
|
-
* means: the shape was drawn over ONE section, so it selects that section's cells
|
|
134
|
-
* rather than the whole depth of the specimen behind them. The returned mask stays
|
|
135
|
-
* indexed by observation, so every consumer (charts, legend, the 3D cloud) reads it
|
|
136
|
-
* the same way.
|
|
137
|
-
*/
|
|
138
113
|
/**
|
|
139
114
|
* A selection from an explicit list of observation indices.
|
|
140
115
|
*
|
|
@@ -157,6 +132,18 @@ export function selectByIndices(indices, observationCount) {
|
|
|
157
132
|
}
|
|
158
133
|
return { mask, count };
|
|
159
134
|
}
|
|
135
|
+
/**
|
|
136
|
+
* Observations inside ANY of `regions` (union). Coordinates are transformed by
|
|
137
|
+
* `imageRef` first, so the test happens in the same world space the regions were
|
|
138
|
+
* drawn in.
|
|
139
|
+
*
|
|
140
|
+
* `candidates`, when given, restricts the test to those observation indices — how
|
|
141
|
+
* a 2D view of a 3D dataset keeps a drawn region meaning what it looks like it
|
|
142
|
+
* means: the shape was drawn over ONE section, so it selects that section's cells
|
|
143
|
+
* rather than the whole depth of the specimen behind them. The returned mask stays
|
|
144
|
+
* indexed by observation, so every consumer (charts, legend, the 3D cloud) reads it
|
|
145
|
+
* the same way.
|
|
146
|
+
*/
|
|
160
147
|
export function selectInRegions(observations, imageRef, regions, candidates) {
|
|
161
148
|
const n = observations.count;
|
|
162
149
|
const mask = new Uint8Array(n);
|
|
@@ -228,7 +215,6 @@ export function selectInRegionsProjected(screen, count, regions) {
|
|
|
228
215
|
}
|
|
229
216
|
return { mask, count: hits };
|
|
230
217
|
}
|
|
231
|
-
/** Every observation whose categorical code equals `code` — the legend click. */
|
|
232
218
|
/**
|
|
233
219
|
* Whether two selections hold exactly the same observations.
|
|
234
220
|
*
|
|
@@ -250,6 +236,7 @@ export function sameSelection(a, b) {
|
|
|
250
236
|
}
|
|
251
237
|
return true;
|
|
252
238
|
}
|
|
239
|
+
/** Every observation whose categorical code equals `code` — the legend click. */
|
|
253
240
|
export function selectByCategory(codes, code) {
|
|
254
241
|
const mask = new Uint8Array(codes.length);
|
|
255
242
|
let count = 0;
|
|
@@ -261,4 +248,4 @@ export function selectByCategory(codes, code) {
|
|
|
261
248
|
}
|
|
262
249
|
return { mask, count };
|
|
263
250
|
}
|
|
264
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1zZWxlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NwYXRpYWwvc3BhdGlhbC1zZWxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBNkJBLG9EQUFvRDtBQUNwRCxNQUFNLFVBQVUsY0FBYyxDQUFDLEtBQUssR0FBRyxDQUFDO0lBQ3RDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ25ELENBQUM7QUFFRCx1Q0FBdUM7QUFDdkMsTUFBTSxVQUFVLFNBQVMsQ0FBQyxJQUFnQjtJQUN4QyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDVixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7UUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7WUFBRSxDQUFDLEVBQUUsQ0FBQztJQUN2RCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFFRCwwREFBMEQ7QUFDMUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxJQUFnQjtJQUM1QyxNQUFNLEdBQUcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM3QyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDWCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7UUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7WUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxTQUErQjtJQUNoRSxJQUFJ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b3J0IHsgU3BhdGlhbEltYWdlUmVmLCBTcGF0aWFsT2JzZXJ2YXRpb25zIH0gZnJvbSAnLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5cbi8qKlxuICogV2hpY2ggb2JzZXJ2YXRpb25zIGZhbGwgaW5zaWRlIGEgc2V0IG9mIGRyYXduIHJlZ2lvbnMuXG4gKlxuICogUHVyZSwgbGlrZSBgc3BhdGlhbC1lbmNvZGluZy50c2Ag4oCUIG5vIHN0b3JlLCBubyByZW5kZXJlciDigJQgc28gdGhlIGdlb21ldHJ5IGlzXG4gKiB0ZXN0YWJsZSBvbiBpdHMgb3duLlxuICpcbiAqIFdIWSBUSElTIElTIFRIRSBXSE9MRSBTRUxFQ1RJT04gTUVDSEFOSVNNXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogUmVnaW9ucyBhbHJlYWR5IGNvbWUgZnJvbSBldmVyeSBvbi1jYW52YXMgdG9vbCB0aGUgbGlicmFyeSBoYXM6IHJlY3RhbmdsZSxcbiAqIHBvbHlnb24sIGZyZWVoYW5kLCBtYWdpYyB3YW5kLCBicnVzaC4gVGVzdGluZyBvYnNlcnZhdGlvbnMgYWdhaW5zdCB0aGVtIHR1cm5zXG4gKiBhbGwgb2YgdGhvc2UgaW50byBzcGF0aWFsLW9taWNzIHNlbGVjdGlvbiB0b29scyB3aXRob3V0IGFkZGluZyBhIHNpbmdsZSBuZXdcbiAqIGNhbnZhcyBpbnRlcmFjdGlvbiDigJQgd2hpY2ggaXMgd2h5IHRoZXJlIGlzIG5vIGJlc3Bva2UgbWFycXVlZSBoZXJlLlxuICpcbiAqIENPT1JESU5BVEUgRlJBTUVTXG4gKiAtLS0tLS0tLS0tLS0tLS0tLVxuICogUmVnaW9ucyBhcmUgZHJhd24gaW4gV09STEQgKGltYWdlKSBjb29yZGluYXRlcy4gT2JzZXJ2YXRpb25zIGxpdmUgaW4gdGhlXG4gKiBkYXRhc2V0J3Mgb3duIGZyYW1lIGFuZCByZWFjaCB0aGUgd29ybGQgdGhyb3VnaCBgaW1hZ2VSZWZgIOKAlCBzbyB0aGV5IGFyZVxuICogdHJhbnNmb3JtZWQgZm9yd2FyZCBiZWZvcmUgdGVzdGluZywgbWF0Y2hpbmcgZXhhY3RseSB3aGF0IHRoZSByZW5kZXJlciBkcmF3cy5cbiAqL1xuXG4vKiogQSBzZWxlY3Rpb24gb3ZlciBOIG9ic2VydmF0aW9uczogYG1hc2tbaV0gPT09IDFgIHdoZW4gaSBpcyBzZWxlY3RlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BhdGlhbFNlbGVjdGlvbk1hc2sge1xuICBtYXNrOiBVaW50OEFycmF5O1xuICBjb3VudDogbnVtYmVyO1xufVxuXG4vKiogQW4gZW1wdHkgc2VsZWN0aW9uIG92ZXIgYGNvdW50YCBvYnNlcnZhdGlvbnMuICovXG5leHBvcnQgZnVuY3Rpb24gZW1wdHlTZWxlY3Rpb24oY291bnQgPSAwKTogU3BhdGlhbFNlbGVjdGlvbk1hc2sge1xuICByZXR1cm4geyBtYXNrOiBuZXcgVWludDhBcnJheShjb3VudCksIGNvdW50OiAwIH07XG59XG5cbi8qKiBOdW1iZXIgb2Ygc2V0IGVudHJpZXMgaW4gYSBtYXNrLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvdW50TWFzayhtYXNrOiBVaW50OEFycmF5KTogbnVtYmVyIHtcbiAgbGV0IG4gPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG1hc2subGVuZ3RoOyBpKyspIGlmIChtYXNrW2ldKSBuKys7XG4gIHJldHVybiBuO1xufVxuXG4vKiogU2VsZWN0ZWQgaW5kaWNlcywgZm9yIGV4cG9ydCBvciBhIGRvd25zdHJlYW0gcXVlcnkuICovXG5leHBvcnQgZnVuY3Rpb24gbWFza1RvSW5kaWNlcyhtYXNrOiBVaW50OEFycmF5KTogVWludDMyQXJyYXkge1xuICBjb25zdCBvdXQgPSBuZXcgVWludDMyQXJyYXkoY291bnRNYXNrKG1hc2spKTtcbiAgbGV0IGF0ID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXNrLmxlbmd0aDsgaSsrKSBpZiAobWFza1tpXSkgb3V0W2F0KytdID0gaTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBSZW5kZXJlci1mYWNpbmcgaW52ZXJzZTogd2hpY2ggb2JzZXJ2YXRpb25zIHRvIE1VVEUuIFdpdGggbm90aGluZyBzZWxlY3RlZFxuICogbm90aGluZyBpcyBtdXRlZCAodGhlIHdob2xlIHRpc3N1ZSByZWFkcyBub3JtYWxseSk7IHdpdGggYSBzZWxlY3Rpb24sIGV2ZXJ5XG4gKiB1bnNlbGVjdGVkIG9ic2VydmF0aW9uIGlzIG11dGVkIOKAlCB0aGUgQ29zTXggaGlnaGxpZ2h0LXZzLW11dGUgcnVsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG11dGVkRnJvbVNlbGVjdGlvbihzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrKTogVWludDhBcnJheSB8IG51bGwge1xuICBpZiAoc2VsZWN0aW9uLmNvdW50ID09PSAwKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgbXV0ZWQgPSBuZXcgVWludDhBcnJheShzZWxlY3Rpb24ubWFzay5sZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG11dGVkLmxlbmd0aDsgaSsrKSBtdXRlZFtpXSA9IHNlbGVjdGlvbi5tYXNrW2ldID8gMCA6IDE7XG4gIHJldHVybiBtdXRlZDtcbn1cblxuLyoqIEV2ZW4tb2RkIHJheSBjYXN0OiBpcyAocHgsIHB5KSBpbnNpZGUgdGhlIGNsb3NlZCByaW5nIHhzL3lzPyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvaW50SW5SaW5nKHhzOiByZWFkb25seSBudW1iZXJbXSwgeXM6IHJlYWRvbmx5IG51bWJlcltdLCBweDogbnVtYmVyLCBweTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIGxldCBpbnNpZGUgPSBmYWxzZTtcbiAgY29uc3QgbiA9IHhzLmxlbmd0aDtcbiAgZm9yIChsZXQgaSA9IDAsIGogPSBuIC0gMTsgaSA8IG47IGogPSBpKyspIHtcbiAgICBjb25zdCB5aSA9IHlzW2ldO1xuICAgIGNvbnN0IHlqID0geXNbal07XG4gICAgLy8gSGFsZi1vcGVuIGNvbXBhcmlzb24gc28gYSB2ZXJ0ZXggb24gdGhlIHJheSBpcyBjb3VudGVkIG9uY2UsIG5vdCB0d2ljZS5cbiAgICBpZiAoKHlpID4gcHkpICE9PSAoeWogPiBweSkpIHtcbiAgICAgIGNvbnN0IHQgPSAocHkgLSB5aSkgLyAoeWogLSB5aSk7XG4gICAgICBpZiAocHggPCB4c1tpXSArIHQgKiAoeHNbal0gLSB4c1tpXSkpIGluc2lkZSA9ICFpbnNpZGU7XG4gICAgfVxuICB9XG4gIHJldHVybiBpbnNpZGU7XG59XG5cbi8qKiBBeGlzLWFsaWduZWQgYm91bmRzIG9mIGEgcmluZywgZm9yIGEgY2hlYXAgcmVqZWN0IGJlZm9yZSB0aGUgcmF5IGNhc3QuICovXG5pbnRlcmZhY2UgQm91bmRzIHsgbWluWDogbnVtYmVyOyBtaW5ZOiBudW1iZXI7IG1heFg6IG51bWJlcjsgbWF4WTogbnVtYmVyIH1cblxuZnVuY3Rpb24gcmluZ0JvdW5kcyh4czogcmVhZG9ubHkgbnVtYmVyW10sIHlzOiByZWFkb25seSBudW1iZXJbXSk6IEJvdW5kcyB7XG4gIGxldCBtaW5YID0gSW5maW5pdHksIG1pblkgPSBJbmZpbml0eSwgbWF4WCA9IC1JbmZpbml0eSwgbWF4WSA9IC1JbmZpbml0eTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkrKykge1xuICAgIGlmICh4c1tpXSA8IG1pblgpIG1pblggPSB4c1tpXTtcbiAgICBpZiAoeHNbaV0gPiBtYXhYKSBtYXhYID0geHNbaV07XG4gICAgaWYgKHlzW2ldIDwgbWluWSkgbWluWSA9IHlzW2ldO1xuICAgIGlmICh5c1tpXSA+IG1heFkpIG1heFkgPSB5c1tpXTtcbiAgfVxuICByZXR1cm4geyBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZIH07XG59XG5cbmZ1bmN0aW9uIGluQm91bmRzKGI6IEJvdW5kcywgcHg6IG51bWJlciwgcHk6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gcHggPj0gYi5taW5YICYmIHB4IDw9IGIubWF4WCAmJiBweSA+PSBiLm1pblkgJiYgcHkgPD0gYi5tYXhZO1xufVxuXG4vKiogQSByZWdpb24gZmxhdHRlbmVkIHRvIHNvbWV0aGluZyB0ZXN0YWJsZTogYm91bmRzICsgYSBoaXQgdGVzdC4gKi9cbmludGVyZmFjZSBTaGFwZSB7XG4gIGJvdW5kczogQm91bmRzO1xuICBoaXQocHg6IG51bWJlciwgcHk6IG51bWJlcik6IGJvb2xlYW47XG59XG5cbi8qKiBQb2x5Z29uLXdpdGgtaG9sZXM6IGluc2lkZSB0aGUgZXh0ZXJpb3IgYW5kIG91dHNpZGUgZXZlcnkgaG9sZS4gKi9cbmZ1bmN0aW9uIHBvbHlnb25TaGFwZShcbiAgeHM6IG51bWJlcltdLCB5czogbnVtYmVyW10sIGhvbGVzPzogbnVtYmVyW11bXVtdLFxuKTogU2hhcGUgfCBudWxsIHtcbiAgaWYgKHhzLmxlbmd0aCA8IDMpIHJldHVybiBudWxsO1xuICBjb25zdCBib3VuZHMgPSByaW5nQm91bmRzKHhzLCB5cyk7XG4gIHJldHVybiB7XG4gICAgYm91bmRzLFxuICAgIGhpdDogKHB4LCBweSkgPT4ge1xuICAgICAgaWYgKCFwb2ludEluUmluZyh4cywgeXMsIHB4LCBweSkpIHJldHVybiBmYWxzZTtcbiAgICAgIC8vIFRoZSByZWdpb24gbW9kZWwgaXMgZXhwbGljaXQ6IGEgcG9pbnQgaW5zaWRlIHRoZSBleHRlcmlvciBBTkQgaW5zaWRlIGFcbiAgICAgIC8vIGhvbGUgaXMgT1VUU0lERSB0aGUgcmVnaW9uLlxuICAgICAgZm9yIChjb25zdCByaW5nIG9mIGhvbGVzID8/IFtdKSB7XG4gICAgICAgIGlmIChyaW5nLmxlbmd0aCA+PSAzXG4gICAgICAgICAgJiYgcG9pbnRJblJpbmcocmluZy5tYXAoKHApID0+IHBbMF0pLCByaW5nLm1hcCgocCkgPT4gcFsxXSksIHB4LCBweSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogRmxhdHRlbiBhIHJlZ2lvbiB0byB0ZXN0YWJsZSBzaGFwZXMuIFJldHVybnMgYW4gZW1wdHkgYXJyYXkgZm9yIGFueXRoaW5nIHRoYXRcbiAqIGVuY2xvc2VzIG5vIGFyZWEg4oCUIGFuIG9wZW4gcG9seWxpbmUsIGFuIGludGVuc2l0eS1wcm9maWxlIGxpbmUsIGEgZGVnZW5lcmF0ZVxuICogcmVjdGFuZ2xlIOKAlCBzbyB0aG9zZSBuZXZlciBjb250cmlidXRlIHRvIGEgc2VsZWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaW9uU2hhcGVzKHJlZ2lvbjogUmVnaW9uKTogU2hhcGVbXSB7XG4gIC8vIFByb2ZpbGUgbGluZXMgYmVsb25nIHRvIHRoZSBpbnRlbnNpdHkgdG9vbCwgbm90IHRoZSBhbm5vdGF0aW9uIHNldC5cbiAgaWYgKChyZWdpb24gYXMgdW5rbm93biBhcyB7IGtpbmQ/OiBzdHJpbmcgfSk/LmtpbmQgPT09ICdwcm9maWxlJykgcmV0dXJuIFtdO1xuICBjb25zdCBiID0gcmVnaW9uPy5ib3VuZHMgYXMgdW5rbm93biBhcyB7XG4gICAgeD86IG51bWJlcjsgeT86IG51bWJlcjsgd2lkdGg/OiBudW1iZXI7IGhlaWdodD86IG51bWJlcjtcbiAgICB4cG9pbnRzPzogbnVtYmVyW107IHlwb2ludHM/OiBudW1iZXJbXTsgY2xvc2VkPzogYm9vbGVhbjsgaG9sZXM/OiBudW1iZXJbXVtdW107XG4gICAgcG9seWdvbnM/OiB7IHhwb2ludHM6IG51bWJlcltdOyB5cG9pbnRzOiBudW1iZXJbXTsgY2xvc2VkPzogYm9vbGVhbjsgaG9sZXM/OiBudW1iZXJbXVtdW10gfVtdO1xuICB9IHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgaWYgKCFiKSByZXR1cm4gW107XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoYi5wb2x5Z29ucykpIHtcbiAgICByZXR1cm4gYi5wb2x5Z29ucy5mbGF0TWFwKChwKSA9PlxuICAgICAgcC5jbG9zZWQgPT09IGZhbHNlID8gW10gOiAocG9seWdvblNoYXBlKHAueHBvaW50cyA/PyBbXSwgcC55cG9pbnRzID8/IFtdLCBwLmhvbGVzKSA/PyBbXSkpO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KGIueHBvaW50cykpIHtcbiAgICBpZiAoYi5jbG9zZWQgPT09IGZhbHNlKSByZXR1cm4gW107IC8vIG9wZW4gcG9seWxpbmUgZW5jbG9zZXMgbm90aGluZ1xuICAgIGNvbnN0IHNoYXBlID0gcG9seWdvblNoYXBlKGIueHBvaW50cywgYi55cG9pbnRzID8/IFtdLCBiLmhvbGVzKTtcbiAgICByZXR1cm4gc2hhcGUgPyBbc2hhcGVdIDogW107XG4gIH1cbiAgaWYgKHR5cGVvZiBiLndpZHRoID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgYi5oZWlnaHQgPT09ICdudW1iZXInKSB7XG4gICAgY29uc3QgeCA9IGIueCA/PyAwO1xuICAgIGNvbnN0IHkgPSBiLnkgPz8gMDtcbiAgICAvLyBOb3JtYWxpc2UgYSByZWN0YW5nbGUgZHJhZ2dlZCByaWdodC10by1sZWZ0IC8gYm90dG9tLXRvLXRvcC5cbiAgICBjb25zdCBtaW5YID0gTWF0aC5taW4oeCwgeCArIGIud2lkdGgpO1xuICAgIGNvbnN0IG1heFggPSBNYXRoLm1heCh4LCB4ICsgYi53aWR0aCk7XG4gICAgY29uc3QgbWluWSA9IE1hdGgubWluKHksIHkgKyBiLmhlaWdodCk7XG4gICAgY29uc3QgbWF4WSA9IE1hdGgubWF4KHksIHkgKyBiLmhlaWdodCk7XG4gICAgaWYgKG1heFggPT09IG1pblggfHwgbWF4WSA9PT0gbWluWSkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGJvdW5kcyA9IHsgbWluWCwgbWluWSwgbWF4WCwgbWF4WSB9O1xuICAgIHJldHVybiBbeyBib3VuZHMsIGhpdDogKHB4LCBweSkgPT4gaW5Cb3VuZHMoYm91bmRzLCBweCwgcHkpIH1dO1xuICB9XG4gIHJldHVybiBbXTtcbn1cblxuLyoqXG4gKiBPYnNlcnZhdGlvbnMgaW5zaWRlIEFOWSBvZiBgcmVnaW9uc2AgKHVuaW9uKS4gQ29vcmRpbmF0ZXMgYXJlIHRyYW5zZm9ybWVkIGJ5XG4gKiBgaW1hZ2VSZWZgIGZpcnN0LCBzbyB0aGUgdGVzdCBoYXBwZW5zIGluIHRoZSBzYW1lIHdvcmxkIHNwYWNlIHRoZSByZWdpb25zIHdlcmVcbiAqIGRyYXduIGluLlxuICpcbiAqIGBjYW5kaWRhdGVzYCwgd2hlbiBnaXZlbiwgcmVzdHJpY3RzIHRoZSB0ZXN0IHRvIHRob3NlIG9ic2VydmF0aW9uIGluZGljZXMg4oCUIGhvd1xuICogYSAyRCB2aWV3IG9mIGEgM0QgZGF0YXNldCBrZWVwcyBhIGRyYXduIHJlZ2lvbiBtZWFuaW5nIHdoYXQgaXQgbG9va3MgbGlrZSBpdFxuICogbWVhbnM6IHRoZSBzaGFwZSB3YXMgZHJhd24gb3ZlciBPTkUgc2VjdGlvbiwgc28gaXQgc2VsZWN0cyB0aGF0IHNlY3Rpb24ncyBjZWxsc1xuICogcmF0aGVyIHRoYW4gdGhlIHdob2xlIGRlcHRoIG9mIHRoZSBzcGVjaW1lbiBiZWhpbmQgdGhlbS4gVGhlIHJldHVybmVkIG1hc2sgc3RheXNcbiAqIGluZGV4ZWQgYnkgb2JzZXJ2YXRpb24sIHNvIGV2ZXJ5IGNvbnN1bWVyIChjaGFydHMsIGxlZ2VuZCwgdGhlIDNEIGNsb3VkKSByZWFkcyBpdFxuICogdGhlIHNhbWUgd2F5LlxuICovXG4vKipcbiAqIEEgc2VsZWN0aW9uIGZyb20gYW4gZXhwbGljaXQgbGlzdCBvZiBvYnNlcnZhdGlvbiBpbmRpY2VzLlxuICpcbiAqIFdoYXQgYSBsYXNzbyBpbiBhIGxpbmtlZCBwbG90IHByb2R1Y2VzOiB0aGUgcGxvdCBrbm93cyB3aGljaCBwb2ludHMgdGhlIHVzZXIgZHJld1xuICogYXJvdW5kLCBhbmQgdGhlIG1hcCBuZWVkcyB0aGF0IGFzIGEgbWFzayBvdmVyIEFMTCBvYnNlcnZhdGlvbnMuIE91dC1vZi1yYW5nZSBhbmRcbiAqIGR1cGxpY2F0ZSBpbmRpY2VzIGFyZSBpZ25vcmVkIHJhdGhlciB0aGFuIHJlamVjdGVkIOKAlCBhIHBsb3QgbWF5IGhhbmQgYmFjayB0aGUgc2FtZVxuICogcG9pbnQgdHdpY2UsIGFuZCBhIHN0YWxlIGluZGV4IGZyb20gYSBwbG90IGRyYXduIGJlZm9yZSBhIGRhdGFzZXQgY2hhbmdlIG11c3Qgbm90XG4gKiB0aHJvdyBpbiB0aGUgbWlkZGxlIG9mIGEgc2VsZWN0aW9uIGdlc3R1cmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RCeUluZGljZXMoXG4gIGluZGljZXM6IEl0ZXJhYmxlPG51bWJlcj4sIG9ic2VydmF0aW9uQ291bnQ6IG51bWJlcixcbik6IFNwYXRpYWxTZWxlY3Rpb25NYXNrIHtcbiAgY29uc3QgbWFzayA9IG5ldyBVaW50OEFycmF5KG9ic2VydmF0aW9uQ291bnQpO1xuICBsZXQgY291bnQgPSAwO1xuICBmb3IgKGNvbnN0IGkgb2YgaW5kaWNlcykge1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihpKSB8fCBpIDwgMCB8fCBpID49IG9ic2VydmF0aW9uQ291bnQpIGNvbnRpbnVlO1xuICAgIGlmIChtYXNrW2ldKSBjb250aW51ZTtcbiAgICBtYXNrW2ldID0gMTtcbiAgICBjb3VudCsrO1xuICB9XG4gIHJldHVybiB7IG1hc2ssIGNvdW50IH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RJblJlZ2lvbnMoXG4gIG9ic2VydmF0aW9uczogU3BhdGlhbE9ic2VydmF0aW9ucyxcbiAgaW1hZ2VSZWY6IFNwYXRpYWxJbWFnZVJlZiB8IHVuZGVmaW5lZCxcbiAgcmVnaW9uczogcmVhZG9ubHkgUmVnaW9uW10sXG4gIGNhbmRpZGF0ZXM/OiBVaW50MzJBcnJheSxcbik6IFNwYXRpYWxTZWxlY3Rpb25NYXNrIHtcbiAgY29uc3QgbiA9IG9ic2VydmF0aW9ucy5jb3VudDtcbiAgY29uc3QgbWFzayA9IG5ldyBVaW50OEFycmF5KG4pO1xuICBjb25zdCBzaGFwZXMgPSByZWdpb25zLmZsYXRNYXAoKHIpID0+IHJlZ2lvblNoYXBlcyhyKSk7XG4gIGlmIChzaGFwZXMubGVuZ3RoID09PSAwKSByZXR1cm4geyBtYXNrLCBjb3VudDogMCB9O1xuXG4gIGNvbnN0IFtzeCwgc3ldID0gaW1hZ2VSZWY/LnNjYWxlID8/IFsxLCAxXTtcbiAgY29uc3QgW3R4LCB0eV0gPSBpbWFnZVJlZj8udHJhbnNsYXRlID8/IFswLCAwXTtcbiAgbGV0IGNvdW50ID0gMDtcbiAgY29uc3QgdG90YWwgPSBjYW5kaWRhdGVzID8gY2FuZGlkYXRlcy5sZW5ndGggOiBuO1xuICBmb3IgKGxldCBrID0gMDsgayA8IHRvdGFsOyBrKyspIHtcbiAgICBjb25zdCBpID0gY2FuZGlkYXRlcyA/IGNhbmRpZGF0ZXNba10gOiBrO1xuICAgIGNvbnN0IHB4ID0gb2JzZXJ2YXRpb25zLnhbaV0gKiBzeCArIHR4O1xuICAgIGNvbnN0IHB5ID0gb2JzZXJ2YXRpb25zLnlbaV0gKiBzeSArIHR5O1xuICAgIGZvciAoY29uc3Qgc2hhcGUgb2Ygc2hhcGVzKSB7XG4gICAgICAvLyBCb3VuZHMgZmlyc3Q6IGEgcmF5IGNhc3QgcGVyIG9ic2VydmF0aW9uIHBlciByZWdpb24gd291bGQgZG9taW5hdGUgYXRcbiAgICAgIC8vIDEwXjUgb2JzZXJ2YXRpb25zLCBhbmQgbW9zdCBwb2ludHMgbWlzcyBtb3N0IHJlZ2lvbnMuXG4gICAgICBpZiAoIWluQm91bmRzKHNoYXBlLmJvdW5kcywgcHgsIHB5KSkgY29udGludWU7XG4gICAgICBpZiAoc2hhcGUuaGl0KHB4LCBweSkpIHtcbiAgICAgICAgbWFza1tpXSA9IDE7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4geyBtYXNrLCBjb3VudCB9O1xufVxuXG4vKipcbiAqIFNlbGVjdCBvYnNlcnZhdGlvbnMgd2hvc2UgU0NSRUVOIHByb2plY3Rpb24gZmFsbHMgaW5zaWRlIHRoZSBkcmF3biByZWdpb25zLlxuICpcbiAqIFRoaXMgaXMgaG93IGEgcmVnaW9uIHNlbGVjdGlvbiB3b3JrcyBpbiB0aGUgM0QgY2xvdWQuIFRoZXJlIGlzIG5vIGRhdGEtc3BhY2VcbiAqIGFmZmluZSB0byBtYXAgYSBkcmF3biBzaGFwZSB0aHJvdWdoLCBiZWNhdXNlIHRoZSBzaGFwZSB3YXMgZHJhd24gb24gYSAyRCBzY3JlZW5cbiAqIGFnYWluc3QgYSBwZXJzcGVjdGl2ZSBjYW1lcmEg4oCUIHNvIHRoZSBvYnNlcnZhdGlvbnMgY29tZSB0aGUgb3RoZXIgd2F5LCBhbHJlYWR5XG4gKiBwcm9qZWN0ZWQgdG8gY2FudmFzIHBpeGVscyBieSB0aGUgcmVuZGVyZXIgKHdoaWNoIG93bnMgdGhlIGNhbWVyYSksIGFuZCB0aGVcbiAqIHJlZ2lvbnMgYXJlIHRlc3RlZCBpbiB0aGF0IHNhbWUgc2NyZWVuIHNwYWNlLlxuICpcbiAqIFRoZSBjb25zZXF1ZW5jZSBpcyB3b3J0aCBiZWluZyBleHBsaWNpdCBhYm91dDogYSBzY3JlZW4tc3BhY2UgbGFzc28gc2VsZWN0c1xuICogdGhyb3VnaCB0aGUgV0hPTEUgREVQVEggb2YgdGhlIGNsb3VkLCBsaWtlIGEgY29va2llIGN1dHRlciwgbm90IGEgc2xhYiBhdCBzb21lXG4gKiBjaG9zZW4gei4gVGhhdCBpcyBpbmhlcmVudCB0byBkcmF3aW5nIG9uIGEgZmxhdCBzY3JlZW4sIGFuZCBpdCBpcyB3aGF0IG5hcGFyaVxuICogYW5kIGV2ZXJ5IG90aGVyIG9yYml0LWNhbWVyYSBwb2ludCBwaWNrZXIgZG8uIE9yYml0IGFuZCBkcmF3IGFnYWluIHRvIGN1dCBmcm9tXG4gKiBhbm90aGVyIGFuZ2xlLlxuICpcbiAqIGBzY3JlZW5gIGlzIGBbeDAsIHkwLCB4MSwgeTEsIOKApl1gIGluIGNhbnZhcyBwaXhlbHMsIGBjb3VudGAgZW50cmllcyBsb25nLiBBblxuICogb2JzZXJ2YXRpb24gdGhlIGNhbWVyYSBwdXRzIGJlaGluZCB0aGUgZXllIGlzIGdpdmVuIE5hTiBieSB0aGUgcHJvamVjdG9yIGFuZFxuICogbmV2ZXIgc2VsZWN0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RJblJlZ2lvbnNQcm9qZWN0ZWQoXG4gIHNjcmVlbjogRmxvYXQzMkFycmF5LFxuICBjb3VudDogbnVtYmVyLFxuICByZWdpb25zOiByZWFkb25seSBSZWdpb25bXSxcbik6IFNwYXRpYWxTZWxlY3Rpb25NYXNrIHtcbiAgY29uc3QgbWFzayA9IG5ldyBVaW50OEFycmF5KGNvdW50KTtcbiAgY29uc3Qgc2hhcGVzID0gcmVnaW9ucy5mbGF0TWFwKChyKSA9PiByZWdpb25TaGFwZXMocikpO1xuICBpZiAoc2hhcGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgbWFzaywgY291bnQ6IDAgfTtcblxuICBsZXQgaGl0cyA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgIGNvbnN0IHB4ID0gc2NyZWVuW2kgKiAyXTtcbiAgICBjb25zdCBweSA9IHNjcmVlbltpICogMiArIDFdO1xuICAgIC8vIEJlaGluZCB0aGUgY2FtZXJhLCBvciBvdGhlcndpc2UgdW5wcm9qZWN0YWJsZS5cbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShweCkgfHwgIU51bWJlci5pc0Zpbml0ZShweSkpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3Qgc2hhcGUgb2Ygc2hhcGVzKSB7XG4gICAgICBpZiAoIWluQm91bmRzKHNoYXBlLmJvdW5kcywgcHgsIHB5KSkgY29udGludWU7XG4gICAgICBpZiAoc2hhcGUuaGl0KHB4LCBweSkpIHtcbiAgICAgICAgbWFza1tpXSA9IDE7XG4gICAgICAgIGhpdHMrKztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB7IG1hc2ssIGNvdW50OiBoaXRzIH07XG59XG5cbi8qKiBFdmVyeSBvYnNlcnZhdGlvbiB3aG9zZSBjYXRlZ29yaWNhbCBjb2RlIGVxdWFscyBgY29kZWAg4oCUIHRoZSBsZWdlbmQgY2xpY2suICovXG4vKipcbiAqIFdoZXRoZXIgdHdvIHNlbGVjdGlvbnMgaG9sZCBleGFjdGx5IHRoZSBzYW1lIG9ic2VydmF0aW9ucy5cbiAqXG4gKiBMZXRzIGEgY2xpY2sgdG9nZ2xlIGFnYWluc3QgdGhlIFNFTEVDVElPTiByYXRoZXIgdGhhbiBhZ2FpbnN0IGEgcmVtZW1iZXJlZFxuICogY2xpY2s6IHBpY2tpbmcgYSBjbGFzcyBpbiB0aGUgbGVnZW5kIGFuZCB0aGVuIGNsaWNraW5nIHRoYXQgc2FtZSBjbGFzcyBvbiB0aGVcbiAqIGNhbnZhcyBzaG91bGQgY2xlYXIgaXQsIGFuZCBhIHJlbWVtYmVyZWQgY2xpY2sgY2Fubm90IGtub3cgYWJvdXQgdGhlIGxlZ2VuZC5cbiAqIENvdW50cyBhcmUgY29tcGFyZWQgZmlyc3QsIHNvIHR3byBkaWZmZXJlbnQgc2VsZWN0aW9ucyB1c3VhbGx5IGNvc3Qgbm90aGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhbWVTZWxlY3Rpb24oYTogU3BhdGlhbFNlbGVjdGlvbk1hc2ssIGI6IFNwYXRpYWxTZWxlY3Rpb25NYXNrKTogYm9vbGVhbiB7XG4gIGlmIChhLmNvdW50ICE9PSBiLmNvdW50KSByZXR1cm4gZmFsc2U7XG4gIGlmIChhLm1hc2subGVuZ3RoICE9PSBiLm1hc2subGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYS5tYXNrLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gTm9ybWFsaXNlZCB0byAwLzE6IHRoZSBtYXNrcyBhcmUgZmxhZ3MsIGFuZCBhIHdyaXRlciBpcyBmcmVlIHRvIHVzZSBhbnlcbiAgICAvLyBub24temVybyB2YWx1ZSBmb3IgXCJzZWxlY3RlZFwiLlxuICAgIGlmICgoYS5tYXNrW2ldID8gMSA6IDApICE9PSAoYi5tYXNrW2ldID8gMSA6IDApKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RCeUNhdGVnb3J5KGNvZGVzOiBVaW50MTZBcnJheSwgY29kZTogbnVtYmVyKTogU3BhdGlhbFNlbGVjdGlvbk1hc2sge1xuICBjb25zdCBtYXNrID0gbmV3IFVpbnQ4QXJyYXkoY29kZXMubGVuZ3RoKTtcbiAgbGV0IGNvdW50ID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChjb2Rlc1tpXSA9PT0gY29kZSkge1xuICAgICAgbWFza1tpXSA9IDE7XG4gICAgICBjb3VudCsrO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyBtYXNrLCBjb3VudCB9O1xufVxuIl19
|
|
251
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1zZWxlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NwYXRpYWwvc3BhdGlhbC1zZWxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUF3QixXQUFXLElBQUksaUJBQWlCLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUEwQnRHLG9EQUFvRDtBQUNwRCxNQUFNLFVBQVUsY0FBYyxDQUFDLEtBQUssR0FBRyxDQUFDO0lBQ3RDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ25ELENBQUM7QUFFRCx1Q0FBdUM7QUFDdkMsTUFBTSxVQUFVLFNBQVMsQ0FBQyxJQUFnQjtJQUN4QyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDVixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7UUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7WUFBRSxDQUFDLEVBQUUsQ0FBQztJQUN2RCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFFRCwwREFBMEQ7QUFDMUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxJQUFnQjtJQUM1QyxNQUFNLEdBQUcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM3QyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDWCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7UUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7WUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakUsT0FBTyxHQUFHLENBQUM7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RUFBRSxDQUFDO1FBQ1YsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ3pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZWdpb24gfSBmcm9tICcuLi9tb2RlbHMvcmVnaW9uJztcbmltcG9ydCB7IFJpbmdCb3VuZHMgYXMgQm91bmRzLCBwb2ludEluUmluZyBhcyByaW5nQ29udGFpbnNQb2ludCwgcmluZ0JvdW5kcyB9IGZyb20gJy4uL2dlb21ldHJ5L3JpbmcnO1xuaW1wb3J0IHsgU3BhdGlhbEltYWdlUmVmLCBTcGF0aWFsT2JzZXJ2YXRpb25zLCBTcGF0aWFsU2VsZWN0aW9uTWFzayB9IGZyb20gJy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuXG4vKipcbiAqIFdoaWNoIG9ic2VydmF0aW9ucyBmYWxsIGluc2lkZSBhIHNldCBvZiBkcmF3biByZWdpb25zLlxuICpcbiAqIFB1cmUsIGxpa2UgYHNwYXRpYWwtZW5jb2RpbmcudHNgIOKAlCBubyBzdG9yZSwgbm8gcmVuZGVyZXIg4oCUIHNvIHRoZSBnZW9tZXRyeSBpc1xuICogdGVzdGFibGUgb24gaXRzIG93bi5cbiAqXG4gKiBXSFkgVEhJUyBJUyBUSEUgV0hPTEUgU0VMRUNUSU9OIE1FQ0hBTklTTVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIFJlZ2lvbnMgYWxyZWFkeSBjb21lIGZyb20gZXZlcnkgb24tY2FudmFzIHRvb2wgdGhlIGxpYnJhcnkgaGFzOiByZWN0YW5nbGUsXG4gKiBwb2x5Z29uLCBmcmVlaGFuZCwgbWFnaWMgd2FuZCwgYnJ1c2guIFRlc3Rpbmcgb2JzZXJ2YXRpb25zIGFnYWluc3QgdGhlbSB0dXJuc1xuICogYWxsIG9mIHRob3NlIGludG8gc3BhdGlhbC1vbWljcyBzZWxlY3Rpb24gdG9vbHMgd2l0aG91dCBhZGRpbmcgYSBzaW5nbGUgbmV3XG4gKiBjYW52YXMgaW50ZXJhY3Rpb24g4oCUIHdoaWNoIGlzIHdoeSB0aGVyZSBpcyBubyBiZXNwb2tlIG1hcnF1ZWUgaGVyZS5cbiAqXG4gKiBDT09SRElOQVRFIEZSQU1FU1xuICogLS0tLS0tLS0tLS0tLS0tLS1cbiAqIFJlZ2lvbnMgYXJlIGRyYXduIGluIFdPUkxEIChpbWFnZSkgY29vcmRpbmF0ZXMuIE9ic2VydmF0aW9ucyBsaXZlIGluIHRoZVxuICogZGF0YXNldCdzIG93biBmcmFtZSBhbmQgcmVhY2ggdGhlIHdvcmxkIHRocm91Z2ggYGltYWdlUmVmYCDigJQgc28gdGhleSBhcmVcbiAqIHRyYW5zZm9ybWVkIGZvcndhcmQgYmVmb3JlIHRlc3RpbmcsIG1hdGNoaW5nIGV4YWN0bHkgd2hhdCB0aGUgcmVuZGVyZXIgZHJhd3MuXG4gKi9cblxuLyoqIE1vdmVkIHRvIHRoZSBkYXRhc2V0IGNvbnRyYWN0IChhIHB1cmUgZGF0YSB0eXBlKTsgcmUtZXhwb3J0ZWQgaGVyZSBmb3IgZXhpc3RpbmcgaW1wb3J0ZXJzLiAqL1xuZXhwb3J0IHR5cGUgeyBTcGF0aWFsU2VsZWN0aW9uTWFzayB9O1xuXG4vKiogQW4gZW1wdHkgc2VsZWN0aW9uIG92ZXIgYGNvdW50YCBvYnNlcnZhdGlvbnMuICovXG5leHBvcnQgZnVuY3Rpb24gZW1wdHlTZWxlY3Rpb24oY291bnQgPSAwKTogU3BhdGlhbFNlbGVjdGlvbk1hc2sge1xuICByZXR1cm4geyBtYXNrOiBuZXcgVWludDhBcnJheShjb3VudCksIGNvdW50OiAwIH07XG59XG5cbi8qKiBOdW1iZXIgb2Ygc2V0IGVudHJpZXMgaW4gYSBtYXNrLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvdW50TWFzayhtYXNrOiBVaW50OEFycmF5KTogbnVtYmVyIHtcbiAgbGV0IG4gPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG1hc2subGVuZ3RoOyBpKyspIGlmIChtYXNrW2ldKSBuKys7XG4gIHJldHVybiBuO1xufVxuXG4vKiogU2VsZWN0ZWQgaW5kaWNlcywgZm9yIGV4cG9ydCBvciBhIGRvd25zdHJlYW0gcXVlcnkuICovXG5leHBvcnQgZnVuY3Rpb24gbWFza1RvSW5kaWNlcyhtYXNrOiBVaW50OEFycmF5KTogVWludDMyQXJyYXkge1xuICBjb25zdCBvdXQgPSBuZXcgVWludDMyQXJyYXkoY291bnRNYXNrKG1hc2spKTtcbiAgbGV0IGF0ID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXNrLmxlbmd0aDsgaSsrKSBpZiAobWFza1tpXSkgb3V0W2F0KytdID0gaTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBSZW5kZXJlci1mYWNpbmcgaW52ZXJzZTogd2hpY2ggb2JzZXJ2YXRpb25zIHRvIE1VVEUuIFdpdGggbm90aGluZyBzZWxlY3RlZFxuICogbm90aGluZyBpcyBtdXRlZCAodGhlIHdob2xlIHRpc3N1ZSByZWFkcyBub3JtYWxseSk7IHdpdGggYSBzZWxlY3Rpb24sIGV2ZXJ5XG4gKiB1bnNlbGVjdGVkIG9ic2VydmF0aW9uIGlzIG11dGVkIOKAlCB0aGUgQ29zTXggaGlnaGxpZ2h0LXZzLW11dGUgcnVsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG11dGVkRnJvbVNlbGVjdGlvbihzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrKTogVWludDhBcnJheSB8IG51bGwge1xuICBpZiAoc2VsZWN0aW9uLmNvdW50ID09PSAwKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgbXV0ZWQgPSBuZXcgVWludDhBcnJheShzZWxlY3Rpb24ubWFzay5sZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG11dGVkLmxlbmd0aDsgaSsrKSBtdXRlZFtpXSA9IHNlbGVjdGlvbi5tYXNrW2ldID8gMCA6IDE7XG4gIHJldHVybiBtdXRlZDtcbn1cblxuLyoqXG4gKiBFdmVuLW9kZCByYXkgY2FzdDogaXMgKHB4LCBweSkgaW5zaWRlIHRoZSBjbG9zZWQgcmluZyB4cy95cz9cbiAqXG4gKiBQdWJsaWMgQVBJIGtlcHQgd2l0aCBpdHMgKHJpbmcsIHBvaW50KSBhcmd1bWVudCBvcmRlcjsgdGhlIHRlc3QgaXRzZWxmIGlzXG4gKiB0aGUgc2hhcmVkIGBnZW9tZXRyeS9yaW5nYCBvbmUgdGhlIHJlZ2lvbiBvdmVybGF5cyBhbmQgdG9vbHMgdXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcG9pbnRJblJpbmcoeHM6IHJlYWRvbmx5IG51bWJlcltdLCB5czogcmVhZG9ubHkgbnVtYmVyW10sIHB4OiBudW1iZXIsIHB5OiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJpbmdDb250YWluc1BvaW50KHB4LCBweSwgeHMsIHlzKTtcbn1cblxuZnVuY3Rpb24gaW5Cb3VuZHMoYjogQm91bmRzLCBweDogbnVtYmVyLCBweTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiBweCA+PSBiLm1pblggJiYgcHggPD0gYi5tYXhYICYmIHB5ID49IGIubWluWSAmJiBweSA8PSBiLm1heFk7XG59XG5cbi8qKiBBIHJlZ2lvbiBmbGF0dGVuZWQgdG8gc29tZXRoaW5nIHRlc3RhYmxlOiBib3VuZHMgKyBhIGhpdCB0ZXN0LiAqL1xuaW50ZXJmYWNlIFNoYXBlIHtcbiAgYm91bmRzOiBCb3VuZHM7XG4gIGhpdChweDogbnVtYmVyLCBweTogbnVtYmVyKTogYm9vbGVhbjtcbn1cblxuLyoqIFBvbHlnb24td2l0aC1ob2xlczogaW5zaWRlIHRoZSBleHRlcmlvciBhbmQgb3V0c2lkZSBldmVyeSBob2xlLiAqL1xuZnVuY3Rpb24gcG9seWdvblNoYXBlKHhzOiBudW1iZXJbXSwgeXM6IG51bWJlcltdLCBob2xlcz86IG51bWJlcltdW11bXSk6IFNoYXBlIHwgbnVsbCB7XG4gIGlmICh4cy5sZW5ndGggPCAzKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgYm91bmRzID0gcmluZ0JvdW5kcyh4cywgeXMpO1xuICAvLyBTcGxpdCBhbmQgYm91bmRlZCBPTkNFIHBlciBzaGFwZTogdGhlIGhpdCB0ZXN0IHJ1bnMgZm9yIGV2ZXJ5IGNhbmRpZGF0ZSBwb2ludFxuICAvLyBpbnNpZGUgdGhlIGV4dGVyaW9yIOKAlCB1cCB0byBtaWxsaW9ucyBvZiBjZWxscyBwZXIgc2VsZWN0aW9uLlxuICBjb25zdCBob2xlUmluZ3MgPSAoaG9sZXMgPz8gW10pXG4gICAgLmZpbHRlcigocmluZykgPT4gcmluZy5sZW5ndGggPj0gMylcbiAgICAubWFwKChyaW5nKSA9PiB7XG4gICAgICBjb25zdCBoeCA9IHJpbmcubWFwKChwKSA9PiBwWzBdKTtcbiAgICAgIGNvbnN0IGh5ID0gcmluZy5tYXAoKHApID0+IHBbMV0pO1xuICAgICAgcmV0dXJuIHsgeHM6IGh4LCB5czogaHksIGJvdW5kczogcmluZ0JvdW5kcyhoeCwgaHkpIH07XG4gICAgfSk7XG4gIHJldHVybiB7XG4gICAgYm91bmRzLFxuICAgIGhpdDogKHB4LCBweSkgPT4ge1xuICAgICAgaWYgKCFwb2ludEluUmluZyh4cywgeXMsIHB4LCBweSkpIHJldHVybiBmYWxzZTtcbiAgICAgIC8vIFRoZSByZWdpb24gbW9kZWwgaXMgZXhwbGljaXQ6IGEgcG9pbnQgaW5zaWRlIHRoZSBleHRlcmlvciBBTkQgaW5zaWRlIGFcbiAgICAgIC8vIGhvbGUgaXMgT1VUU0lERSB0aGUgcmVnaW9uLlxuICAgICAgZm9yIChjb25zdCBob2xlIG9mIGhvbGVSaW5ncykge1xuICAgICAgICBpZiAoaW5Cb3VuZHMoaG9sZS5ib3VuZHMsIHB4LCBweSkgJiYgcG9pbnRJblJpbmcoaG9sZS54cywgaG9sZS55cywgcHgsIHB5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBGbGF0dGVuIGEgcmVnaW9uIHRvIHRlc3RhYmxlIHNoYXBlcy4gUmV0dXJucyBhbiBlbXB0eSBhcnJheSBmb3IgYW55dGhpbmcgdGhhdFxuICogZW5jbG9zZXMgbm8gYXJlYSDigJQgYW4gb3BlbiBwb2x5bGluZSwgYW4gaW50ZW5zaXR5LXByb2ZpbGUgbGluZSwgYSBkZWdlbmVyYXRlXG4gKiByZWN0YW5nbGUg4oCUIHNvIHRob3NlIG5ldmVyIGNvbnRyaWJ1dGUgdG8gYSBzZWxlY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpb25TaGFwZXMocmVnaW9uOiBSZWdpb24pOiBTaGFwZVtdIHtcbiAgLy8gUHJvZmlsZSBsaW5lcyBiZWxvbmcgdG8gdGhlIGludGVuc2l0eSB0b29sLCBub3QgdGhlIGFubm90YXRpb24gc2V0LlxuICBpZiAoKHJlZ2lvbiBhcyB1bmtub3duIGFzIHsga2luZD86IHN0cmluZyB9KT8ua2luZCA9PT0gJ3Byb2ZpbGUnKSByZXR1cm4gW107XG4gIGNvbnN0IGIgPSByZWdpb24/LmJvdW5kcyBhcyB1bmtub3duIGFzXG4gICAgfCB7XG4gICAgICAgIHg/OiBudW1iZXI7XG4gICAgICAgIHk/OiBudW1iZXI7XG4gICAgICAgIHdpZHRoPzogbnVtYmVyO1xuICAgICAgICBoZWlnaHQ/OiBudW1iZXI7XG4gICAgICAgIHhwb2ludHM/OiBudW1iZXJbXTtcbiAgICAgICAgeXBvaW50cz86IG51bWJlcltdO1xuICAgICAgICBjbG9zZWQ/OiBib29sZWFuO1xuICAgICAgICBob2xlcz86IG51bWJlcltdW11bXTtcbiAgICAgICAgcG9seWdvbnM/OiB7IHhwb2ludHM6IG51bWJlcltdOyB5cG9pbnRzOiBudW1iZXJbXTsgY2xvc2VkPzogYm9vbGVhbjsgaG9sZXM/OiBudW1iZXJbXVtdW10gfVtdO1xuICAgICAgfVxuICAgIHwgbnVsbFxuICAgIHwgdW5kZWZpbmVkO1xuICBpZiAoIWIpIHJldHVybiBbXTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShiLnBvbHlnb25zKSkge1xuICAgIHJldHVybiBiLnBvbHlnb25zLmZsYXRNYXAoKHApID0+XG4gICAgICBwLmNsb3NlZCA9PT0gZmFsc2UgPyBbXSA6IChwb2x5Z29uU2hhcGUocC54cG9pbnRzID8/IFtdLCBwLnlwb2ludHMgPz8gW10sIHAuaG9sZXMpID8/IFtdKSxcbiAgICApO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KGIueHBvaW50cykpIHtcbiAgICBpZiAoYi5jbG9zZWQgPT09IGZhbHNlKSByZXR1cm4gW107IC8vIG9wZW4gcG9seWxpbmUgZW5jbG9zZXMgbm90aGluZ1xuICAgIGNvbnN0IHNoYXBlID0gcG9seWdvblNoYXBlKGIueHBvaW50cywgYi55cG9pbnRzID8/IFtdLCBiLmhvbGVzKTtcbiAgICByZXR1cm4gc2hhcGUgPyBbc2hhcGVdIDogW107XG4gIH1cbiAgaWYgKHR5cGVvZiBiLndpZHRoID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgYi5oZWlnaHQgPT09ICdudW1iZXInKSB7XG4gICAgY29uc3QgeCA9IGIueCA/PyAwO1xuICAgIGNvbnN0IHkgPSBiLnkgPz8gMDtcbiAgICAvLyBOb3JtYWxpc2UgYSByZWN0YW5nbGUgZHJhZ2dlZCByaWdodC10by1sZWZ0IC8gYm90dG9tLXRvLXRvcC5cbiAgICBjb25zdCBtaW5YID0gTWF0aC5taW4oeCwgeCArIGIud2lkdGgpO1xuICAgIGNvbnN0IG1heFggPSBNYXRoLm1heCh4LCB4ICsgYi53aWR0aCk7XG4gICAgY29uc3QgbWluWSA9IE1hdGgubWluKHksIHkgKyBiLmhlaWdodCk7XG4gICAgY29uc3QgbWF4WSA9IE1hdGgubWF4KHksIHkgKyBiLmhlaWdodCk7XG4gICAgaWYgKG1heFggPT09IG1pblggfHwgbWF4WSA9PT0gbWluWSkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGJvdW5kcyA9IHsgbWluWCwgbWluWSwgbWF4WCwgbWF4WSB9O1xuICAgIHJldHVybiBbeyBib3VuZHMsIGhpdDogKHB4LCBweSkgPT4gaW5Cb3VuZHMoYm91bmRzLCBweCwgcHkpIH1dO1xuICB9XG4gIHJldHVybiBbXTtcbn1cblxuLyoqXG4gKiBBIHNlbGVjdGlvbiBmcm9tIGFuIGV4cGxpY2l0IGxpc3Qgb2Ygb2JzZXJ2YXRpb24gaW5kaWNlcy5cbiAqXG4gKiBXaGF0IGEgbGFzc28gaW4gYSBsaW5rZWQgcGxvdCBwcm9kdWNlczogdGhlIHBsb3Qga25vd3Mgd2hpY2ggcG9pbnRzIHRoZSB1c2VyIGRyZXdcbiAqIGFyb3VuZCwgYW5kIHRoZSBtYXAgbmVlZHMgdGhhdCBhcyBhIG1hc2sgb3ZlciBBTEwgb2JzZXJ2YXRpb25zLiBPdXQtb2YtcmFuZ2UgYW5kXG4gKiBkdXBsaWNhdGUgaW5kaWNlcyBhcmUgaWdub3JlZCByYXRoZXIgdGhhbiByZWplY3RlZCDigJQgYSBwbG90IG1heSBoYW5kIGJhY2sgdGhlIHNhbWVcbiAqIHBvaW50IHR3aWNlLCBhbmQgYSBzdGFsZSBpbmRleCBmcm9tIGEgcGxvdCBkcmF3biBiZWZvcmUgYSBkYXRhc2V0IGNoYW5nZSBtdXN0IG5vdFxuICogdGhyb3cgaW4gdGhlIG1pZGRsZSBvZiBhIHNlbGVjdGlvbiBnZXN0dXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0QnlJbmRpY2VzKGluZGljZXM6IEl0ZXJhYmxlPG51bWJlcj4sIG9ic2VydmF0aW9uQ291bnQ6IG51bWJlcik6IFNwYXRpYWxTZWxlY3Rpb25NYXNrIHtcbiAgY29uc3QgbWFzayA9IG5ldyBVaW50OEFycmF5KG9ic2VydmF0aW9uQ291bnQpO1xuICBsZXQgY291bnQgPSAwO1xuICBmb3IgKGNvbnN0IGkgb2YgaW5kaWNlcykge1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihpKSB8fCBpIDwgMCB8fCBpID49IG9ic2VydmF0aW9uQ291bnQpIGNvbnRpbnVlO1xuICAgIGlmIChtYXNrW2ldKSBjb250aW51ZTtcbiAgICBtYXNrW2ldID0gMTtcbiAgICBjb3VudCsrO1xuICB9XG4gIHJldHVybiB7IG1hc2ssIGNvdW50IH07XG59XG5cbi8qKlxuICogT2JzZXJ2YXRpb25zIGluc2lkZSBBTlkgb2YgYHJlZ2lvbnNgICh1bmlvbikuIENvb3JkaW5hdGVzIGFyZSB0cmFuc2Zvcm1lZCBieVxuICogYGltYWdlUmVmYCBmaXJzdCwgc28gdGhlIHRlc3QgaGFwcGVucyBpbiB0aGUgc2FtZSB3b3JsZCBzcGFjZSB0aGUgcmVnaW9ucyB3ZXJlXG4gKiBkcmF3biBpbi5cbiAqXG4gKiBgY2FuZGlkYXRlc2AsIHdoZW4gZ2l2ZW4sIHJlc3RyaWN0cyB0aGUgdGVzdCB0byB0aG9zZSBvYnNlcnZhdGlvbiBpbmRpY2VzIOKAlCBob3dcbiAqIGEgMkQgdmlldyBvZiBhIDNEIGRhdGFzZXQga2VlcHMgYSBkcmF3biByZWdpb24gbWVhbmluZyB3aGF0IGl0IGxvb2tzIGxpa2UgaXRcbiAqIG1lYW5zOiB0aGUgc2hhcGUgd2FzIGRyYXduIG92ZXIgT05FIHNlY3Rpb24sIHNvIGl0IHNlbGVjdHMgdGhhdCBzZWN0aW9uJ3MgY2VsbHNcbiAqIHJhdGhlciB0aGFuIHRoZSB3aG9sZSBkZXB0aCBvZiB0aGUgc3BlY2ltZW4gYmVoaW5kIHRoZW0uIFRoZSByZXR1cm5lZCBtYXNrIHN0YXlzXG4gKiBpbmRleGVkIGJ5IG9ic2VydmF0aW9uLCBzbyBldmVyeSBjb25zdW1lciAoY2hhcnRzLCBsZWdlbmQsIHRoZSAzRCBjbG91ZCkgcmVhZHMgaXRcbiAqIHRoZSBzYW1lIHdheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdEluUmVnaW9ucyhcbiAgb2JzZXJ2YXRpb25zOiBTcGF0aWFsT2JzZXJ2YXRpb25zLFxuICBpbWFnZVJlZjogU3BhdGlhbEltYWdlUmVmIHwgdW5kZWZpbmVkLFxuICByZWdpb25zOiByZWFkb25seSBSZWdpb25bXSxcbiAgY2FuZGlkYXRlcz86IFVpbnQzMkFycmF5LFxuKTogU3BhdGlhbFNlbGVjdGlvbk1hc2sge1xuICBjb25zdCBuID0gb2JzZXJ2YXRpb25zLmNvdW50O1xuICBjb25zdCBtYXNrID0gbmV3IFVpbnQ4QXJyYXkobik7XG4gIGNvbnN0IHNoYXBlcyA9IHJlZ2lvbnMuZmxhdE1hcCgocikgPT4gcmVnaW9uU2hhcGVzKHIpKTtcbiAgaWYgKHNoYXBlcy5sZW5ndGggPT09IDApIHJldHVybiB7IG1hc2ssIGNvdW50OiAwIH07XG5cbiAgY29uc3QgW3N4LCBzeV0gPSBpbWFnZVJlZj8uc2NhbGUgPz8gWzEsIDFdO1xuICBjb25zdCBbdHgsIHR5XSA9IGltYWdlUmVmPy50cmFuc2xhdGUgPz8gWzAsIDBdO1xuICBsZXQgY291bnQgPSAwO1xuICBjb25zdCB0b3RhbCA9IGNhbmRpZGF0ZXMgPyBjYW5kaWRhdGVzLmxlbmd0aCA6IG47XG4gIGZvciAobGV0IGsgPSAwOyBrIDwgdG90YWw7IGsrKykge1xuICAgIGNvbnN0IGkgPSBjYW5kaWRhdGVzID8gY2FuZGlkYXRlc1trXSA6IGs7XG4gICAgY29uc3QgcHggPSBvYnNlcnZhdGlvbnMueFtpXSAqIHN4ICsgdHg7XG4gICAgY29uc3QgcHkgPSBvYnNlcnZhdGlvbnMueVtpXSAqIHN5ICsgdHk7XG4gICAgZm9yIChjb25zdCBzaGFwZSBvZiBzaGFwZXMpIHtcbiAgICAgIC8vIEJvdW5kcyBmaXJzdDogYSByYXkgY2FzdCBwZXIgb2JzZXJ2YXRpb24gcGVyIHJlZ2lvbiB3b3VsZCBkb21pbmF0ZSBhdFxuICAgICAgLy8gMTBeNSBvYnNlcnZhdGlvbnMsIGFuZCBtb3N0IHBvaW50cyBtaXNzIG1vc3QgcmVnaW9ucy5cbiAgICAgIGlmICghaW5Cb3VuZHMoc2hhcGUuYm91bmRzLCBweCwgcHkpKSBjb250aW51ZTtcbiAgICAgIGlmIChzaGFwZS5oaXQocHgsIHB5KSkge1xuICAgICAgICBtYXNrW2ldID0gMTtcbiAgICAgICAgY291bnQrKztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB7IG1hc2ssIGNvdW50IH07XG59XG5cbi8qKlxuICogU2VsZWN0IG9ic2VydmF0aW9ucyB3aG9zZSBTQ1JFRU4gcHJvamVjdGlvbiBmYWxscyBpbnNpZGUgdGhlIGRyYXduIHJlZ2lvbnMuXG4gKlxuICogVGhpcyBpcyBob3cgYSByZWdpb24gc2VsZWN0aW9uIHdvcmtzIGluIHRoZSAzRCBjbG91ZC4gVGhlcmUgaXMgbm8gZGF0YS1zcGFjZVxuICogYWZmaW5lIHRvIG1hcCBhIGRyYXduIHNoYXBlIHRocm91Z2gsIGJlY2F1c2UgdGhlIHNoYXBlIHdhcyBkcmF3biBvbiBhIDJEIHNjcmVlblxuICogYWdhaW5zdCBhIHBlcnNwZWN0aXZlIGNhbWVyYSDigJQgc28gdGhlIG9ic2VydmF0aW9ucyBjb21lIHRoZSBvdGhlciB3YXksIGFscmVhZHlcbiAqIHByb2plY3RlZCB0byBjYW52YXMgcGl4ZWxzIGJ5IHRoZSByZW5kZXJlciAod2hpY2ggb3ducyB0aGUgY2FtZXJhKSwgYW5kIHRoZVxuICogcmVnaW9ucyBhcmUgdGVzdGVkIGluIHRoYXQgc2FtZSBzY3JlZW4gc3BhY2UuXG4gKlxuICogVGhlIGNvbnNlcXVlbmNlIGlzIHdvcnRoIGJlaW5nIGV4cGxpY2l0IGFib3V0OiBhIHNjcmVlbi1zcGFjZSBsYXNzbyBzZWxlY3RzXG4gKiB0aHJvdWdoIHRoZSBXSE9MRSBERVBUSCBvZiB0aGUgY2xvdWQsIGxpa2UgYSBjb29raWUgY3V0dGVyLCBub3QgYSBzbGFiIGF0IHNvbWVcbiAqIGNob3NlbiB6LiBUaGF0IGlzIGluaGVyZW50IHRvIGRyYXdpbmcgb24gYSBmbGF0IHNjcmVlbiwgYW5kIGl0IGlzIHdoYXQgbmFwYXJpXG4gKiBhbmQgZXZlcnkgb3RoZXIgb3JiaXQtY2FtZXJhIHBvaW50IHBpY2tlciBkby4gT3JiaXQgYW5kIGRyYXcgYWdhaW4gdG8gY3V0IGZyb21cbiAqIGFub3RoZXIgYW5nbGUuXG4gKlxuICogYHNjcmVlbmAgaXMgYFt4MCwgeTAsIHgxLCB5MSwg4oCmXWAgaW4gY2FudmFzIHBpeGVscywgYGNvdW50YCBlbnRyaWVzIGxvbmcuIEFuXG4gKiBvYnNlcnZhdGlvbiB0aGUgY2FtZXJhIHB1dHMgYmVoaW5kIHRoZSBleWUgaXMgZ2l2ZW4gTmFOIGJ5IHRoZSBwcm9qZWN0b3IgYW5kXG4gKiBuZXZlciBzZWxlY3RlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdEluUmVnaW9uc1Byb2plY3RlZChcbiAgc2NyZWVuOiBGbG9hdDMyQXJyYXksXG4gIGNvdW50OiBudW1iZXIsXG4gIHJlZ2lvbnM6IHJlYWRvbmx5IFJlZ2lvbltdLFxuKTogU3BhdGlhbFNlbGVjdGlvbk1hc2sge1xuICBjb25zdCBtYXNrID0gbmV3IFVpbnQ4QXJyYXkoY291bnQpO1xuICBjb25zdCBzaGFwZXMgPSByZWdpb25zLmZsYXRNYXAoKHIpID0+IHJlZ2lvblNoYXBlcyhyKSk7XG4gIGlmIChzaGFwZXMubGVuZ3RoID09PSAwKSByZXR1cm4geyBtYXNrLCBjb3VudDogMCB9O1xuXG4gIGxldCBoaXRzID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgY29uc3QgcHggPSBzY3JlZW5baSAqIDJdO1xuICAgIGNvbnN0IHB5ID0gc2NyZWVuW2kgKiAyICsgMV07XG4gICAgLy8gQmVoaW5kIHRoZSBjYW1lcmEsIG9yIG90aGVyd2lzZSB1bnByb2plY3RhYmxlLlxuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHB4KSB8fCAhTnVtYmVyLmlzRmluaXRlKHB5KSkgY29udGludWU7XG4gICAgZm9yIChjb25zdCBzaGFwZSBvZiBzaGFwZXMpIHtcbiAgICAgIGlmICghaW5Cb3VuZHMoc2hhcGUuYm91bmRzLCBweCwgcHkpKSBjb250aW51ZTtcbiAgICAgIGlmIChzaGFwZS5oaXQocHgsIHB5KSkge1xuICAgICAgICBtYXNrW2ldID0gMTtcbiAgICAgICAgaGl0cysrO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgbWFzaywgY291bnQ6IGhpdHMgfTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHR3byBzZWxlY3Rpb25zIGhvbGQgZXhhY3RseSB0aGUgc2FtZSBvYnNlcnZhdGlvbnMuXG4gKlxuICogTGV0cyBhIGNsaWNrIHRvZ2dsZSBhZ2FpbnN0IHRoZSBTRUxFQ1RJT04gcmF0aGVyIHRoYW4gYWdhaW5zdCBhIHJlbWVtYmVyZWRcbiAqIGNsaWNrOiBwaWNraW5nIGEgY2xhc3MgaW4gdGhlIGxlZ2VuZCBhbmQgdGhlbiBjbGlja2luZyB0aGF0IHNhbWUgY2xhc3Mgb24gdGhlXG4gKiBjYW52YXMgc2hvdWxkIGNsZWFyIGl0LCBhbmQgYSByZW1lbWJlcmVkIGNsaWNrIGNhbm5vdCBrbm93IGFib3V0IHRoZSBsZWdlbmQuXG4gKiBDb3VudHMgYXJlIGNvbXBhcmVkIGZpcnN0LCBzbyB0d28gZGlmZmVyZW50IHNlbGVjdGlvbnMgdXN1YWxseSBjb3N0IG5vdGhpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYW1lU2VsZWN0aW9uKGE6IFNwYXRpYWxTZWxlY3Rpb25NYXNrLCBiOiBTcGF0aWFsU2VsZWN0aW9uTWFzayk6IGJvb2xlYW4ge1xuICBpZiAoYS5jb3VudCAhPT0gYi5jb3VudCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoYS5tYXNrLmxlbmd0aCAhPT0gYi5tYXNrLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGEubWFzay5sZW5ndGg7IGkrKykge1xuICAgIC8vIE5vcm1hbGlzZWQgdG8gMC8xOiB0aGUgbWFza3MgYXJlIGZsYWdzLCBhbmQgYSB3cml0ZXIgaXMgZnJlZSB0byB1c2UgYW55XG4gICAgLy8gbm9uLXplcm8gdmFsdWUgZm9yIFwic2VsZWN0ZWRcIi5cbiAgICBpZiAoKGEubWFza1tpXSA/IDEgOiAwKSAhPT0gKGIubWFza1tpXSA/IDEgOiAwKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogRXZlcnkgb2JzZXJ2YXRpb24gd2hvc2UgY2F0ZWdvcmljYWwgY29kZSBlcXVhbHMgYGNvZGVgIOKAlCB0aGUgbGVnZW5kIGNsaWNrLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdEJ5Q2F0ZWdvcnkoY29kZXM6IFVpbnQxNkFycmF5LCBjb2RlOiBudW1iZXIpOiBTcGF0aWFsU2VsZWN0aW9uTWFzayB7XG4gIGNvbnN0IG1hc2sgPSBuZXcgVWludDhBcnJheShjb2Rlcy5sZW5ndGgpO1xuICBsZXQgY291bnQgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGNvZGVzW2ldID09PSBjb2RlKSB7XG4gICAgICBtYXNrW2ldID0gMTtcbiAgICAgIGNvdW50Kys7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IG1hc2ssIGNvdW50IH07XG59XG4iXX0=
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merging and filtering of the spatial-tile wire format (observation ids, NO_CATEGORY): the
|
|
3
|
+
* pieces of the 2D view's tile loop that are pure — concatenating tiles, dropping hidden
|
|
4
|
+
* groups and genes, and the density-grid markers of a zoomed-out gene selection.
|
|
5
|
+
*
|
|
6
|
+
* These work on SIV's own tile contract, so they stay in SIV rather than moving to napari-js.
|
|
7
|
+
*/
|
|
8
|
+
import { NO_CATEGORY, NO_OBSERVATION, } from '../contracts/spatial-dataset.contract';
|
|
9
|
+
/** Rings whose owning cell is in a switched-off group removed. */
|
|
10
|
+
export function filterRings(rings, hidden) {
|
|
11
|
+
if (!hidden)
|
|
12
|
+
return rings;
|
|
13
|
+
const keep = [];
|
|
14
|
+
let vertices = 0;
|
|
15
|
+
for (let i = 0; i < rings.count; i++) {
|
|
16
|
+
const code = hidden.codes[rings.observation[i]];
|
|
17
|
+
if (code !== NO_CATEGORY && hidden.hidden[code])
|
|
18
|
+
continue;
|
|
19
|
+
keep.push(i);
|
|
20
|
+
vertices += rings.offsets[i + 1] - rings.offsets[i];
|
|
21
|
+
}
|
|
22
|
+
if (keep.length === rings.count)
|
|
23
|
+
return rings;
|
|
24
|
+
const observation = new Uint32Array(keep.length);
|
|
25
|
+
const offsets = new Uint32Array(keep.length + 1);
|
|
26
|
+
const coords = new Float32Array(vertices * 2);
|
|
27
|
+
let v = 0;
|
|
28
|
+
keep.forEach((i, r) => {
|
|
29
|
+
observation[r] = rings.observation[i];
|
|
30
|
+
offsets[r] = v;
|
|
31
|
+
const a = rings.offsets[i] * 2;
|
|
32
|
+
const b = rings.offsets[i + 1] * 2;
|
|
33
|
+
coords.set(rings.coords.subarray(a, b), v * 2);
|
|
34
|
+
v += (b - a) / 2;
|
|
35
|
+
});
|
|
36
|
+
offsets[keep.length] = v;
|
|
37
|
+
return { count: keep.length, observation, offsets, coords };
|
|
38
|
+
}
|
|
39
|
+
/** Slots (indices into the selected genes) switched off with their eye toggle. */
|
|
40
|
+
export function hiddenGeneSlots(view) {
|
|
41
|
+
if (!view.transcriptHiddenGenes.length)
|
|
42
|
+
return null;
|
|
43
|
+
const off = new Set(view.transcriptHiddenGenes);
|
|
44
|
+
return Uint8Array.from(view.transcriptGenes, (g) => (off.has(g) ? 1 : 0));
|
|
45
|
+
}
|
|
46
|
+
/** Entries in a hidden group's cell, or of a hidden gene, removed (with their sizes). */
|
|
47
|
+
export function filterTranscripts(t, px, hidden, hiddenGenes) {
|
|
48
|
+
if (!hidden && !hiddenGenes)
|
|
49
|
+
return { merged: t, px };
|
|
50
|
+
const keep = [];
|
|
51
|
+
for (let i = 0; i < t.count; i++) {
|
|
52
|
+
if (hiddenGenes && hiddenGenes[t.gene[i]])
|
|
53
|
+
continue;
|
|
54
|
+
const o = t.observation[i];
|
|
55
|
+
if (hidden && o !== NO_OBSERVATION) {
|
|
56
|
+
const code = hidden.codes[o];
|
|
57
|
+
if (code !== NO_CATEGORY && hidden.hidden[code])
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
keep.push(i);
|
|
61
|
+
}
|
|
62
|
+
const pick = (a) => {
|
|
63
|
+
const out = new a.constructor(keep.length);
|
|
64
|
+
keep.forEach((i, k) => {
|
|
65
|
+
out[k] = a[i];
|
|
66
|
+
});
|
|
67
|
+
return out;
|
|
68
|
+
};
|
|
69
|
+
return {
|
|
70
|
+
merged: {
|
|
71
|
+
count: keep.length,
|
|
72
|
+
aggregated: t.aggregated,
|
|
73
|
+
x: pick(t.x),
|
|
74
|
+
y: pick(t.y),
|
|
75
|
+
z: pick(t.z),
|
|
76
|
+
weight: pick(t.weight),
|
|
77
|
+
observation: pick(t.observation),
|
|
78
|
+
gene: pick(t.gene),
|
|
79
|
+
},
|
|
80
|
+
px: pick(px),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/** The median of `v`, from a sample of about 1024 values. */
|
|
84
|
+
export function median(v) {
|
|
85
|
+
if (!v.length)
|
|
86
|
+
return 0;
|
|
87
|
+
const step = Math.max(1, Math.floor(v.length / 1024));
|
|
88
|
+
const sample = [];
|
|
89
|
+
for (let i = 0; i < v.length; i += step)
|
|
90
|
+
sample.push(v[i]);
|
|
91
|
+
sample.sort((a, b) => a - b);
|
|
92
|
+
return sample[sample.length >> 1];
|
|
93
|
+
}
|
|
94
|
+
/** Concatenate tiles' rings into one set, dropping rings already seen (a cell straddling
|
|
95
|
+
* two tiles may be listed by both). */
|
|
96
|
+
export function mergePolygonTiles(tiles) {
|
|
97
|
+
const seen = new Set();
|
|
98
|
+
let rings = 0;
|
|
99
|
+
let vertices = 0;
|
|
100
|
+
for (const t of tiles) {
|
|
101
|
+
for (let i = 0; i < t.count; i++) {
|
|
102
|
+
if (seen.has(t.observation[i]))
|
|
103
|
+
continue;
|
|
104
|
+
seen.add(t.observation[i]);
|
|
105
|
+
rings++;
|
|
106
|
+
vertices += t.offsets[i + 1] - t.offsets[i];
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
seen.clear();
|
|
110
|
+
const observation = new Uint32Array(rings);
|
|
111
|
+
const offsets = new Uint32Array(rings + 1);
|
|
112
|
+
const coords = new Float32Array(vertices * 2);
|
|
113
|
+
let r = 0;
|
|
114
|
+
let v = 0;
|
|
115
|
+
for (const t of tiles) {
|
|
116
|
+
for (let i = 0; i < t.count; i++) {
|
|
117
|
+
const o = t.observation[i];
|
|
118
|
+
if (seen.has(o))
|
|
119
|
+
continue;
|
|
120
|
+
seen.add(o);
|
|
121
|
+
observation[r] = o;
|
|
122
|
+
offsets[r] = v;
|
|
123
|
+
const a = t.offsets[i] * 2;
|
|
124
|
+
const b = t.offsets[i + 1] * 2;
|
|
125
|
+
coords.set(t.coords.subarray(a, b), v * 2);
|
|
126
|
+
v += (b - a) / 2;
|
|
127
|
+
r++;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
offsets[rings] = v;
|
|
131
|
+
return { count: rings, observation, offsets, coords };
|
|
132
|
+
}
|
|
133
|
+
/** Concatenate transcript tiles, stopping at `limit` entries. */
|
|
134
|
+
export function mergeTranscriptTiles(tiles, limit = Infinity) {
|
|
135
|
+
let n = 0;
|
|
136
|
+
for (const t of tiles)
|
|
137
|
+
n += t.count;
|
|
138
|
+
n = Math.min(n, limit);
|
|
139
|
+
const out = {
|
|
140
|
+
count: n,
|
|
141
|
+
aggregated: tiles.some((t) => t.aggregated),
|
|
142
|
+
x: new Float32Array(n),
|
|
143
|
+
y: new Float32Array(n),
|
|
144
|
+
z: new Float32Array(n),
|
|
145
|
+
weight: new Uint32Array(n),
|
|
146
|
+
observation: new Uint32Array(n),
|
|
147
|
+
gene: new Uint16Array(n),
|
|
148
|
+
};
|
|
149
|
+
let o = 0;
|
|
150
|
+
for (const t of tiles) {
|
|
151
|
+
const k = Math.min(t.count, n - o);
|
|
152
|
+
if (k <= 0)
|
|
153
|
+
break;
|
|
154
|
+
for (const f of ['x', 'y', 'z', 'weight', 'observation', 'gene']) {
|
|
155
|
+
out[f].set(t[f].subarray(0, k), o);
|
|
156
|
+
}
|
|
157
|
+
o += k;
|
|
158
|
+
}
|
|
159
|
+
return out;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* One marker per (cluster, `bin` square) from per-cluster density grids: the counts of the grid
|
|
163
|
+
* cells inside `area` summed per square, at their count-weighted centre. `slots[c]` is the gene
|
|
164
|
+
* slot whose icon cluster c's markers take.
|
|
165
|
+
*/
|
|
166
|
+
export function clusterMarkers(rasters, slots, bin, area) {
|
|
167
|
+
const x = [];
|
|
168
|
+
const y = [];
|
|
169
|
+
const w = [];
|
|
170
|
+
const gene = [];
|
|
171
|
+
const group = [];
|
|
172
|
+
rasters.forEach((r, c) => {
|
|
173
|
+
const [cw, ch] = r.meta.gridSize;
|
|
174
|
+
const [ox, oy] = r.meta.origin;
|
|
175
|
+
const { rows, cols } = r.meta;
|
|
176
|
+
const c0 = Math.max(0, Math.floor((area.x0 - ox) / cw));
|
|
177
|
+
const c1 = Math.min(cols - 1, Math.floor((area.x1 - ox) / cw));
|
|
178
|
+
const r0 = Math.max(0, Math.floor((area.y0 - oy) / ch));
|
|
179
|
+
const r1 = Math.min(rows - 1, Math.floor((area.y1 - oy) / ch));
|
|
180
|
+
const squares = new Map();
|
|
181
|
+
for (let row = r0; row <= r1; row++) {
|
|
182
|
+
for (let col = c0; col <= c1; col++) {
|
|
183
|
+
const v = r.values[row * cols + col];
|
|
184
|
+
if (!(v > 0))
|
|
185
|
+
continue;
|
|
186
|
+
const cx = ox + (col + 0.5) * cw;
|
|
187
|
+
const cy = oy + (row + 0.5) * ch;
|
|
188
|
+
const key = Math.floor((cy - oy) / bin) * 1e6 + Math.floor((cx - ox) / bin);
|
|
189
|
+
const s = squares.get(key) ?? { n: 0, sx: 0, sy: 0 };
|
|
190
|
+
s.n += v;
|
|
191
|
+
s.sx += v * cx;
|
|
192
|
+
s.sy += v * cy;
|
|
193
|
+
squares.set(key, s);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
for (const s of squares.values()) {
|
|
197
|
+
x.push(s.sx / s.n);
|
|
198
|
+
y.push(s.sy / s.n);
|
|
199
|
+
w.push(Math.round(s.n));
|
|
200
|
+
gene.push(slots[c]);
|
|
201
|
+
group.push(c);
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
const n = w.length;
|
|
205
|
+
return {
|
|
206
|
+
tile: {
|
|
207
|
+
count: n,
|
|
208
|
+
aggregated: true,
|
|
209
|
+
x: Float32Array.from(x),
|
|
210
|
+
y: Float32Array.from(y),
|
|
211
|
+
z: new Float32Array(n),
|
|
212
|
+
weight: Uint32Array.from(w),
|
|
213
|
+
observation: new Uint32Array(n).fill(NO_OBSERVATION),
|
|
214
|
+
gene: Uint16Array.from(gene),
|
|
215
|
+
},
|
|
216
|
+
group: Int32Array.from(group),
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC10aWxlLW1lcmdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zcGF0aWFsL3NwYXRpYWwtdGlsZS1tZXJnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFHSCxPQUFPLEVBQ0wsV0FBVyxFQUNYLGNBQWMsR0FJZixNQUFNLHVDQUF1QyxDQUFDO0FBRy9DLGtFQUFrRTtBQUNsRSxNQUFNLFVBQVUsV0FBVyxDQUN6QixLQUF5QixFQUN6QixNQUF5RDtJQUV6RCxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzFCLE1BQU0sSUFBSSxHQUFhLEVBQUUsQ0FBQztJQUMxQixJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDakIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNyQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRCxJQUFJLElBQUksS0FBSyxXQUFXLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFBRSxTQUFTO1FBQzFELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDYixRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxLQUFLO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDOUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pELE1BQU0sT0FB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Q0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNuQixPQUFPO1FBQ0wsSUFBSSxFQUFFO1lBQ0osS0FBSyxFQUFFLENBQUM7WUFDUixVQUFVLEVBQUUsSUFBSTtZQUNoQixDQUFDLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDdkIsQ0FBQyxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLENBQUMsRUFBRSxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDdEIsTUFBTSxFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzNCLFdBQVcsRUFBRSxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQ3BELElBQUksRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztTQUM3QjtRQUNELEtBQUssRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztLQUM5QixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWVyZ2luZyBhbmQgZmlsdGVyaW5nIG9mIHRoZSBzcGF0aWFsLXRpbGUgd2lyZSBmb3JtYXQgKG9ic2VydmF0aW9uIGlkcywgTk9fQ0FURUdPUlkpOiB0aGVcbiAqIHBpZWNlcyBvZiB0aGUgMkQgdmlldydzIHRpbGUgbG9vcCB0aGF0IGFyZSBwdXJlIOKAlCBjb25jYXRlbmF0aW5nIHRpbGVzLCBkcm9wcGluZyBoaWRkZW5cbiAqIGdyb3VwcyBhbmQgZ2VuZXMsIGFuZCB0aGUgZGVuc2l0eS1ncmlkIG1hcmtlcnMgb2YgYSB6b29tZWQtb3V0IGdlbmUgc2VsZWN0aW9uLlxuICpcbiAqIFRoZXNlIHdvcmsgb24gU0lWJ3Mgb3duIHRpbGUgY29udHJhY3QsIHNvIHRoZXkgc3RheSBpbiBTSVYgcmF0aGVyIHRoYW4gbW92aW5nIHRvIG5hcGFyaS1qcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFNwYXRpYWxWaWV3U3RhdGUgfSBmcm9tICcuLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQge1xuICBOT19DQVRFR09SWSxcbiAgTk9fT0JTRVJWQVRJT04sXG4gIFNwYXRpYWxEZW5zaXR5UmFzdGVyLFxuICBTcGF0aWFsUG9seWdvblRpbGUsXG4gIFNwYXRpYWxUcmFuc2NyaXB0VGlsZSxcbn0gZnJvbSAnLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgdHlwZSB7IERhdGFSZWN0IH0gZnJvbSAnLi9sb2QnO1xuXG4vKiogUmluZ3Mgd2hvc2Ugb3duaW5nIGNlbGwgaXMgaW4gYSBzd2l0Y2hlZC1vZmYgZ3JvdXAgcmVtb3ZlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJSaW5ncyhcbiAgcmluZ3M6IFNwYXRpYWxQb2x5Z29uVGlsZSxcbiAgaGlkZGVuOiB7IGNvZGVzOiBVaW50MTZBcnJheTsgaGlkZGVuOiBVaW50OEFycmF5IH0gfCBudWxsLFxuKTogU3BhdGlhbFBvbHlnb25UaWxlIHtcbiAgaWYgKCFoaWRkZW4pIHJldHVybiByaW5ncztcbiAgY29uc3Qga2VlcDogbnVtYmVyW10gPSBbXTtcbiAgbGV0IHZlcnRpY2VzID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByaW5ncy5jb3VudDsgaSsrKSB7XG4gICAgY29uc3QgY29kZSA9IGhpZGRlbi5jb2Rlc1tyaW5ncy5vYnNlcnZhdGlvbltpXV07XG4gICAgaWYgKGNvZGUgIT09IE5PX0NBVEVHT1JZICYmIGhpZGRlbi5oaWRkZW5bY29kZV0pIGNvbnRpbnVlO1xuICAgIGtlZXAucHVzaChpKTtcbiAgICB2ZXJ0aWNlcyArPSByaW5ncy5vZmZzZXRzW2kgKyAxXSAtIHJpbmdzLm9mZnNldHNbaV07XG4gIH1cbiAgaWYgKGtlZXAubGVuZ3RoID09PSByaW5ncy5jb3VudCkgcmV0dXJuIHJpbmdzO1xuICBjb25zdCBvYnNlcnZhdGlvbiA9IG5ldyBVaW50MzJBcnJheShrZWVwLmxlbmd0aCk7XG4gIGNvbnN0IG9mZnNldHMgPSBuZXcgVWludDMyQXJyYXkoa2VlcC5sZW5ndGggKyAxKTtcbiAgY29uc3QgY29vcmRzID0gbmV3IEZsb2F0MzJBcnJheSh2ZXJ0aWNlcyAqIDIpO1xuICBsZXQgdiA9IDA7XG4gIGtlZXAuZm9yRWFjaCgoaSwgcikgPT4ge1xuICAgIG9ic2VydmF0aW9uW3JdID0gcmluZ3Mub2JzZXJ2YXRpb25baV07XG4gICAgb2Zmc2V0c1tyXSA9IHY7XG4gICAgY29uc3QgYSA9IHJpbmdzLm9mZnNldHNbaV0gKiAyO1xuICAgIGNvbnN0IGIgPSByaW5ncy5vZmZzZXRzW2kgKyAxXSAqIDI7XG4gICAgY29vcmRzLnNldChyaW5ncy5jb29yZHMuc3ViYXJyYXkoYSwgYiksIHYgKiAyKTtcbiAgICB2ICs9IChiIC0gYSkgLyAyO1xuICB9KTtcbiAgb2Zmc2V0c1trZWVwLmxlbmd0aF0gPSB2O1xuICByZXR1cm4geyBjb3VudDoga2VlcC5sZW5ndGgsIG9ic2VydmF0aW9uLCBvZmZzZXRzLCBjb29yZHMgfTtcbn1cblxuLyoqIFNsb3RzIChpbmRpY2VzIGludG8gdGhlIHNlbGVjdGVkIGdlbmVzKSBzd2l0Y2hlZCBvZmYgd2l0aCB0aGVpciBleWUgdG9nZ2xlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhpZGRlbkdlbmVTbG90cyh2aWV3OiBTcGF0aWFsVmlld1N0YXRlKTogVWludDhBcnJheSB8IG51bGwge1xuICBpZiAoIXZpZXcudHJhbnNjcmlwdEhpZGRlbkdlbmVzLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IG9mZiA9IG5ldyBTZXQodmlldy50cmFuc2NyaXB0SGlkZGVuR2VuZXMpO1xuICByZXR1cm4gVWludDhBcnJheS5mcm9tKHZpZXcudHJhbnNjcmlwdEdlbmVzLCAoZykgPT4gKG9mZi5oYXMoZykgPyAxIDogMCkpO1xufVxuXG4vKiogRW50cmllcyBpbiBhIGhpZGRlbiBncm91cCdzIGNlbGwsIG9yIG9mIGEgaGlkZGVuIGdlbmUsIHJlbW92ZWQgKHdpdGggdGhlaXIgc2l6ZXMpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlclRyYW5zY3JpcHRzKFxuICB0OiBTcGF0aWFsVHJhbnNjcmlwdFRpbGUsXG4gIHB4OiBGbG9hdDMyQXJyYXksXG4gIGhpZGRlbjogeyBjb2RlczogVWludDE2QXJyYXk7IGhpZGRlbjogVWludDhBcnJheSB9IHwgbnVsbCxcbiAgaGlkZGVuR2VuZXM6IFVpbnQ4QXJyYXkgfCBudWxsLFxuKTogeyBtZXJnZWQ6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZTsgcHg6IEZsb2F0MzJBcnJheSB9IHtcbiAgaWYgKCFoaWRkZW4gJiYgIWhpZGRlbkdlbmVzKSByZXR1cm4geyBtZXJnZWQ6IHQsIHB4IH07XG4gIGNvbnN0IGtlZXA6IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdC5jb3VudDsgaSsrKSB7XG4gICAgaWYgKGhpZGRlbkdlbmVzICYmIGhpZGRlbkdlbmVzW3QuZ2VuZVtpXV0pIGNvbnRpbnVlO1xuICAgIGNvbnN0IG8gPSB0Lm9ic2VydmF0aW9uW2ldO1xuICAgIGlmIChoaWRkZW4gJiYgbyAhPT0gTk9fT0JTRVJWQVRJT04pIHtcbiAgICAgIGNvbnN0IGNvZGUgPSBoaWRkZW4uY29kZXNbb107XG4gICAgICBpZiAoY29kZSAhPT0gTk9fQ0FURUdPUlkgJiYgaGlkZGVuLmhpZGRlbltjb2RlXSkgY29udGludWU7XG4gICAgfVxuICAgIGtlZXAucHVzaChpKTtcbiAgfVxuICBjb25zdCBwaWNrID0gPFQgZXh0ZW5kcyBGbG9hdDMyQXJyYXkgfCBVaW50MzJBcnJheSB8IFVpbnQxNkFycmF5PihhOiBUKTogVCA9PiB7XG4gICAgY29uc3Qgb3V0ID0gbmV3IChhLmNvbnN0cnVjdG9yIGFzIG5ldyAobjogbnVtYmVyKSA9PiBUKShrZWVwLmxlbmd0aCk7XG4gICAga2VlcC5mb3JFYWNoKChpLCBrKSA9PiB7XG4gICAgICBvdXRba10gPSBhW2ldO1xuICAgIH0pO1xuICAgIHJldHVybiBvdXQ7XG4gIH07XG4gIHJldHVybiB7XG4gICAgbWVyZ2VkOiB7XG4gICAgICBjb3VudDoga2VlcC5sZW5ndGgsXG4gICAgICBhZ2dyZWdhdGVkOiB0LmFnZ3JlZ2F0ZWQsXG4gICAgICB4OiBwaWNrKHQueCksXG4gICAgICB5OiBwaWNrKHQueSksXG4gICAgICB6OiBwaWNrKHQueiksXG4gICAgICB3ZWlnaHQ6IHBpY2sodC53ZWlnaHQpLFxuICAgICAgb2JzZXJ2YXRpb246IHBpY2sodC5vYnNlcnZhdGlvbiksXG4gICAgICBnZW5lOiBwaWNrKHQuZ2VuZSksXG4gICAgfSxcbiAgICBweDogcGljayhweCksXG4gIH07XG59XG5cbi8qKiBUaGUgbWVkaWFuIG9mIGB2YCwgZnJvbSBhIHNhbXBsZSBvZiBhYm91dCAxMDI0IHZhbHVlcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZWRpYW4odjogRmxvYXQzMkFycmF5KTogbnVtYmVyIHtcbiAgaWYgKCF2Lmxlbmd0aCkgcmV0dXJuIDA7XG4gIGNvbnN0IHN0ZXAgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHYubGVuZ3RoIC8gMTAyNCkpO1xuICBjb25zdCBzYW1wbGU6IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdi5sZW5ndGg7IGkgKz0gc3RlcCkgc2FtcGxlLnB1c2godltpXSk7XG4gIHNhbXBsZS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gIHJldHVybiBzYW1wbGVbc2FtcGxlLmxlbmd0aCA+PiAxXTtcbn1cblxuLyoqIENvbmNhdGVuYXRlIHRpbGVzJyByaW5ncyBpbnRvIG9uZSBzZXQsIGRyb3BwaW5nIHJpbmdzIGFscmVhZHkgc2VlbiAoYSBjZWxsIHN0cmFkZGxpbmdcbiAqICB0d28gdGlsZXMgbWF5IGJlIGxpc3RlZCBieSBib3RoKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVBvbHlnb25UaWxlcyh0aWxlczogU3BhdGlhbFBvbHlnb25UaWxlW10pOiBTcGF0aWFsUG9seWdvblRpbGUge1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIGxldCByaW5ncyA9IDA7XG4gIGxldCB2ZXJ0aWNlcyA9IDA7XG4gIGZvciAoY29uc3QgdCBvZiB0aWxlcykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdC5jb3VudDsgaSsrKSB7XG4gICAgICBpZiAoc2Vlbi5oYXModC5vYnNlcnZhdGlvbltpXSkpIGNvbnRpbnVlO1xuICAgICAgc2Vlbi5hZGQodC5vYnNlcnZhdGlvbltpXSk7XG4gICAgICByaW5ncysrO1xuICAgICAgdmVydGljZXMgKz0gdC5vZmZzZXRzW2kgKyAxXSAtIHQub2Zmc2V0c1tpXTtcbiAgICB9XG4gIH1cbiAgc2Vlbi5jbGVhcigpO1xuICBjb25zdCBvYnNlcnZhdGlvbiA9IG5ldyBVaW50MzJBcnJheShyaW5ncyk7XG4gIGNvbnN0IG9mZnNldHMgPSBuZXcgVWludDMyQXJyYXkocmluZ3MgKyAxKTtcbiAgY29uc3QgY29vcmRzID0gbmV3IEZsb2F0MzJBcnJheSh2ZXJ0aWNlcyAqIDIpO1xuICBsZXQgciA9IDA7XG4gIGxldCB2ID0gMDtcbiAgZm9yIChjb25zdCB0IG9mIHRpbGVzKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0LmNvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IG8gPSB0Lm9ic2VydmF0aW9uW2ldO1xuICAgICAgaWYgKHNlZW4uaGFzKG8pKSBjb250aW51ZTtcbiAgICAgIHNlZW4uYWRkKG8pO1xuICAgICAgb2JzZXJ2YXRpb25bcl0gPSBvO1xuICAgICAgb2Zmc2V0c1tyXSA9IHY7XG4gICAgICBjb25zdCBhID0gdC5vZmZzZXRzW2ldICogMjtcbiAgICAgIGNvbnN0IGIgPSB0Lm9mZnNldHNbaSArIDFdICogMjtcbiAgICAgIGNvb3Jkcy5zZXQodC5jb29yZHMuc3ViYXJyYXkoYSwgYiksIHYgKiAyKTtcbiAgICAgIHYgKz0gKGIgLSBhKSAvIDI7XG4gICAgICByKys7XG4gICAgfVxuICB9XG4gIG9mZnNldHNbcmluZ3NdID0gdjtcbiAgcmV0dXJuIHsgY291bnQ6IHJpbmdzLCBvYnNlcnZhdGlvbiwgb2Zmc2V0cywgY29vcmRzIH07XG59XG5cbi8qKiBDb25jYXRlbmF0ZSB0cmFuc2NyaXB0IHRpbGVzLCBzdG9wcGluZyBhdCBgbGltaXRgIGVudHJpZXMuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VUcmFuc2NyaXB0VGlsZXModGlsZXM6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZVtdLCBsaW1pdCA9IEluZmluaXR5KTogU3BhdGlhbFRyYW5zY3JpcHRUaWxlIHtcbiAgbGV0IG4gPSAwO1xuICBmb3IgKGNvbnN0IHQgb2YgdGlsZXMpIG4gKz0gdC5jb3VudDtcbiAgbiA9IE1hdGgubWluKG4sIGxpbWl0KTtcbiAgY29uc3Qgb3V0OiBTcGF0aWFsVHJhbnNjcmlwdFRpbGUgPSB7XG4gICAgY291bnQ6IG4sXG4gICAgYWdncmVnYXRlZDogdGlsZXMuc29tZSgodCkgPT4gdC5hZ2dyZWdhdGVkKSxcbiAgICB4OiBuZXcgRmxvYXQzMkFycmF5KG4pLFxuICAgIHk6IG5ldyBGbG9hdDMyQXJyYXkobiksXG4gICAgejogbmV3IEZsb2F0MzJBcnJheShuKSxcbiAgICB3ZWlnaHQ6IG5ldyBVaW50MzJBcnJheShuKSxcbiAgICBvYnNlcnZhdGlvbjogbmV3IFVpbnQzMkFycmF5KG4pLFxuICAgIGdlbmU6IG5ldyBVaW50MTZBcnJheShuKSxcbiAgfTtcbiAgbGV0IG8gPSAwO1xuICBmb3IgKGNvbnN0IHQgb2YgdGlsZXMpIHtcbiAgICBjb25zdCBrID0gTWF0aC5taW4odC5jb3VudCwgbiAtIG8pO1xuICAgIGlmIChrIDw9IDApIGJyZWFrO1xuICAgIGZvciAoY29uc3QgZiBvZiBbJ3gnLCAneScsICd6JywgJ3dlaWdodCcsICdvYnNlcnZhdGlvbicsICdnZW5lJ10gYXMgY29uc3QpIHtcbiAgICAgIChvdXRbZl0gYXMgRmxvYXQzMkFycmF5KS5zZXQoKHRbZl0gYXMgRmxvYXQzMkFycmF5KS5zdWJhcnJheSgwLCBrKSwgbyk7XG4gICAgfVxuICAgIG8gKz0gaztcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIE9uZSBtYXJrZXIgcGVyIChjbHVzdGVyLCBgYmluYCBzcXVhcmUpIGZyb20gcGVyLWNsdXN0ZXIgZGVuc2l0eSBncmlkczogdGhlIGNvdW50cyBvZiB0aGUgZ3JpZFxuICogY2VsbHMgaW5zaWRlIGBhcmVhYCBzdW1tZWQgcGVyIHNxdWFyZSwgYXQgdGhlaXIgY291bnQtd2VpZ2h0ZWQgY2VudHJlLiBgc2xvdHNbY11gIGlzIHRoZSBnZW5lXG4gKiBzbG90IHdob3NlIGljb24gY2x1c3RlciBjJ3MgbWFya2VycyB0YWtlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2x1c3Rlck1hcmtlcnMoXG4gIHJhc3RlcnM6IFNwYXRpYWxEZW5zaXR5UmFzdGVyW10sXG4gIHNsb3RzOiBudW1iZXJbXSxcbiAgYmluOiBudW1iZXIsXG4gIGFyZWE6IERhdGFSZWN0LFxuKTogeyB0aWxlOiBTcGF0aWFsVHJhbnNjcmlwdFRpbGU7IGdyb3VwOiBJbnQzMkFycmF5IH0ge1xuICBjb25zdCB4OiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCB5OiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCB3OiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBnZW5lOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBncm91cDogbnVtYmVyW10gPSBbXTtcbiAgcmFzdGVycy5mb3JFYWNoKChyLCBjKSA9PiB7XG4gICAgY29uc3QgW2N3LCBjaF0gPSByLm1ldGEuZ3JpZFNpemU7XG4gICAgY29uc3QgW294LCBveV0gPSByLm1ldGEub3JpZ2luO1xuICAgIGNvbnN0IHsgcm93cywgY29scyB9ID0gci5tZXRhO1xuICAgIGNvbnN0IGMwID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcigoYXJlYS54MCAtIG94KSAvIGN3KSk7XG4gICAgY29uc3QgYzEgPSBNYXRoLm1pbihjb2xzIC0gMSwgTWF0aC5mbG9vcigoYXJlYS54MSAtIG94KSAvIGN3KSk7XG4gICAgY29uc3QgcjAgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKChhcmVhLnkwIC0gb3kpIC8gY2gpKTtcbiAgICBjb25zdCByMSA9IE1hdGgubWluKHJvd3MgLSAxLCBNYXRoLmZsb29yKChhcmVhLnkxIC0gb3kpIC8gY2gpKTtcbiAgICBjb25zdCBzcXVhcmVzID0gbmV3IE1hcDxudW1iZXIsIHsgbjogbnVtYmVyOyBzeDogbnVtYmVyOyBzeTogbnVtYmVyIH0+KCk7XG4gICAgZm9yIChsZXQgcm93ID0gcjA7IHJvdyA8PSByMTsgcm93KyspIHtcbiAgICAgIGZvciAobGV0IGNvbCA9IGMwOyBjb2wgPD0gYzE7IGNvbCsrKSB7XG4gICAgICAgIGNvbnN0IHYgPSByLnZhbHVlc1tyb3cgKiBjb2xzICsgY29sXTtcbiAgICAgICAgaWYgKCEodiA+IDApKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgY3ggPSBveCArIChjb2wgKyAwLjUpICogY3c7XG4gICAgICAgIGNvbnN0IGN5ID0gb3kgKyAocm93ICsgMC41KSAqIGNoO1xuICAgICAgICBjb25zdCBrZXkgPSBNYXRoLmZsb29yKChjeSAtIG95KSAvIGJpbikgKiAxZTYgKyBNYXRoLmZsb29yKChjeCAtIG94KSAvIGJpbik7XG4gICAgICAgIGNvbnN0IHMgPSBzcXVhcmVzLmdldChrZXkpID8/IHsgbjogMCwgc3g6IDAsIHN5OiAwIH07XG4gICAgICAgIHMubiArPSB2O1xuICAgICAgICBzLnN4ICs9IHYgKiBjeDtcbiAgICAgICAgcy5zeSArPSB2ICogY3k7XG4gICAgICAgIHNxdWFyZXMuc2V0KGtleSwgcyk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgcyBvZiBzcXVhcmVzLnZhbHVlcygpKSB7XG4gICAgICB4LnB1c2gocy5zeCAvIHMubik7XG4gICAgICB5LnB1c2gocy5zeSAvIHMubik7XG4gICAgICB3LnB1c2goTWF0aC5yb3VuZChzLm4pKTtcbiAgICAgIGdlbmUucHVzaChzbG90c1tjXSk7XG4gICAgICBncm91cC5wdXNoKGMpO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IG4gPSB3Lmxlbmd0aDtcbiAgcmV0dXJuIHtcbiAgICB0aWxlOiB7XG4gICAgICBjb3VudDogbixcbiAgICAgIGFnZ3JlZ2F0ZWQ6IHRydWUsXG4gICAgICB4OiBGbG9hdDMyQXJyYXkuZnJvbSh4KSxcbiAgICAgIHk6IEZsb2F0MzJBcnJheS5mcm9tKHkpLFxuICAgICAgejogbmV3IEZsb2F0MzJBcnJheShuKSxcbiAgICAgIHdlaWdodDogVWludDMyQXJyYXkuZnJvbSh3KSxcbiAgICAgIG9ic2VydmF0aW9uOiBuZXcgVWludDMyQXJyYXkobikuZmlsbChOT19PQlNFUlZBVElPTiksXG4gICAgICBnZW5lOiBVaW50MTZBcnJheS5mcm9tKGdlbmUpLFxuICAgIH0sXG4gICAgZ3JvdXA6IEludDMyQXJyYXkuZnJvbShncm91cCksXG4gIH07XG59XG4iXX0=
|