@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
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { Observable } from 'rxjs';
|
|
3
|
+
import { maskScaleFor, regionToParts, scaleParts } from './mask-raster';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
/**
|
|
6
|
+
* Rasterizes regions to a label-mask PNG in a Web Worker (jit-ui#95), so the
|
|
7
|
+
* full-resolution rasterize and PNG encode never freeze the UI and the job can
|
|
8
|
+
* be cancelled. Component-agnostic: {@link export} returns a cold Observable —
|
|
9
|
+
* subscribing starts a worker, unsubscribing terminates it (cancel), and a
|
|
10
|
+
* worker failure is an error carrying a user-facing message. Whole-slide
|
|
11
|
+
* images are capped to a safe pixel budget (the geometry is scaled to match).
|
|
12
|
+
*/
|
|
13
|
+
export class MaskExportService {
|
|
14
|
+
export(request) {
|
|
15
|
+
return new Observable((subscriber) => {
|
|
16
|
+
const { imageSize: size } = request;
|
|
17
|
+
const scale = maskScaleFor(size.width, size.height);
|
|
18
|
+
const width = Math.max(1, Math.round(size.width * scale));
|
|
19
|
+
const height = Math.max(1, Math.round(size.height * scale));
|
|
20
|
+
subscriber.next({ type: 'planned', width, height, scale });
|
|
21
|
+
const payload = {
|
|
22
|
+
width,
|
|
23
|
+
height,
|
|
24
|
+
originalWidth: size.width,
|
|
25
|
+
originalHeight: size.height,
|
|
26
|
+
scale,
|
|
27
|
+
mode: request.mode,
|
|
28
|
+
sourceName: request.sourceName,
|
|
29
|
+
regions: request.regions.map((r) => scaleParts(regionToParts(r), scale)),
|
|
30
|
+
};
|
|
31
|
+
let worker;
|
|
32
|
+
let closed = false;
|
|
33
|
+
const stop = () => {
|
|
34
|
+
worker?.terminate();
|
|
35
|
+
worker = undefined;
|
|
36
|
+
};
|
|
37
|
+
const fail = (message) => {
|
|
38
|
+
stop();
|
|
39
|
+
subscriber.error(new Error(message));
|
|
40
|
+
};
|
|
41
|
+
// The worker is created asynchronously; a cancel while it loads
|
|
42
|
+
// terminates it as soon as it resolves, before it is sent any work.
|
|
43
|
+
this.createWorker()
|
|
44
|
+
.then((w) => {
|
|
45
|
+
if (closed) {
|
|
46
|
+
w.terminate();
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
worker = w;
|
|
50
|
+
w.onmessage = ({ data }) => {
|
|
51
|
+
switch (data?.type) {
|
|
52
|
+
case 'progress':
|
|
53
|
+
subscriber.next({
|
|
54
|
+
type: 'progress',
|
|
55
|
+
percent: data.total ? Math.round((data.done / data.total) * 100) : 0,
|
|
56
|
+
});
|
|
57
|
+
break;
|
|
58
|
+
case 'encoding':
|
|
59
|
+
subscriber.next({ type: 'encoding' });
|
|
60
|
+
break;
|
|
61
|
+
case 'done':
|
|
62
|
+
stop();
|
|
63
|
+
subscriber.next({ type: 'done', blob: new Blob([data.png], { type: 'image/png' }) });
|
|
64
|
+
subscriber.complete();
|
|
65
|
+
break;
|
|
66
|
+
case 'error':
|
|
67
|
+
fail(data.error || 'The mask could not be generated.');
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
w.onerror = () => fail('The mask worker failed.');
|
|
72
|
+
w.postMessage(payload);
|
|
73
|
+
})
|
|
74
|
+
.catch(() => {
|
|
75
|
+
if (!closed)
|
|
76
|
+
fail('The mask worker failed to start.');
|
|
77
|
+
});
|
|
78
|
+
return () => {
|
|
79
|
+
closed = true;
|
|
80
|
+
stop();
|
|
81
|
+
};
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
/** Worker factory: a dynamic import, so the worker module (and its
|
|
85
|
+
* `import.meta.url`, which the CommonJS test compile rejects) loads lazily.
|
|
86
|
+
* Overridable in tests. */
|
|
87
|
+
async createWorker() {
|
|
88
|
+
const { createMaskWorker } = await import('./mask-worker');
|
|
89
|
+
return createMaskWorker();
|
|
90
|
+
}
|
|
91
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: MaskExportService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
92
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: MaskExportService, providedIn: 'root' }); }
|
|
93
|
+
}
|
|
94
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: MaskExportService, decorators: [{
|
|
95
|
+
type: Injectable,
|
|
96
|
+
args: [{ providedIn: 'root' }]
|
|
97
|
+
}] });
|
|
98
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFzay1leHBvcnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVnaW9uLWVkaXRvci9tYXNrLWV4cG9ydC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUdsQyxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBd0J4RTs7Ozs7OztHQU9HO0FBRUgsTUFBTSxPQUFPLGlCQUFpQjtJQUM1QixNQUFNLENBQUMsT0FBMEI7UUFDL0IsT0FBTyxJQUFJLFVBQVUsQ0FBa0IsQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUNwRCxNQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxHQUFHLE9BQU8sQ0FBQztZQUNwQyxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDcEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDMUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDNUQsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBRTNELE1BQU0sT0FBTyxHQUFHO2dCQUNkLEtBQUs7Z0JBQ0wsTUFBTTtnQkFDTixhQUFh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RSxDQUFDO1lBQ1QsQ0FBQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O2dDQUU0QjtJQUNsQixLQUFLLENBQUMsWUFBWTtRQUMxQixNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMzRCxPQUFPLGdCQUFnQixFQUFFLENBQUM7SUFDNUIsQ0FBQzs4R0FqRlUsaUJBQWlCO2tIQUFqQixpQkFBaUIsY0FESixNQUFNOzsyRkFDbkIsaUJBQWlCO2tCQUQ3QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgUmVnaW9uIH0gZnJvbSAnLi4vbW9kZWxzL3JlZ2lvbic7XG5pbXBvcnQgeyBtYXNrU2NhbGVGb3IsIHJlZ2lvblRvUGFydHMsIHNjYWxlUGFydHMgfSBmcm9tICcuL21hc2stcmFzdGVyJztcblxuLyoqIE1hc2sgdHlwZTogb25lIGZvcmVncm91bmQgdmFsdWUsIG9yIGEgZGlzdGluY3QgaWQgcGVyIHJlZ2lvbi4gKi9cbmV4cG9ydCB0eXBlIE1hc2tNb2RlID0gJ2JpbmFyeScgfCAnbXVsdGljbGFzcyc7XG5cbi8qKiBXaGF0IHRvIHJhc3Rlcml6ZSwgYXQgdGhlIGZ1bGwgaW1hZ2Ugc2l6ZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFza0V4cG9ydFJlcXVlc3Qge1xuICByZWdpb25zOiBSZWdpb25bXTtcbiAgaW1hZ2VTaXplOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH07XG4gIG1vZGU6IE1hc2tNb2RlO1xuICAvKiogUmVjb3JkZWQgaW4gdGhlIFBORyBtZXRhZGF0YS4gKi9cbiAgc291cmNlTmFtZT86IHN0cmluZztcbn1cblxuLyoqIFByb2dyZXNzIG9mIG9uZSBtYXNrIGV4cG9ydCwgaW4gb3JkZXI6IHBsYW5uZWQg4oaSIHByb2dyZXNzKiDihpIgZW5jb2Rpbmcg4oaSIGRvbmUuICovXG5leHBvcnQgdHlwZSBNYXNrRXhwb3J0RXZlbnQgPVxuICAvKiogVGhlIG1hc2sgc2l6ZTsgYHNjYWxlYCA8IDEgd2hlbiB0aGUgaW1hZ2UgZXhjZWVkcyB0aGUgcGl4ZWwgYnVkZ2V0LiAqL1xuICB8IHsgdHlwZTogJ3BsYW5uZWQnOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlcjsgc2NhbGU6IG51bWJlciB9XG4gIC8qKiAw4oCTMTAwIHJhc3Rlcml6YXRpb24gcHJvZ3Jlc3MuICovXG4gIHwgeyB0eXBlOiAncHJvZ3Jlc3MnOyBwZXJjZW50OiBudW1iZXIgfVxuICAvKiogUmFzdGVyaXppbmcgZmluaXNoZWQ7IHRoZSBQTkcgaXMgYmVpbmcgZW5jb2RlZC4gKi9cbiAgfCB7IHR5cGU6ICdlbmNvZGluZycgfVxuICB8IHsgdHlwZTogJ2RvbmUnOyBibG9iOiBCbG9iIH07XG5cbi8qKlxuICogUmFzdGVyaXplcyByZWdpb25zIHRvIGEgbGFiZWwtbWFzayBQTkcgaW4gYSBXZWIgV29ya2VyIChqaXQtdWkjOTUpLCBzbyB0aGVcbiAqIGZ1bGwtcmVzb2x1dGlvbiByYXN0ZXJpemUgYW5kIFBORyBlbmNvZGUgbmV2ZXIgZnJlZXplIHRoZSBVSSBhbmQgdGhlIGpvYiBjYW5cbiAqIGJlIGNhbmNlbGxlZC4gQ29tcG9uZW50LWFnbm9zdGljOiB7QGxpbmsgZXhwb3J0fSByZXR1cm5zIGEgY29sZCBPYnNlcnZhYmxlIOKAlFxuICogc3Vic2NyaWJpbmcgc3RhcnRzIGEgd29ya2VyLCB1bnN1YnNjcmliaW5nIHRlcm1pbmF0ZXMgaXQgKGNhbmNlbCksIGFuZCBhXG4gKiB3b3JrZXIgZmFpbHVyZSBpcyBhbiBlcnJvciBjYXJyeWluZyBhIHVzZXItZmFjaW5nIG1lc3NhZ2UuIFdob2xlLXNsaWRlXG4gKiBpbWFnZXMgYXJlIGNhcHBlZCB0byBhIHNhZmUgcGl4ZWwgYnVkZ2V0ICh0aGUgZ2VvbWV0cnkgaXMgc2NhbGVkIHRvIG1hdGNoKS5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBNYXNrRXhwb3J0U2VydmljZSB7XG4gIGV4cG9ydChyZXF1ZXN0OiBNYXNrRXhwb3J0UmVxdWVzdCk6IE9ic2VydmFibGU8TWFza0V4cG9ydEV2ZW50PiB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPE1hc2tFeHBvcnRFdmVudD4oKHN1YnNjcmliZXIpID0+IHtcbiAgICAgIGNvbnN0IHsgaW1hZ2VTaXplOiBzaXplIH0gPSByZXF1ZXN0O1xuICAgICAgY29uc3Qgc2NhbGUgPSBtYXNrU2NhbGVGb3Ioc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpO1xuICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKHNpemUud2lkdGggKiBzY2FsZSkpO1xuICAgICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChzaXplLmhlaWdodCAqIHNjYWxlKSk7XG4gICAgICBzdWJzY3JpYmVyLm5leHQoeyB0eXBlOiAncGxhbm5lZCcsIHdpZHRoLCBoZWlnaHQsIHNjYWxlIH0pO1xuXG4gICAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICBvcmlnaW5hbFdpZHRoOiBzaXplLndpZHRoLFxuICAgICAgICBvcmlnaW5hbEhlaWdodDogc2l6ZS5oZWlnaHQsXG4gICAgICAgIHNjYWxlLFxuICAgICAgICBtb2RlOiByZXF1ZXN0Lm1vZGUsXG4gICAgICAgIHNvdXJjZU5hbWU6IHJlcXVlc3Quc291cmNlTmFtZSxcbiAgICAgICAgcmVnaW9uczogcmVxdWVzdC5yZWdpb25zLm1hcCgocikgPT4gc2NhbGVQYXJ0cyhyZWdpb25Ub1BhcnRzKHIpLCBzY2FsZSkpLFxuICAgICAgfTtcblxuICAgICAgbGV0IHdvcmtlcjogV29ya2VyIHwgdW5kZWZpbmVkO1xuICAgICAgbGV0IGNsb3NlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgc3RvcCA9ICgpID0+IHtcbiAgICAgICAgd29ya2VyPy50ZXJtaW5hdGUoKTtcbiAgICAgICAgd29ya2VyID0gdW5kZWZpbmVkO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGZhaWwgPSAobWVzc2FnZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHN0b3AoKTtcbiAgICAgICAgc3Vic2NyaWJlci5lcnJvcihuZXcgRXJyb3IobWVzc2FnZSkpO1xuICAgICAgfTtcblxuICAgICAgLy8gVGhlIHdvcmtlciBpcyBjcmVhdGVkIGFzeW5jaHJvbm91c2x5OyBhIGNhbmNlbCB3aGlsZSBpdCBsb2Fkc1xuICAgICAgLy8gdGVybWluYXRlcyBpdCBhcyBzb29uIGFzIGl0IHJlc29sdmVzLCBiZWZvcmUgaXQgaXMgc2VudCBhbnkgd29yay5cbiAgICAgIHRoaXMuY3JlYXRlV29ya2VyKClcbiAgICAgICAgLnRoZW4oKHcpID0+IHtcbiAgICAgICAgICBpZiAoY2xvc2VkKSB7XG4gICAgICAgICAgICB3LnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB3b3JrZXIgPSB3O1xuICAgICAgICAgIHcub25tZXNzYWdlID0gKHsgZGF0YSB9OiBNZXNzYWdlRXZlbnQpID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAoZGF0YT8udHlwZSkge1xuICAgICAgICAgICAgICBjYXNlICdwcm9ncmVzcyc6XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdwcm9ncmVzcycsXG4gICAgICAgICAgICAgICAgICBwZXJjZW50OiBkYXRhLnRvdGFsID8gTWF0aC5yb3VuZCgoZGF0YS5kb25lIC8gZGF0YS50b3RhbCkgKiAxMDApIDogMCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnZW5jb2RpbmcnOlxuICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dCh7IHR5cGU6ICdlbmNvZGluZycgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ2RvbmUnOlxuICAgICAgICAgICAgICAgIHN0b3AoKTtcbiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoeyB0eXBlOiAnZG9uZScsIGJsb2I6IG5ldyBCbG9iKFtkYXRhLnBuZ10sIHsgdHlwZTogJ2ltYWdlL3BuZycgfSkgfSk7XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgICAgICAgICAgZmFpbChkYXRhLmVycm9yIHx8ICdUaGUgbWFzayBjb3VsZCBub3QgYmUgZ2VuZXJhdGVkLicpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgdy5vbmVycm9yID0gKCkgPT4gZmFpbCgnVGhlIG1hc2sgd29ya2VyIGZhaWxlZC4nKTtcbiAgICAgICAgICB3LnBvc3RNZXNzYWdlKHBheWxvYWQpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIGlmICghY2xvc2VkKSBmYWlsKCdUaGUgbWFzayB3b3JrZXIgZmFpbGVkIHRvIHN0YXJ0LicpO1xuICAgICAgICB9KTtcblxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgc3RvcCgpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBXb3JrZXIgZmFjdG9yeTogYSBkeW5hbWljIGltcG9ydCwgc28gdGhlIHdvcmtlciBtb2R1bGUgKGFuZCBpdHNcbiAgICogIGBpbXBvcnQubWV0YS51cmxgLCB3aGljaCB0aGUgQ29tbW9uSlMgdGVzdCBjb21waWxlIHJlamVjdHMpIGxvYWRzIGxhemlseS5cbiAgICogIE92ZXJyaWRhYmxlIGluIHRlc3RzLiAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlV29ya2VyKCk6IFByb21pc2U8V29ya2VyPiB7XG4gICAgY29uc3QgeyBjcmVhdGVNYXNrV29ya2VyIH0gPSBhd2FpdCBpbXBvcnQoJy4vbWFzay13b3JrZXInKTtcbiAgICByZXR1cm4gY3JlYXRlTWFza1dvcmtlcigpO1xuICB9XG59XG4iXX0=
|
|
@@ -32,10 +32,12 @@ export function scaleParts(parts, scale) {
|
|
|
32
32
|
export function regionToParts(region) {
|
|
33
33
|
const b = region.bounds;
|
|
34
34
|
if (b instanceof Rectangle) {
|
|
35
|
-
return [
|
|
35
|
+
return [
|
|
36
|
+
{
|
|
36
37
|
xpoints: [b.x, b.x + b.width, b.x + b.width, b.x],
|
|
37
38
|
ypoints: [b.y, b.y, b.y + b.height, b.y + b.height],
|
|
38
|
-
}
|
|
39
|
+
},
|
|
40
|
+
];
|
|
39
41
|
}
|
|
40
42
|
if (b instanceof Polygon) {
|
|
41
43
|
return [{ xpoints: b.xpoints, ypoints: b.ypoints, holes: b.holes }];
|
|
@@ -79,10 +81,14 @@ export function regionsToMask(regions, imageWidth, imageHeight, mode, rasterize,
|
|
|
79
81
|
if (!m)
|
|
80
82
|
continue;
|
|
81
83
|
painted = true;
|
|
82
|
-
|
|
84
|
+
// The raster keeps a region's full extent: paint only its part inside the image (a row
|
|
85
|
+
// offset past either side would wrap into the neighbouring row).
|
|
86
|
+
const x0 = Math.max(0, -m.bx), x1 = Math.min(m.bw, W - m.bx);
|
|
87
|
+
const y0 = Math.max(0, -m.by), y1 = Math.min(m.bh, H - m.by);
|
|
88
|
+
for (let y = y0; y < y1; y++) {
|
|
83
89
|
const srcRow = y * m.bw;
|
|
84
90
|
const dstRow = (m.by + y) * W + m.bx;
|
|
85
|
-
for (let x =
|
|
91
|
+
for (let x = x0; x < x1; x++) {
|
|
86
92
|
if (m.mask[srcRow + x])
|
|
87
93
|
out[dstRow + x] = value;
|
|
88
94
|
}
|
|
@@ -92,4 +98,4 @@ export function regionsToMask(regions, imageWidth, imageHeight, mode, rasterize,
|
|
|
92
98
|
}
|
|
93
99
|
return painted ? { data: out, bitDepth } : null;
|
|
94
100
|
}
|
|
95
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFzay1yYXN0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlZ2lvbi1lZGl0b3IvbWFzay1yYXN0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFVLFNBQVMsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUE4QjVFOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxXQUFXLENBQUM7QUFFM0M7cUNBQ3FDO0FBQ3JDLE1BQU0sVUFBVSxZQUFZLENBQUMsS0FBYSxFQUFFLE1BQWM7SUFDeEQsTUFBTSxLQUFLLEdBQUcsS0FBSyxHQUFHLE1BQU0sQ0FBQztJQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLElBQUksZUFBZTtRQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2xFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDLENBQUM7QUFDNUMsQ0FBQztBQUVEOzt5QkFFeUI7QUFDekIsTUFBTSxVQUFVLFVBQVUsQ0FBQyxLQUFpQixFQUFFLEtBQWE7SUFDekQsSUFBSSxLQUFLLEtBQUssQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzlCLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN2QixPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDeEMsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ3hDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFD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SUFDdEMsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNsRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVnaW9uLCBSZWN0YW5nbGUsIFBvbHlnb24sIE11bHRpUG9seWdvbiB9IGZyb20gJy4uL21vZGVscy9yZWdpb24nO1xuXG4vKiogQSBzaW5nbGUgY2xvc2VkIHJpbmcgKCsgb3B0aW9uYWwgaG9sZXMpIGluIGltYWdlLXBpeGVsIGNvb3JkaW5hdGVzLiBBIHJlZ2lvblxuICogIHJhc3Rlcml6ZXMgYXMgdGhlIHVuaW9uIG9mIGl0cyBwYXJ0cy4gUGxhaW4gZGF0YSBzbyBpdCBzdXJ2aXZlcyBhXG4gKiAgYHBvc3RNZXNzYWdlYCBzdHJ1Y3R1cmVkIGNsb25lIGludG8gdGhlIG1hc2sgd29ya2VyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXNrUGFydCB7XG4gIHhwb2ludHM6IG51bWJlcltdO1xuICB5cG9pbnRzOiBudW1iZXJbXTtcbiAgaG9sZXM/OiBudW1iZXJbXVtdW107XG59XG5cbi8qKiBBIGJib3gtcmVsYXRpdmUgYmluYXJ5IG1hc2ssIGFzIHJldHVybmVkIGJ5IGBXYW5kU2VydmljZS5yYXN0ZXJpemVQb2x5Z29uYC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQkJveE1hc2sge1xuICBieDogbnVtYmVyO1xuICBieTogbnVtYmVyO1xuICBidzogbnVtYmVyO1xuICBiaDogbnVtYmVyO1xuICBtYXNrOiBVaW50OEFycmF5O1xufVxuXG4vKiogUG9seWdvbi1maWxsIGZ1bmN0aW9uICh0aGUgd2FuZCdzIHNjYW5saW5lIHJhc3Rlcml6ZXIpLCBpbmplY3RlZCBzbyB0aGlzXG4gKiAgbW9kdWxlIHN0YXlzIGZyZWUgb2YgQW5ndWxhci9ET00gYW5kIGNhbiBydW4gaW5zaWRlIGEgd29ya2VyLiAqL1xuZXhwb3J0IHR5cGUgUmFzdGVyaXplRm4gPSAoXG4gIHhwb2ludHM6IG51bWJlcltdLFxuICB5cG9pbnRzOiBudW1iZXJbXSxcbiAgaW1hZ2VXaWR0aDogbnVtYmVyLFxuICBpbWFnZUhlaWdodDogbnVtYmVyLFxuICBob2xlcz86IG51bWJlcltdW11bXSxcbikgPT4gQkJveE1hc2sgfCBudWxsO1xuXG4vKipcbiAqIFRoZSBsYXJnZXN0IG1hc2sgd2Ugd2lsbCBhbGxvY2F0ZSwgaW4gcGl4ZWxzLiBBIHNpbmdsZS1jaGFubmVsIDgtYml0IG1hc2sgaXNcbiAqIG9uZSBieXRlIHBlciBwaXhlbCwgc28gdGhpcyBpcyBhbHNvIGl0cyBieXRlIHNpemUuIFdob2xlLXNsaWRlIGxldmVsLTAgaW1hZ2VzXG4gKiAoZS5nLiAxMTkwNDDDlzkwMTEyIOKJiCAxLjA3ZTEwIHB4KSBibG93IHBhc3QgYm90aCB0aGUgSlMgdHlwZWQtYXJyYXkgbGVuZ3RoIGNhcFxuICogKH40LjI5ZTkpIGFuZCBhdmFpbGFibGUgbWVtb3J5LCBzbyBtYXNrcyBmb3IgaW1hZ2VzIGxhcmdlciB0aGFuIHRoaXMgYXJlXG4gKiByYXN0ZXJpemVkIGF0IGEgcHJvcG9ydGlvbmFsbHkgZG93bnNjYWxlZCByZXNvbHV0aW9uLiB+MTAwIE1QIOKJiCAxMDAgTUIuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfTUFTS19QSVhFTFMgPSAxMDBfMDAwXzAwMDtcblxuLyoqIERvd25zY2FsZSBmYWN0b3IgKOKJpCAxKSB0byBrZWVwIGB3aWR0aCAqIGhlaWdodGAgd2l0aGluIHtAbGluayBNQVhfTUFTS19QSVhFTFN9LlxuICogIDEgd2hlbiB0aGUgaW1hZ2UgYWxyZWFkeSBmaXRzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hc2tTY2FsZUZvcih3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IHRvdGFsID0gd2lkdGggKiBoZWlnaHQ7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHRvdGFsKSB8fCB0b3RhbCA8PSBNQVhfTUFTS19QSVhFTFMpIHJldHVybiAxO1xuICByZXR1cm4gTWF0aC5zcXJ0KE1BWF9NQVNLX1BJWEVMUyAvIHRvdGFsKTtcbn1cblxuLyoqIE11bHRpcGx5IGV2ZXJ5IGNvb3JkaW5hdGUgKGFuZCBob2xlIGNvb3JkaW5hdGUpIG9mIGEgcmVnaW9uJ3MgcGFydHMgYnlcbiAqICBgc2NhbGVgLCBmb3IgcmFzdGVyaXppbmcgaW50byBhIGRvd25zY2FsZWQgbWFzay4gUmV0dXJucyB0aGUgcGFydHMgdW5jaGFuZ2VkXG4gKiAgd2hlbiBgc2NhbGVgIGlzIDEuICovXG5leHBvcnQgZnVuY3Rpb24gc2NhbGVQYXJ0cyhwYXJ0czogTWFza1BhcnRbXSwgc2NhbGU6IG51bWJlcik6IE1hc2tQYXJ0W10ge1xuICBpZiAoc2NhbGUgPT09IDEpIHJldHVybiBwYXJ0cztcbiAgcmV0dXJuIHBhcnRzLm1hcCgocCkgPT4gKHtcbiAgICB4cG9pbnRzOiBwLnhwb2ludHMubWFwKCh4KSA9PiB4ICogc2NhbGUpLFxuICAgIHlwb2ludHM6IHAueXBvaW50cy5tYXAoKHkpID0+IHkgKiBzY2FsZSksXG4gICAgaG9sZXM6IHAuaG9sZXM/Lm1hcCgocmluZykgPT4gcmluZy5tYXAoKFt4LCB5XSkgPT4gW3ggKiBzY2FsZSwgeSAqIHNjYWxlXSkpLFxuICB9KSk7XG59XG5cbi8qKiBGbGF0dGVuIGEgcmVnaW9uJ3MgZ2VvbWV0cnkgdG8gcGxhaW4gcmluZ3MuIFJlY3RhbmdsZXMgYmVjb21lIGEgNC1wb2ludCByaW5nO1xuICogIHBvbHlnb25zIGtlZXAgdGhlaXIgcG9pbnRzICsgaG9sZXM7IG11bHRpLXBvbHlnb25zIGV4cGFuZCB0byBvbmUgcGFydCBlYWNoLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lvblRvUGFydHMocmVnaW9uOiBSZWdpb24pOiBNYXNrUGFydFtdIHtcbiAgY29uc3QgYiA9IHJlZ2lvbi5ib3VuZHM7XG4gIGlmIChiIGluc3RhbmNlb2YgUmVjdGFuZ2xlKSB7XG4gICAgcmV0dXJuIFt7XG4gICAgICB4cG9pbnRzOiBbYi54LCBiLnggKyBiLndpZHRoLCBiLnggKyBiLndpZHRoLCBiLnhdLFxuICAgICAgeXBvaW50czogW2IueSwgYi55LCBiLnkgKyBiLmhlaWdodCwgYi55ICsgYi5oZWlnaHRdLFxuICAgIH1dO1xuICB9XG4gIGlmIChiIGluc3RhbmNlb2YgUG9seWdvbikge1xuICAgIHJldHVybiBbeyB4cG9pbnRzOiBiLnhwb2ludHMsIHlwb2ludHM6IGIueXBvaW50cywgaG9sZXM6IGIuaG9sZXMgfV07XG4gIH1cbiAgaWYgKGIgaW5zdGFuY2VvZiBNdWx0aVBvbHlnb24pIHtcbiAgICByZXR1cm4gYi5wb2x5Z29ucy5tYXAoKHApID0+ICh7IHhwb2ludHM6IHAueHBvaW50cywgeXBvaW50czogcC55cG9pbnRzLCBob2xlczogcC5ob2xlcyB9KSk7XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuXG4vKiogQSByYXN0ZXJpemVkIGxhYmVsIG1hc2sgcGx1cyB0aGUgUE5HIGJpdCBkZXB0aCBpdCBzaG91bGQgYmUgZW5jb2RlZCBhdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGFiZWxNYXNrIHtcbiAgZGF0YTogVWludDhBcnJheSB8IFVpbnQxNkFycmF5O1xuICAvKiogOCBmb3Ig4omkMjU1IGRpc3RpbmN0IHZhbHVlcywgMTYgZm9yIGEgbXVsdGktY2xhc3MgbWFzayB3aXRoID4yNTUgcmVnaW9ucy4gKi9cbiAgYml0RGVwdGg6IDggfCAxNjtcbn1cblxuLyoqXG4gKiBSYXN0ZXJpemUgcmVnaW9ucyAoYXMgcGxhaW4gcGFydHMpIHRvIGEgZnVsbCBpbWFnZS1zaXplIGxhYmVsIG1hc2sgKHJvdy1tYWpvcixcbiAqIGBXICogSGAgc2FtcGxlczsgcGl4ZWwgYCh4LCB5KWAgYXQgYHkgKiBXICsgeGApLiBCYWNrZ3JvdW5kIGlzIDAuXG4gKlxuICogLSBgJ2JpbmFyeSdgIOKAlCBldmVyeSByZWdpb24gcGl4ZWwgaXMgMjU1IChzdGFuZGFyZCA4LWJpdCBibGFjay93aGl0ZSBtYXNrOlxuICogICBgPiAwYCA9IGZvcmVncm91bmQ7IGFsc28gZGlyZWN0bHkgdmlld2FibGUpLlxuICogLSBgJ211bHRpY2xhc3MnYCDigJQgZWFjaCByZWdpb24gZ2V0cyBhIGRpc3RpbmN0IDEtYmFzZWQgaWQgKGl0cyBpbmRleCArIDEpLlxuICogICBTdGF5cyA4LWJpdCBmb3Ig4omkMjU1IHJlZ2lvbnM7IHByb21vdGVzIHRvIDE2LWJpdCBiZXlvbmQgdGhhdC4gSWRzIGFyZVxuICogICBkaXN0aW5jdCB1cCB0byB0aGUgMTYtYml0IGNlaWxpbmcgKDY1NTM1IHJlZ2lvbnMpOyBhIHNlbGVjdGlvbiBsYXJnZXIgdGhhblxuICogICB0aGF0IGV4Y2VlZHMgdGhlIFBORydzIHJlcHJlc2VudGFibGUgcmFuZ2UgYW5kIGlkcyB3cmFwIChub3QgYSByZWFsaXN0aWNcbiAqICAgaGFuZC1hbm5vdGF0aW9uIGNhc2UsIGJ1dCBjYWxsZWQgb3V0IHNvIHRoZSBsaW1pdCBpcyBleHBsaWNpdCkuXG4gKlxuICogTGF0ZXIgcmVnaW9ucyBwYWludCBvdmVyIGVhcmxpZXIgb25lcyB3aGVyZSB0aGV5IG92ZXJsYXAuIGBvblByb2dyZXNzYCBpc1xuICogY2FsbGVkIGFmdGVyIGVhY2ggcmVnaW9uICgxLWJhc2VkKSBzbyBhIGNhbGxlciBjYW4gZHJpdmUgYSBwcm9ncmVzcyBiYXIuXG4gKiBSZXR1cm5zIG51bGwgd2hlbiBub3RoaW5nIHJhc3RlcmlzZXMgKG5vIHJlZ2lvbnMsIHplcm8vaW5zYW5lIHNpemUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaW9uc1RvTWFzayhcbiAgcmVnaW9uczogTWFza1BhcnRbXVtdLFxuICBpbWFnZVdpZHRoOiBudW1iZXIsXG4gIGltYWdlSGVpZ2h0OiBudW1iZXIsXG4gIG1vZGU6ICdiaW5hcnknIHwgJ211bHRpY2xhc3MnLFxuICByYXN0ZXJpemU6IFJhc3Rlcml6ZUZuLFxuICBvblByb2dyZXNzPzogKGRvbmU6IG51bWJlciwgdG90YWw6IG51bWJlcikgPT4gdm9pZCxcbik6IExhYmVsTWFzayB8IG51bGwge1xuICBjb25zdCBXID0gTWF0aC5yb3VuZChpbWFnZVdpZHRoKTtcbiAgY29uc3QgSCA9IE1hdGgucm91bmQoaW1hZ2VIZWlnaHQpO1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZShXKSB8fCAhTnVtYmVyLmlzRmluaXRlKEgpIHx8IFcgPD0gMCB8fCBIIDw9IDAgfHwgIXJlZ2lvbnM/Lmxlbmd0aCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgbXVsdGljbGFzcyA9IG1vZGUgPT09ICdtdWx0aWNsYXNzJztcbiAgY29uc3QgYml0RGVwdGg6IDggfCAxNiA9IG11bHRpY2xhc3MgJiYgcmVnaW9ucy5sZW5ndGggPiAyNTUgPyAxNiA6IDg7XG4gIGNvbnN0IG91dDogVWludDhBcnJheSB8IFVpbnQxNkFycmF5ID1cbiAgICBiaXREZXB0aCA9PT0gMTYgPyBuZXcgVWludDE2QXJyYXkoVyAqIEgpIDogbmV3IFVpbnQ4QXJyYXkoVyAqIEgpO1xuICBsZXQgcGFpbnRlZCA9IGZhbHNlO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAvLyBCaW5hcnkg4oaSIDI1NSAodmlld2FibGUsIHN0YW5kYXJkKS4gTXVsdGktY2xhc3Mg4oaSIDEtYmFzZWQgY2xhc3MgaWQuXG4gICAgY29uc3QgdmFsdWUgPSBtdWx0aWNsYXNzID8gaSArIDEgOiAyNTU7XG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHJlZ2lvbnNbaV0pIHtcbiAgICAgIGNvbnN0IG0gPSByYXN0ZXJpemUocGFydC54cG9pbnRzLCBwYXJ0Lnlwb2ludHMsIFcsIEgsIHBhcnQuaG9sZXMpO1xuICAgICAgaWYgKCFtKSBjb250aW51ZTtcbiAgICAgIHBhaW50ZWQgPSB0cnVlO1xuICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBtLmJoOyB5KyspIHtcbiAgICAgICAgY29uc3Qgc3JjUm93ID0geSAqIG0uYnc7XG4gICAgICAgIGNvbnN0IGRzdFJvdyA9IChtLmJ5ICsgeSkgKiBXICsgbS5ieDtcbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBtLmJ3OyB4KyspIHtcbiAgICAgICAgICBpZiAobS5tYXNrW3NyY1JvdyArIHhdKSBvdXRbZHN0Um93ICsgeF0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBvblByb2dyZXNzPy4oaSArIDEsIHJlZ2lvbnMubGVuZ3RoKTtcbiAgfVxuICByZXR1cm4gcGFpbnRlZCA/IHsgZGF0YTogb3V0LCBiaXREZXB0aCB9IDogbnVsbDtcbn1cbiJdfQ==
|
|
101
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFzay1yYXN0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlZ2lvbi1lZGl0b3IvbWFzay1yYXN0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFVLFNBQVMsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUF3QjVFOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxXQUFXLENBQUM7QUFFM0M7cUNBQ3FDO0FBQ3JDLE1BQU0sVUFBVSxZQUFZLENBQUMsS0FBYSxFQUFFLE1BQWM7SUFDeEQsTUFBTSxLQUFLLEdBQUcsS0FBSyxHQUFHLE1BQU0sQ0FBQztJQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLElBQUksZUFBZTtRQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2xFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDLENBQUM7QUFDNUMsQ0FBQztBQUVEOzt5QkFFeUI7QUFDekIsTUFBTSxVQUFVLFVBQVUsQ0FBQyxLQUFpQixFQUFFLEtBQWE7SUFDekQsSUFBSSxLQUFLLEtBQUssQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzlCLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN2QixPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDeEMsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ3hDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFD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QUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNyQyxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7b0JBQzdCLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO3dCQUFFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUNsRCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxVQUFVLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBQ0QsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ2xELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZWdpb24sIFJlY3RhbmdsZSwgUG9seWdvbiwgTXVsdGlQb2x5Z29uIH0gZnJvbSAnLi4vbW9kZWxzL3JlZ2lvbic7XG5pbXBvcnQgdHlwZSB7IEJCb3hNYXNrIH0gZnJvbSAnLi4vZ2VvbWV0cnkvcmFzdGVyJztcblxuZXhwb3J0IHR5cGUgeyBCQm94TWFzayB9O1xuXG4vKiogQSBzaW5nbGUgY2xvc2VkIHJpbmcgKCsgb3B0aW9uYWwgaG9sZXMpIGluIGltYWdlLXBpeGVsIGNvb3JkaW5hdGVzLiBBIHJlZ2lvblxuICogIHJhc3Rlcml6ZXMgYXMgdGhlIHVuaW9uIG9mIGl0cyBwYXJ0cy4gUGxhaW4gZGF0YSBzbyBpdCBzdXJ2aXZlcyBhXG4gKiAgYHBvc3RNZXNzYWdlYCBzdHJ1Y3R1cmVkIGNsb25lIGludG8gdGhlIG1hc2sgd29ya2VyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXNrUGFydCB7XG4gIHhwb2ludHM6IG51bWJlcltdO1xuICB5cG9pbnRzOiBudW1iZXJbXTtcbiAgaG9sZXM/OiBudW1iZXJbXVtdW107XG59XG5cbi8qKiBQb2x5Z29uLWZpbGwgZnVuY3Rpb24gKHRoZSB3YW5kJ3Mgc2NhbmxpbmUgcmFzdGVyaXplciksIGluamVjdGVkIHNvIHRoaXNcbiAqICBtb2R1bGUgc3RheXMgZnJlZSBvZiBBbmd1bGFyL0RPTSBhbmQgY2FuIHJ1biBpbnNpZGUgYSB3b3JrZXIuICovXG5leHBvcnQgdHlwZSBSYXN0ZXJpemVGbiA9IChcbiAgeHBvaW50czogbnVtYmVyW10sXG4gIHlwb2ludHM6IG51bWJlcltdLFxuICBpbWFnZVdpZHRoOiBudW1iZXIsXG4gIGltYWdlSGVpZ2h0OiBudW1iZXIsXG4gIGhvbGVzPzogbnVtYmVyW11bXVtdLFxuKSA9PiBCQm94TWFzayB8IG51bGw7XG5cbi8qKlxuICogVGhlIGxhcmdlc3QgbWFzayB3ZSB3aWxsIGFsbG9jYXRlLCBpbiBwaXhlbHMuIEEgc2luZ2xlLWNoYW5uZWwgOC1iaXQgbWFzayBpc1xuICogb25lIGJ5dGUgcGVyIHBpeGVsLCBzbyB0aGlzIGlzIGFsc28gaXRzIGJ5dGUgc2l6ZS4gV2hvbGUtc2xpZGUgbGV2ZWwtMCBpbWFnZXNcbiAqIChlLmcuIDExOTA0MMOXOTAxMTIg4omIIDEuMDdlMTAgcHgpIGJsb3cgcGFzdCBib3RoIHRoZSBKUyB0eXBlZC1hcnJheSBsZW5ndGggY2FwXG4gKiAofjQuMjllOSkgYW5kIGF2YWlsYWJsZSBtZW1vcnksIHNvIG1hc2tzIGZvciBpbWFnZXMgbGFyZ2VyIHRoYW4gdGhpcyBhcmVcbiAqIHJhc3Rlcml6ZWQgYXQgYSBwcm9wb3J0aW9uYWxseSBkb3duc2NhbGVkIHJlc29sdXRpb24uIH4xMDAgTVAg4omIIDEwMCBNQi5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9NQVNLX1BJWEVMUyA9IDEwMF8wMDBfMDAwO1xuXG4vKiogRG93bnNjYWxlIGZhY3RvciAo4omkIDEpIHRvIGtlZXAgYHdpZHRoICogaGVpZ2h0YCB3aXRoaW4ge0BsaW5rIE1BWF9NQVNLX1BJWEVMU30uXG4gKiAgMSB3aGVuIHRoZSBpbWFnZSBhbHJlYWR5IGZpdHMuICovXG5leHBvcnQgZnVuY3Rpb24gbWFza1NjYWxlRm9yKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgdG90YWwgPSB3aWR0aCAqIGhlaWdodDtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodG90YWwpIHx8IHRvdGFsIDw9IE1BWF9NQVNLX1BJWEVMUykgcmV0dXJuIDE7XG4gIHJldHVybiBNYXRoLnNxcnQoTUFYX01BU0tfUElYRUxTIC8gdG90YWwpO1xufVxuXG4vKiogTXVsdGlwbHkgZXZlcnkgY29vcmRpbmF0ZSAoYW5kIGhvbGUgY29vcmRpbmF0ZSkgb2YgYSByZWdpb24ncyBwYXJ0cyBieVxuICogIGBzY2FsZWAsIGZvciByYXN0ZXJpemluZyBpbnRvIGEgZG93bnNjYWxlZCBtYXNrLiBSZXR1cm5zIHRoZSBwYXJ0cyB1bmNoYW5nZWRcbiAqICB3aGVuIGBzY2FsZWAgaXMgMS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZVBhcnRzKHBhcnRzOiBNYXNrUGFydFtdLCBzY2FsZTogbnVtYmVyKTogTWFza1BhcnRbXSB7XG4gIGlmIChzY2FsZSA9PT0gMSkgcmV0dXJuIHBhcnRzO1xuICByZXR1cm4gcGFydHMubWFwKChwKSA9PiAoe1xuICAgIHhwb2ludHM6IHAueHBvaW50cy5tYXAoKHgpID0+IHggKiBzY2FsZSksXG4gICAgeXBvaW50czogcC55cG9pbnRzLm1hcCgoeSkgPT4geSAqIHNjYWxlKSxcbiAgICBob2xlczogcC5ob2xlcz8ubWFwKChyaW5nKSA9PiByaW5nLm1hcCgoW3gsIHldKSA9PiBbeCAqIHNjYWxlLCB5ICogc2NhbGVdKSksXG4gIH0pKTtcbn1cblxuLyoqIEZsYXR0ZW4gYSByZWdpb24ncyBnZW9tZXRyeSB0byBwbGFpbiByaW5ncy4gUmVjdGFuZ2xlcyBiZWNvbWUgYSA0LXBvaW50IHJpbmc7XG4gKiAgcG9seWdvbnMga2VlcCB0aGVpciBwb2ludHMgKyBob2xlczsgbXVsdGktcG9seWdvbnMgZXhwYW5kIHRvIG9uZSBwYXJ0IGVhY2guICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaW9uVG9QYXJ0cyhyZWdpb246IFJlZ2lvbik6IE1hc2tQYXJ0W10ge1xuICBjb25zdCBiID0gcmVnaW9uLmJvdW5kcztcbiAgaWYgKGIgaW5zdGFuY2VvZiBSZWN0YW5nbGUpIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICB4cG9pbnRzOiBbYi54LCBiLnggKyBiLndpZHRoLCBiLnggKyBiLndpZHRoLCBiLnhdLFxuICAgICAgICB5cG9pbnRzOiBbYi55LCBiLnksIGIueSArIGIuaGVpZ2h0LCBiLnkgKyBiLmhlaWdodF0sXG4gICAgICB9LFxuICAgIF07XG4gIH1cbiAgaWYgKGIgaW5zdGFuY2VvZiBQb2x5Z29uKSB7XG4gICAgcmV0dXJuIFt7IHhwb2ludHM6IGIueHBvaW50cywgeXBvaW50czogYi55cG9pbnRzLCBob2xlczogYi5ob2xlcyB9XTtcbiAgfVxuICBpZiAoYiBpbnN0YW5jZW9mIE11bHRpUG9seWdvbikge1xuICAgIHJldHVybiBiLnBvbHlnb25zLm1hcCgocCkgPT4gKHsgeHBvaW50czogcC54cG9pbnRzLCB5cG9pbnRzOiBwLnlwb2ludHMsIGhvbGVzOiBwLmhvbGVzIH0pKTtcbiAgfVxuICByZXR1cm4gW107XG59XG5cbi8qKiBBIHJhc3Rlcml6ZWQgbGFiZWwgbWFzayBwbHVzIHRoZSBQTkcgYml0IGRlcHRoIGl0IHNob3VsZCBiZSBlbmNvZGVkIGF0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBMYWJlbE1hc2sge1xuICBkYXRhOiBVaW50OEFycmF5IHwgVWludDE2QXJyYXk7XG4gIC8qKiA4IGZvciDiiaQyNTUgZGlzdGluY3QgdmFsdWVzLCAxNiBmb3IgYSBtdWx0aS1jbGFzcyBtYXNrIHdpdGggPjI1NSByZWdpb25zLiAqL1xuICBiaXREZXB0aDogOCB8IDE2O1xufVxuXG4vKipcbiAqIFJhc3Rlcml6ZSByZWdpb25zIChhcyBwbGFpbiBwYXJ0cykgdG8gYSBmdWxsIGltYWdlLXNpemUgbGFiZWwgbWFzayAocm93LW1ham9yLFxuICogYFcgKiBIYCBzYW1wbGVzOyBwaXhlbCBgKHgsIHkpYCBhdCBgeSAqIFcgKyB4YCkuIEJhY2tncm91bmQgaXMgMC5cbiAqXG4gKiAtIGAnYmluYXJ5J2Ag4oCUIGV2ZXJ5IHJlZ2lvbiBwaXhlbCBpcyAyNTUgKHN0YW5kYXJkIDgtYml0IGJsYWNrL3doaXRlIG1hc2s6XG4gKiAgIGA+IDBgID0gZm9yZWdyb3VuZDsgYWxzbyBkaXJlY3RseSB2aWV3YWJsZSkuXG4gKiAtIGAnbXVsdGljbGFzcydgIOKAlCBlYWNoIHJlZ2lvbiBnZXRzIGEgZGlzdGluY3QgMS1iYXNlZCBpZCAoaXRzIGluZGV4ICsgMSkuXG4gKiAgIFN0YXlzIDgtYml0IGZvciDiiaQyNTUgcmVnaW9uczsgcHJvbW90ZXMgdG8gMTYtYml0IGJleW9uZCB0aGF0LiBJZHMgYXJlXG4gKiAgIGRpc3RpbmN0IHVwIHRvIHRoZSAxNi1iaXQgY2VpbGluZyAoNjU1MzUgcmVnaW9ucyk7IGEgc2VsZWN0aW9uIGxhcmdlciB0aGFuXG4gKiAgIHRoYXQgZXhjZWVkcyB0aGUgUE5HJ3MgcmVwcmVzZW50YWJsZSByYW5nZSBhbmQgaWRzIHdyYXAgKG5vdCBhIHJlYWxpc3RpY1xuICogICBoYW5kLWFubm90YXRpb24gY2FzZSwgYnV0IGNhbGxlZCBvdXQgc28gdGhlIGxpbWl0IGlzIGV4cGxpY2l0KS5cbiAqXG4gKiBMYXRlciByZWdpb25zIHBhaW50IG92ZXIgZWFybGllciBvbmVzIHdoZXJlIHRoZXkgb3ZlcmxhcC4gYG9uUHJvZ3Jlc3NgIGlzXG4gKiBjYWxsZWQgYWZ0ZXIgZWFjaCByZWdpb24gKDEtYmFzZWQpIHNvIGEgY2FsbGVyIGNhbiBkcml2ZSBhIHByb2dyZXNzIGJhci5cbiAqIFJldHVybnMgbnVsbCB3aGVuIG5vdGhpbmcgcmFzdGVyaXNlcyAobm8gcmVnaW9ucywgemVyby9pbnNhbmUgc2l6ZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpb25zVG9NYXNrKFxuICByZWdpb25zOiBNYXNrUGFydFtdW10sXG4gIGltYWdlV2lkdGg6IG51bWJlcixcbiAgaW1hZ2VIZWlnaHQ6IG51bWJlcixcbiAgbW9kZTogJ2JpbmFyeScgfCAnbXVsdGljbGFzcycsXG4gIHJhc3Rlcml6ZTogUmFzdGVyaXplRm4sXG4gIG9uUHJvZ3Jlc3M/OiAoZG9uZTogbnVtYmVyLCB0b3RhbDogbnVtYmVyKSA9PiB2b2lkLFxuKTogTGFiZWxNYXNrIHwgbnVsbCB7XG4gIGNvbnN0IFcgPSBNYXRoLnJvdW5kKGltYWdlV2lkdGgpO1xuICBjb25zdCBIID0gTWF0aC5yb3VuZChpbWFnZUhlaWdodCk7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKFcpIHx8ICFOdW1iZXIuaXNGaW5pdGUoSCkgfHwgVyA8PSAwIHx8IEggPD0gMCB8fCAhcmVnaW9ucz8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBtdWx0aWNsYXNzID0gbW9kZSA9PT0gJ211bHRpY2xhc3MnO1xuICBjb25zdCBiaXREZXB0aDogOCB8IDE2ID0gbXVsdGljbGFzcyAmJiByZWdpb25zLmxlbmd0aCA+IDI1NSA/IDE2IDogODtcbiAgY29uc3Qgb3V0OiBVaW50OEFycmF5IHwgVWludDE2QXJyYXkgPSBiaXREZXB0aCA9PT0gMTYgPyBuZXcgVWludDE2QXJyYXkoVyAqIEgpIDogbmV3IFVpbnQ4QXJyYXkoVyAqIEgpO1xuICBsZXQgcGFpbnRlZCA9IGZhbHNlO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAvLyBCaW5hcnkg4oaSIDI1NSAodmlld2FibGUsIHN0YW5kYXJkKS4gTXVsdGktY2xhc3Mg4oaSIDEtYmFzZWQgY2xhc3MgaWQuXG4gICAgY29uc3QgdmFsdWUgPSBtdWx0aWNsYXNzID8gaSArIDEgOiAyNTU7XG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHJlZ2lvbnNbaV0pIHtcbiAgICAgIGNvbnN0IG0gPSByYXN0ZXJpemUocGFydC54cG9pbnRzLCBwYXJ0Lnlwb2ludHMsIFcsIEgsIHBhcnQuaG9sZXMpO1xuICAgICAgaWYgKCFtKSBjb250aW51ZTtcbiAgICAgIHBhaW50ZWQgPSB0cnVlO1xuICAgICAgLy8gVGhlIHJhc3RlciBrZWVwcyBhIHJlZ2lvbidzIGZ1bGwgZXh0ZW50OiBwYWludCBvbmx5IGl0cyBwYXJ0IGluc2lkZSB0aGUgaW1hZ2UgKGEgcm93XG4gICAgICAvLyBvZmZzZXQgcGFzdCBlaXRoZXIgc2lkZSB3b3VsZCB3cmFwIGludG8gdGhlIG5laWdoYm91cmluZyByb3cpLlxuICAgICAgY29uc3QgeDAgPSBNYXRoLm1heCgwLCAtbS5ieCksXG4gICAgICAgIHgxID0gTWF0aC5taW4obS5idywgVyAtIG0uYngpO1xuICAgICAgY29uc3QgeTAgPSBNYXRoLm1heCgwLCAtbS5ieSksXG4gICAgICAgIHkxID0gTWF0aC5taW4obS5iaCwgSCAtIG0uYnkpO1xuICAgICAgZm9yIChsZXQgeSA9IHkwOyB5IDwgeTE7IHkrKykge1xuICAgICAgICBjb25zdCBzcmNSb3cgPSB5ICogbS5idztcbiAgICAgICAgY29uc3QgZHN0Um93ID0gKG0uYnkgKyB5KSAqIFcgKyBtLmJ4O1xuICAgICAgICBmb3IgKGxldCB4ID0geDA7IHggPCB4MTsgeCsrKSB7XG4gICAgICAgICAgaWYgKG0ubWFza1tzcmNSb3cgKyB4XSkgb3V0W2RzdFJvdyArIHhdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgb25Qcm9ncmVzcz8uKGkgKyAxLCByZWdpb25zLmxlbmd0aCk7XG4gIH1cbiAgcmV0dXJuIHBhaW50ZWQgPyB7IGRhdGE6IG91dCwgYml0RGVwdGggfSA6IG51bGw7XG59XG4iXX0=
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { SharedModule } from 'primeng/api';
|
|
4
|
+
import { ButtonModule } from 'primeng/button';
|
|
5
|
+
import { DialogModule } from 'primeng/dialog';
|
|
6
|
+
import { HexColorPickerComponent } from '../../hex-color-picker/hex-color-picker.component';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "@angular/common";
|
|
9
|
+
import * as i2 from "primeng/api";
|
|
10
|
+
import * as i3 from "primeng/button";
|
|
11
|
+
import * as i4 from "primeng/dialog";
|
|
12
|
+
/**
|
|
13
|
+
* "Edit colour of selected regions": one picker per class among the selection.
|
|
14
|
+
* Edits a private copy of `edits` and reports the result on Apply; the editor
|
|
15
|
+
* applies it to the regions (copy-on-write) and commits.
|
|
16
|
+
*/
|
|
17
|
+
export class RegionColorDialogComponent {
|
|
18
|
+
constructor() {
|
|
19
|
+
/** The dialog is open. */
|
|
20
|
+
this.visible = false;
|
|
21
|
+
/** The dialog was closed (`false`); two-way with {@link visible}. */
|
|
22
|
+
this.visibleChange = new EventEmitter();
|
|
23
|
+
/** Number of selected regions, for the caption. */
|
|
24
|
+
this.selectedCount = 0;
|
|
25
|
+
/** Apply clicked: the edited colours per class. */
|
|
26
|
+
this.apply = new EventEmitter();
|
|
27
|
+
this.draft = [];
|
|
28
|
+
}
|
|
29
|
+
/** The seeded colours; the dialog edits a copy. */
|
|
30
|
+
set edits(value) {
|
|
31
|
+
this.draft = (value ?? []).map((e) => ({ ...e }));
|
|
32
|
+
}
|
|
33
|
+
setColor(i, color) {
|
|
34
|
+
this.draft = this.draft.map((e, k) => (k === i ? { ...e, color } : e));
|
|
35
|
+
}
|
|
36
|
+
close() {
|
|
37
|
+
this.visibleChange.emit(false);
|
|
38
|
+
}
|
|
39
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: RegionColorDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
40
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: RegionColorDialogComponent, isStandalone: true, selector: "region-color-dialog", inputs: { visible: "visible", selectedCount: "selectedCount", edits: "edits" }, outputs: { visibleChange: "visibleChange", apply: "apply" }, ngImport: i0, template: "<p-dialog\n header=\"Region colour\"\n [visible]=\"visible\"\n (visibleChange)=\"visibleChange.emit($event)\"\n [modal]=\"false\"\n appendTo=\"body\"\n [style]=\"{ width: '24rem' }\"\n [draggable]=\"true\"\n [resizable]=\"false\"\n>\n <div class=\"flex flex-column gap-3 pt-2\">\n <span\n >Outline colour per class for the <b>{{ selectedCount }}</b> selected region(s):</span\n >\n <div *ngFor=\"let edit of draft; let i = index\" class=\"flex align-items-center gap-3\">\n <span class=\"font-medium flex-1\">{{ edit.label || 'Unclassified' }}</span>\n <hex-color-picker [color]=\"edit.color\" (colorChange)=\"setColor(i, $event)\"></hex-color-picker>\n </div>\n </div>\n <ng-template pTemplate=\"footer\">\n <p-button label=\"Cancel\" icon=\"pi pi-times\" [text]=\"true\" (onClick)=\"close()\"> </p-button>\n <p-button label=\"Apply\" icon=\"pi pi-check\" (onClick)=\"apply.emit(draft)\"> </p-button>\n </ng-template>\n</p-dialog>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: SharedModule }, { kind: "directive", type: i2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i3.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i4.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "visible", "style", "position"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "component", type: HexColorPickerComponent, selector: "hex-color-picker", inputs: ["color"], outputs: ["colorChange", "colorInput"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
41
|
+
}
|
|
42
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: RegionColorDialogComponent, decorators: [{
|
|
43
|
+
type: Component,
|
|
44
|
+
args: [{ selector: 'region-color-dialog', standalone: true, imports: [CommonModule, SharedModule, ButtonModule, DialogModule, HexColorPickerComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<p-dialog\n header=\"Region colour\"\n [visible]=\"visible\"\n (visibleChange)=\"visibleChange.emit($event)\"\n [modal]=\"false\"\n appendTo=\"body\"\n [style]=\"{ width: '24rem' }\"\n [draggable]=\"true\"\n [resizable]=\"false\"\n>\n <div class=\"flex flex-column gap-3 pt-2\">\n <span\n >Outline colour per class for the <b>{{ selectedCount }}</b> selected region(s):</span\n >\n <div *ngFor=\"let edit of draft; let i = index\" class=\"flex align-items-center gap-3\">\n <span class=\"font-medium flex-1\">{{ edit.label || 'Unclassified' }}</span>\n <hex-color-picker [color]=\"edit.color\" (colorChange)=\"setColor(i, $event)\"></hex-color-picker>\n </div>\n </div>\n <ng-template pTemplate=\"footer\">\n <p-button label=\"Cancel\" icon=\"pi pi-times\" [text]=\"true\" (onClick)=\"close()\"> </p-button>\n <p-button label=\"Apply\" icon=\"pi pi-check\" (onClick)=\"apply.emit(draft)\"> </p-button>\n </ng-template>\n</p-dialog>\n" }]
|
|
45
|
+
}], propDecorators: { visible: [{
|
|
46
|
+
type: Input
|
|
47
|
+
}], visibleChange: [{
|
|
48
|
+
type: Output
|
|
49
|
+
}], selectedCount: [{
|
|
50
|
+
type: Input
|
|
51
|
+
}], edits: [{
|
|
52
|
+
type: Input
|
|
53
|
+
}], apply: [{
|
|
54
|
+
type: Output
|
|
55
|
+
}] } });
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLWNvbG9yLWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3JlZ2lvbi1lZGl0b3IvcmVnaW9uLWNvbG9yLWRpYWxvZy9yZWdpb24tY29sb3ItZGlhbG9nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvcmVnaW9uLWVkaXRvci9yZWdpb24tY29sb3ItZGlhbG9nL3JlZ2lvbi1jb2xvci1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMzQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTlDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDOzs7Ozs7QUFRNUY7Ozs7R0FJRztBQVFILE1BQU0sT0FBTywwQkFBMEI7SUFQdkM7UUFRRSwwQkFBMEI7UUFDakIsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUN6QixxRUFBcUU7UUFDM0Qsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBRXRELG1EQUFtRDtRQUMxQyxrQkFBYSxHQUFHLENBQUMsQ0FBQztRQU8zQixtREFBbUQ7UUFDekMsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFvQixDQUFDO1FBRTdDLFVBQUssR0FBcUIsRUFBRSxDQUFDO0tBU3hDO0lBakJDLG1EQUFtRDtJQUNuRCxJQUFhLEtBQUssQ0FBQyxLQUEwQztRQUMzRCxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFPUyxRQUFRLENBQUMsQ0FBUyxFQUFFLEtBQWE7UUFDekMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRVMsS0FBSztRQUNiLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7OEdBekJVLDBCQUEwQjtrR0FBMUIsMEJBQTBCLDROQzFCdkMsbzlCQXdCQSwyQ0RGWSxZQUFZLDJKQUFFLFlBQVkscUlBQUUsWUFBWSw2WEFBRSxZQUFZLHd1QkFBRSx1QkFBdUI7OzJGQUk5RSwwQkFBMEI7a0JBUHRDLFNBQVM7K0JBQ0UscUJBQXFCLGNBQ25CLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSx1QkFBdUIsQ0FBQyxtQkFFekUsdUJBQXVCLENBQUMsTUFBTTs4QkFJdEMsT0FBTztzQkFBZixLQUFLO2dCQUVJLGFBQWE7c0JBQXRCLE1BQU07Z0JBR0UsYUFBYTtzQkFBckIsS0FBSztnQkFHTyxLQUFLO3NCQUFqQixLQUFLO2dCQUtJLEtBQUs7c0JBQWQsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFNoYXJlZE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7IEJ1dHRvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvYnV0dG9uJztcbmltcG9ydCB7IERpYWxvZ01vZHVsZSB9IGZyb20gJ3ByaW1lbmcvZGlhbG9nJztcblxuaW1wb3J0IHsgSGV4Q29sb3JQaWNrZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9oZXgtY29sb3ItcGlja2VyL2hleC1jb2xvci1waWNrZXIuY29tcG9uZW50JztcblxuLyoqIE9uZSBjbGFzcydzIGNvbG91ciBpbiB0aGUgZGlhbG9nOyBgbGFiZWxgICcnIGdyb3VwcyB1bmNsYXNzaWZpZWQgcmVnaW9ucy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xhc3NDb2xvckVkaXQge1xuICBsYWJlbDogc3RyaW5nO1xuICBjb2xvcjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFwiRWRpdCBjb2xvdXIgb2Ygc2VsZWN0ZWQgcmVnaW9uc1wiOiBvbmUgcGlja2VyIHBlciBjbGFzcyBhbW9uZyB0aGUgc2VsZWN0aW9uLlxuICogRWRpdHMgYSBwcml2YXRlIGNvcHkgb2YgYGVkaXRzYCBhbmQgcmVwb3J0cyB0aGUgcmVzdWx0IG9uIEFwcGx5OyB0aGUgZWRpdG9yXG4gKiBhcHBsaWVzIGl0IHRvIHRoZSByZWdpb25zIChjb3B5LW9uLXdyaXRlKSBhbmQgY29tbWl0cy5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncmVnaW9uLWNvbG9yLWRpYWxvZycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFNoYXJlZE1vZHVsZSwgQnV0dG9uTW9kdWxlLCBEaWFsb2dNb2R1bGUsIEhleENvbG9yUGlja2VyQ29tcG9uZW50XSxcbiAgdGVtcGxhdGVVcmw6ICcuL3JlZ2lvbi1jb2xvci1kaWFsb2cuY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgUmVnaW9uQ29sb3JEaWFsb2dDb21wb25lbnQge1xuICAvKiogVGhlIGRpYWxvZyBpcyBvcGVuLiAqL1xuICBASW5wdXQoKSB2aXNpYmxlID0gZmFsc2U7XG4gIC8qKiBUaGUgZGlhbG9nIHdhcyBjbG9zZWQgKGBmYWxzZWApOyB0d28td2F5IHdpdGgge0BsaW5rIHZpc2libGV9LiAqL1xuICBAT3V0cHV0KCkgdmlzaWJsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAvKiogTnVtYmVyIG9mIHNlbGVjdGVkIHJlZ2lvbnMsIGZvciB0aGUgY2FwdGlvbi4gKi9cbiAgQElucHV0KCkgc2VsZWN0ZWRDb3VudCA9IDA7XG5cbiAgLyoqIFRoZSBzZWVkZWQgY29sb3VyczsgdGhlIGRpYWxvZyBlZGl0cyBhIGNvcHkuICovXG4gIEBJbnB1dCgpIHNldCBlZGl0cyh2YWx1ZTogQ2xhc3NDb2xvckVkaXRbXSB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmRyYWZ0ID0gKHZhbHVlID8/IFtdKS5tYXAoKGUpID0+ICh7IC4uLmUgfSkpO1xuICB9XG5cbiAgLyoqIEFwcGx5IGNsaWNrZWQ6IHRoZSBlZGl0ZWQgY29sb3VycyBwZXIgY2xhc3MuICovXG4gIEBPdXRwdXQoKSBhcHBseSA9IG5ldyBFdmVudEVtaXR0ZXI8Q2xhc3NDb2xvckVkaXRbXT4oKTtcblxuICBwcm90ZWN0ZWQgZHJhZnQ6IENsYXNzQ29sb3JFZGl0W10gPSBbXTtcblxuICBwcm90ZWN0ZWQgc2V0Q29sb3IoaTogbnVtYmVyLCBjb2xvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kcmFmdCA9IHRoaXMuZHJhZnQubWFwKChlLCBrKSA9PiAoayA9PT0gaSA/IHsgLi4uZSwgY29sb3IgfSA6IGUpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLnZpc2libGVDaGFuZ2UuZW1pdChmYWxzZSk7XG4gIH1cbn1cbiIsIjxwLWRpYWxvZ1xuICBoZWFkZXI9XCJSZWdpb24gY29sb3VyXCJcbiAgW3Zpc2libGVdPVwidmlzaWJsZVwiXG4gICh2aXNpYmxlQ2hhbmdlKT1cInZpc2libGVDaGFuZ2UuZW1pdCgkZXZlbnQpXCJcbiAgW21vZGFsXT1cImZhbHNlXCJcbiAgYXBwZW5kVG89XCJib2R5XCJcbiAgW3N0eWxlXT1cInsgd2lkdGg6ICcyNHJlbScgfVwiXG4gIFtkcmFnZ2FibGVdPVwidHJ1ZVwiXG4gIFtyZXNpemFibGVdPVwiZmFsc2VcIlxuPlxuICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtbiBnYXAtMyBwdC0yXCI+XG4gICAgPHNwYW5cbiAgICAgID5PdXRsaW5lIGNvbG91ciBwZXIgY2xhc3MgZm9yIHRoZSA8Yj57eyBzZWxlY3RlZENvdW50IH19PC9iPiBzZWxlY3RlZCByZWdpb24ocyk6PC9zcGFuXG4gICAgPlxuICAgIDxkaXYgKm5nRm9yPVwibGV0IGVkaXQgb2YgZHJhZnQ7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0zXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImZvbnQtbWVkaXVtIGZsZXgtMVwiPnt7IGVkaXQubGFiZWwgfHwgJ1VuY2xhc3NpZmllZCcgfX08L3NwYW4+XG4gICAgICA8aGV4LWNvbG9yLXBpY2tlciBbY29sb3JdPVwiZWRpdC5jb2xvclwiIChjb2xvckNoYW5nZSk9XCJzZXRDb2xvcihpLCAkZXZlbnQpXCI+PC9oZXgtY29sb3ItcGlja2VyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZvb3RlclwiPlxuICAgIDxwLWJ1dHRvbiBsYWJlbD1cIkNhbmNlbFwiIGljb249XCJwaSBwaS10aW1lc1wiIFt0ZXh0XT1cInRydWVcIiAob25DbGljayk9XCJjbG9zZSgpXCI+IDwvcC1idXR0b24+XG4gICAgPHAtYnV0dG9uIGxhYmVsPVwiQXBwbHlcIiBpY29uPVwicGkgcGktY2hlY2tcIiAob25DbGljayk9XCJhcHBseS5lbWl0KGRyYWZ0KVwiPiA8L3AtYnV0dG9uPlxuICA8L25nLXRlbXBsYXRlPlxuPC9wLWRpYWxvZz5cbiJdfQ==
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import { SharedModule } from 'primeng/api';
|
|
3
|
+
import { ButtonModule } from 'primeng/button';
|
|
4
|
+
import { DialogModule } from 'primeng/dialog';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "primeng/api";
|
|
7
|
+
import * as i2 from "primeng/button";
|
|
8
|
+
import * as i3 from "primeng/dialog";
|
|
9
|
+
/** The Region Editor's help dialog (static content). */
|
|
10
|
+
export class RegionEditorHelpComponent {
|
|
11
|
+
constructor() {
|
|
12
|
+
/** The dialog is open. */
|
|
13
|
+
this.visible = false;
|
|
14
|
+
/** The dialog was closed (`false`); two-way with {@link visible}. */
|
|
15
|
+
this.visibleChange = new EventEmitter();
|
|
16
|
+
}
|
|
17
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: RegionEditorHelpComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
18
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: RegionEditorHelpComponent, isStandalone: true, selector: "region-editor-help", inputs: { visible: "visible" }, outputs: { visibleChange: "visibleChange" }, ngImport: i0, template: "<p-dialog\n header=\"Region editor help\"\n [visible]=\"visible\"\n (visibleChange)=\"visibleChange.emit($event)\"\n [style]=\"{ width: '50vw' }\"\n [maximizable]=\"true\"\n [draggable]=\"true\"\n appendTo=\"body\"\n>\n <p>\n The Region Editor lists every region drawn on the currently displayed image. Open it with the\n <img src=\"assets/plotting/region-editor.svg\" width=\"14\" height=\"14\" alt=\"Region Editor\" />\n button in the diagram toolbar: it opens as a floating dialog you can drag, resize, and leave open while you\n draw on the image. Regions are tracked <b>per image</b>: switching to another image hides these and shows that\n image's regions; switching back restores them. Edits in the table apply <b>live</b> to the diagram \u2014 there is\n no save or cancel.\n </p>\n\n <h3>Creating regions</h3>\n <p>\n Use the diagram toolbar tools to draw new regions:\n <i class=\"pi pi-stop\"></i> rectangle,\n <img src=\"assets/plotting/polyline.svg\" width=\"14\" height=\"14\" alt=\"\" /> polyline,\n <i class=\"pi pi-pencil\"></i> freeform path, brush, or\n <img src=\"assets/plotting/wand.svg\" width=\"14\" height=\"14\" alt=\"\" /> wand. Anything you draw appears\n immediately in the table, with the class name \"<b>Region</b>\" by default.\n </p>\n\n <h3>The table columns</h3>\n <ul>\n <li>\n <b>Class</b> \u2014 the region's class. Pick a class from the dropdown (its colour follows), or use the\n <i class=\"pi pi-pencil\"></i> for a free-form name.\n </li>\n <li>\n <b>Surface</b> \u2014 the region's area, in \u00B5m\u00B2/mm\u00B2 when the image carries a physical pixel size, otherwise in\n px\u00B2. Holes (donuts) and multi-part regions are accounted for.\n </li>\n <li>The trash icon at the end of a row deletes that one region.</li>\n <li>Use \"<b>x512</b>\" to round all rectangle widths/heights to the nearest multiple of 512.</li>\n </ul>\n <p>\n Region geometry is edited on the diagram itself (drag vertices, the vertex tools, brush/wand, and the\n right-click region actions), not in this table.\n </p>\n\n <h3>Selecting rows</h3>\n <ul>\n <li>\n Click a row to select it. The corresponding region is highlighted in the diagram (Plotly shows its edit\n handles; the OpenSeadragon image view highlights it and shows its handles in select mode).\n </li>\n <li>\n <kbd>Ctrl</kbd>/<kbd>Cmd</kbd>+click to add or remove a row from the selection. <kbd>Shift</kbd>+click to\n extend the selection in a range.\n </li>\n <li>Selecting a region in the diagram highlights the matching row in the table.</li>\n <li>\n Clicks on the colour picker, the trash icon, or the active class-edit input do not change the selection \u2014\n that's standard PrimeNG behaviour.\n </li>\n </ul>\n\n <h3>Bulk actions on the selected rows</h3>\n <ul>\n <li>\n <i class=\"pi pi-check-square\"></i> Select every region in the table at once (also a right-click action on the\n image).\n </li>\n <li><i class=\"pi pi-tags\"></i> Edit the label on every selected row at once.</li>\n <li><i class=\"pi pi-trash\"></i> Delete every selected region \u2014 both from the table and the diagram.</li>\n <li><i class=\"pi pi-times-circle\"></i> Delete every region on this image.</li>\n </ul>\n\n <h3>Annotation classes & colours (presets)</h3>\n <p>\n Preset a class once \u2014 a <b>name</b> and a <b>colour</b> \u2014 and every region with that class name is drawn in\n that colour, <b>including regions loaded from a GeoJSON later</b>. The preset colour is the source of truth: on\n load it <b>overrides the colour stored in the file</b>, so a given annotation type always looks the same across\n images and sessions.\n </p>\n <p>Set up your classes in the annotation-class manager \u2014 <i class=\"pi pi-cog\"></i> <b>Manage</b>:</p>\n <ol>\n <li>\n <b>Add class</b>, then type the class <b>name exactly as it appears in your data</b> (e.g.\n <code>Tumor</code>) and pick its <b>colour</b> from the swatch. Repeat for each class.\n </li>\n <li>\n Optionally: edit the <b>fallback palette</b> (colours given to classes that aren't in your list), toggle\n <b>auto-add</b> (adds unmatched classes found on load), and choose <b>exact</b> vs. <b>normalized</b> name\n matching \u2014 normalized ignores case and surrounding spaces, so <code>tumor</code> matches <code>Tumor</code>.\n </li>\n <li>\n <b>Apply.</b> Presets are saved <b>per user</b> on the server, so they follow you across images and sessions.\n You can also <b>reset to defaults</b> or <b>import / export</b> the set as JSON to share it.\n </li>\n </ol>\n <p>\n Next time you open or <i class=\"pi pi-upload\"></i> import a GeoJSON whose regions carry those class names, each\n region is shown in its preset colour automatically \u2014 no re-colouring needed. A class that isn't in your list\n instead gets a stable colour from the fallback palette.\n </p>\n <p>Day to day:</p>\n <ul>\n <li>\n The <b>class strip</b> above the table lists your presets with their colours. Click a class to make it\n <b>active</b> (new regions inherit it); with rows selected, clicking a class re-classifies them.\n </li>\n <li>\n The <b>Class</b> column dropdown re-classifies one region to a preset (its colour follows), or use the\n <i class=\"pi pi-pencil\"></i> for a free-form name.\n </li>\n <li>\n Recolour a class from its swatch (class strip or Manage) and every region of that class updates at once.\n </li>\n <li>Deleting a class reassigns its regions to the default <b>Region</b> class.</li>\n <li>\n A colour you set on a <b>single</b> region (<i class=\"pi pi-palette\"></i> Selected regions) is kept and is\n not overridden by its class.\n </li>\n </ul>\n\n <h3>Region actions (right-click the diagram)</h3>\n <p>\n Right-click a region \u2014 or the current multi-selection \u2014 on the diagram for the \"Selected region(s)\" actions:\n </p>\n <ul>\n <li>\n <b>Merge / group</b> \u2014 combine 2+ selected regions into one (it may end up multi-part if the pieces don't\n touch).\n </li>\n <li><b>Ungroup</b> \u2014 split a multi-part region back into separate regions.</li>\n <li>\n <b>Inverse</b> \u2014 replace the selection with everything outside it (the regions become holes in the image\n rectangle).\n </li>\n <li>\n <b>Simplify</b> \u2014 reduce the vertex count (Douglas\u2013Peucker) by a pixel threshold; pick a preset or a custom\n value.\n </li>\n <li><b>Convert to B\u00E9zier / to polygon</b> and <b>Delete</b>.</li>\n </ul>\n\n <h3>Display options</h3>\n <ul>\n <li>\n <i class=\"pi pi-tag\"></i> Toggle showing class labels on every region in the diagram (slower with many\n regions).\n </li>\n </ul>\n\n <h3>Import / export</h3>\n <ul>\n <li><i class=\"pi pi-upload\"></i> Import regions from a GeoJSON file.</li>\n <li>\n <i class=\"pi pi-download\"></i> Export the current image's regions to a GeoJSON file. (The per-image cache is\n in-memory only \u2014 exporting is how you persist regions across sessions.)\n </li>\n </ul>\n\n <ng-template pTemplate=\"footer\">\n <p-button icon=\"pi pi-check\" (click)=\"visibleChange.emit(false)\" label=\"Ok\" styleClass=\"p-button-text\">\n </p-button>\n </ng-template>\n</p-dialog>\n", styles: ["kbd{background:#e8e8e8;border:1px solid #bbb;border-radius:3px;padding:1px 5px;font-family:monospace;font-size:.85em}\n"], dependencies: [{ kind: "ngmodule", type: SharedModule }, { kind: "directive", type: i1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i2.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i3.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "visible", "style", "position"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
19
|
+
}
|
|
20
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: RegionEditorHelpComponent, decorators: [{
|
|
21
|
+
type: Component,
|
|
22
|
+
args: [{ selector: 'region-editor-help', standalone: true, imports: [SharedModule, ButtonModule, DialogModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<p-dialog\n header=\"Region editor help\"\n [visible]=\"visible\"\n (visibleChange)=\"visibleChange.emit($event)\"\n [style]=\"{ width: '50vw' }\"\n [maximizable]=\"true\"\n [draggable]=\"true\"\n appendTo=\"body\"\n>\n <p>\n The Region Editor lists every region drawn on the currently displayed image. Open it with the\n <img src=\"assets/plotting/region-editor.svg\" width=\"14\" height=\"14\" alt=\"Region Editor\" />\n button in the diagram toolbar: it opens as a floating dialog you can drag, resize, and leave open while you\n draw on the image. Regions are tracked <b>per image</b>: switching to another image hides these and shows that\n image's regions; switching back restores them. Edits in the table apply <b>live</b> to the diagram \u2014 there is\n no save or cancel.\n </p>\n\n <h3>Creating regions</h3>\n <p>\n Use the diagram toolbar tools to draw new regions:\n <i class=\"pi pi-stop\"></i> rectangle,\n <img src=\"assets/plotting/polyline.svg\" width=\"14\" height=\"14\" alt=\"\" /> polyline,\n <i class=\"pi pi-pencil\"></i> freeform path, brush, or\n <img src=\"assets/plotting/wand.svg\" width=\"14\" height=\"14\" alt=\"\" /> wand. Anything you draw appears\n immediately in the table, with the class name \"<b>Region</b>\" by default.\n </p>\n\n <h3>The table columns</h3>\n <ul>\n <li>\n <b>Class</b> \u2014 the region's class. Pick a class from the dropdown (its colour follows), or use the\n <i class=\"pi pi-pencil\"></i> for a free-form name.\n </li>\n <li>\n <b>Surface</b> \u2014 the region's area, in \u00B5m\u00B2/mm\u00B2 when the image carries a physical pixel size, otherwise in\n px\u00B2. Holes (donuts) and multi-part regions are accounted for.\n </li>\n <li>The trash icon at the end of a row deletes that one region.</li>\n <li>Use \"<b>x512</b>\" to round all rectangle widths/heights to the nearest multiple of 512.</li>\n </ul>\n <p>\n Region geometry is edited on the diagram itself (drag vertices, the vertex tools, brush/wand, and the\n right-click region actions), not in this table.\n </p>\n\n <h3>Selecting rows</h3>\n <ul>\n <li>\n Click a row to select it. The corresponding region is highlighted in the diagram (Plotly shows its edit\n handles; the OpenSeadragon image view highlights it and shows its handles in select mode).\n </li>\n <li>\n <kbd>Ctrl</kbd>/<kbd>Cmd</kbd>+click to add or remove a row from the selection. <kbd>Shift</kbd>+click to\n extend the selection in a range.\n </li>\n <li>Selecting a region in the diagram highlights the matching row in the table.</li>\n <li>\n Clicks on the colour picker, the trash icon, or the active class-edit input do not change the selection \u2014\n that's standard PrimeNG behaviour.\n </li>\n </ul>\n\n <h3>Bulk actions on the selected rows</h3>\n <ul>\n <li>\n <i class=\"pi pi-check-square\"></i> Select every region in the table at once (also a right-click action on the\n image).\n </li>\n <li><i class=\"pi pi-tags\"></i> Edit the label on every selected row at once.</li>\n <li><i class=\"pi pi-trash\"></i> Delete every selected region \u2014 both from the table and the diagram.</li>\n <li><i class=\"pi pi-times-circle\"></i> Delete every region on this image.</li>\n </ul>\n\n <h3>Annotation classes & colours (presets)</h3>\n <p>\n Preset a class once \u2014 a <b>name</b> and a <b>colour</b> \u2014 and every region with that class name is drawn in\n that colour, <b>including regions loaded from a GeoJSON later</b>. The preset colour is the source of truth: on\n load it <b>overrides the colour stored in the file</b>, so a given annotation type always looks the same across\n images and sessions.\n </p>\n <p>Set up your classes in the annotation-class manager \u2014 <i class=\"pi pi-cog\"></i> <b>Manage</b>:</p>\n <ol>\n <li>\n <b>Add class</b>, then type the class <b>name exactly as it appears in your data</b> (e.g.\n <code>Tumor</code>) and pick its <b>colour</b> from the swatch. Repeat for each class.\n </li>\n <li>\n Optionally: edit the <b>fallback palette</b> (colours given to classes that aren't in your list), toggle\n <b>auto-add</b> (adds unmatched classes found on load), and choose <b>exact</b> vs. <b>normalized</b> name\n matching \u2014 normalized ignores case and surrounding spaces, so <code>tumor</code> matches <code>Tumor</code>.\n </li>\n <li>\n <b>Apply.</b> Presets are saved <b>per user</b> on the server, so they follow you across images and sessions.\n You can also <b>reset to defaults</b> or <b>import / export</b> the set as JSON to share it.\n </li>\n </ol>\n <p>\n Next time you open or <i class=\"pi pi-upload\"></i> import a GeoJSON whose regions carry those class names, each\n region is shown in its preset colour automatically \u2014 no re-colouring needed. A class that isn't in your list\n instead gets a stable colour from the fallback palette.\n </p>\n <p>Day to day:</p>\n <ul>\n <li>\n The <b>class strip</b> above the table lists your presets with their colours. Click a class to make it\n <b>active</b> (new regions inherit it); with rows selected, clicking a class re-classifies them.\n </li>\n <li>\n The <b>Class</b> column dropdown re-classifies one region to a preset (its colour follows), or use the\n <i class=\"pi pi-pencil\"></i> for a free-form name.\n </li>\n <li>\n Recolour a class from its swatch (class strip or Manage) and every region of that class updates at once.\n </li>\n <li>Deleting a class reassigns its regions to the default <b>Region</b> class.</li>\n <li>\n A colour you set on a <b>single</b> region (<i class=\"pi pi-palette\"></i> Selected regions) is kept and is\n not overridden by its class.\n </li>\n </ul>\n\n <h3>Region actions (right-click the diagram)</h3>\n <p>\n Right-click a region \u2014 or the current multi-selection \u2014 on the diagram for the \"Selected region(s)\" actions:\n </p>\n <ul>\n <li>\n <b>Merge / group</b> \u2014 combine 2+ selected regions into one (it may end up multi-part if the pieces don't\n touch).\n </li>\n <li><b>Ungroup</b> \u2014 split a multi-part region back into separate regions.</li>\n <li>\n <b>Inverse</b> \u2014 replace the selection with everything outside it (the regions become holes in the image\n rectangle).\n </li>\n <li>\n <b>Simplify</b> \u2014 reduce the vertex count (Douglas\u2013Peucker) by a pixel threshold; pick a preset or a custom\n value.\n </li>\n <li><b>Convert to B\u00E9zier / to polygon</b> and <b>Delete</b>.</li>\n </ul>\n\n <h3>Display options</h3>\n <ul>\n <li>\n <i class=\"pi pi-tag\"></i> Toggle showing class labels on every region in the diagram (slower with many\n regions).\n </li>\n </ul>\n\n <h3>Import / export</h3>\n <ul>\n <li><i class=\"pi pi-upload\"></i> Import regions from a GeoJSON file.</li>\n <li>\n <i class=\"pi pi-download\"></i> Export the current image's regions to a GeoJSON file. (The per-image cache is\n in-memory only \u2014 exporting is how you persist regions across sessions.)\n </li>\n </ul>\n\n <ng-template pTemplate=\"footer\">\n <p-button icon=\"pi pi-check\" (click)=\"visibleChange.emit(false)\" label=\"Ok\" styleClass=\"p-button-text\">\n </p-button>\n </ng-template>\n</p-dialog>\n", styles: ["kbd{background:#e8e8e8;border:1px solid #bbb;border-radius:3px;padding:1px 5px;font-family:monospace;font-size:.85em}\n"] }]
|
|
23
|
+
}], propDecorators: { visible: [{
|
|
24
|
+
type: Input
|
|
25
|
+
}], visibleChange: [{
|
|
26
|
+
type: Output
|
|
27
|
+
}] } });
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLWVkaXRvci1oZWxwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvcmVnaW9uLWVkaXRvci9yZWdpb24tZWRpdG9yLWhlbHAvcmVnaW9uLWVkaXRvci1oZWxwLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvcmVnaW9uLWVkaXRvci9yZWdpb24tZWRpdG9yLWhlbHAvcmVnaW9uLWVkaXRvci1oZWxwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEcsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMzQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7OztBQUU5Qyx3REFBd0Q7QUFTeEQsTUFBTSxPQUFPLHlCQUF5QjtJQVJ0QztRQVNFLDBCQUEwQjtRQUNqQixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLHFFQUFxRTtRQUMzRCxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7S0FDdkQ7OEdBTFkseUJBQXlCO2tHQUF6Qix5QkFBeUIsMkpDZHRDLGk0T0FxS0EsZ0xENUpZLFlBQVkscUlBQUUsWUFBWSw2WEFBRSxZQUFZOzsyRkFLdkMseUJBQXlCO2tCQVJyQyxTQUFTOytCQUNFLG9CQUFvQixjQUNsQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQyxtQkFHbEMsdUJBQXVCLENBQUMsTUFBTTs4QkFJdEMsT0FBTztzQkFBZixLQUFLO2dCQUVJLGFBQWE7c0JBQXRCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFNoYXJlZE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7IEJ1dHRvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvYnV0dG9uJztcbmltcG9ydCB7IERpYWxvZ01vZHVsZSB9IGZyb20gJ3ByaW1lbmcvZGlhbG9nJztcblxuLyoqIFRoZSBSZWdpb24gRWRpdG9yJ3MgaGVscCBkaWFsb2cgKHN0YXRpYyBjb250ZW50KS4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JlZ2lvbi1lZGl0b3ItaGVscCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtTaGFyZWRNb2R1bGUsIEJ1dHRvbk1vZHVsZSwgRGlhbG9nTW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3JlZ2lvbi1lZGl0b3ItaGVscC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3JlZ2lvbi1lZGl0b3ItaGVscC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgUmVnaW9uRWRpdG9ySGVscENvbXBvbmVudCB7XG4gIC8qKiBUaGUgZGlhbG9nIGlzIG9wZW4uICovXG4gIEBJbnB1dCgpIHZpc2libGUgPSBmYWxzZTtcbiAgLyoqIFRoZSBkaWFsb2cgd2FzIGNsb3NlZCAoYGZhbHNlYCk7IHR3by13YXkgd2l0aCB7QGxpbmsgdmlzaWJsZX0uICovXG4gIEBPdXRwdXQoKSB2aXNpYmxlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xufVxuIiwiPHAtZGlhbG9nXG4gIGhlYWRlcj1cIlJlZ2lvbiBlZGl0b3IgaGVscFwiXG4gIFt2aXNpYmxlXT1cInZpc2libGVcIlxuICAodmlzaWJsZUNoYW5nZSk9XCJ2aXNpYmxlQ2hhbmdlLmVtaXQoJGV2ZW50KVwiXG4gIFtzdHlsZV09XCJ7IHdpZHRoOiAnNTB2dycgfVwiXG4gIFttYXhpbWl6YWJsZV09XCJ0cnVlXCJcbiAgW2RyYWdnYWJsZV09XCJ0cnVlXCJcbiAgYXBwZW5kVG89XCJib2R5XCJcbj5cbiAgPHA+XG4gICAgVGhlIFJlZ2lvbiBFZGl0b3IgbGlzdHMgZXZlcnkgcmVnaW9uIGRyYXduIG9uIHRoZSBjdXJyZW50bHkgZGlzcGxheWVkIGltYWdlLiBPcGVuIGl0IHdpdGggdGhlXG4gICAgPGltZyBzcmM9XCJhc3NldHMvcGxvdHRpbmcvcmVnaW9uLWVkaXRvci5zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiBhbHQ9XCJSZWdpb24gRWRpdG9yXCIgLz5cbiAgICBidXR0b24gaW4gdGhlIGRpYWdyYW0gdG9vbGJhcjogaXQgb3BlbnMgYXMgYSBmbG9hdGluZyBkaWFsb2cgeW91IGNhbiBkcmFnLCByZXNpemUsIGFuZCBsZWF2ZSBvcGVuIHdoaWxlIHlvdVxuICAgIGRyYXcgb24gdGhlIGltYWdlLiBSZWdpb25zIGFyZSB0cmFja2VkIDxiPnBlciBpbWFnZTwvYj46IHN3aXRjaGluZyB0byBhbm90aGVyIGltYWdlIGhpZGVzIHRoZXNlIGFuZCBzaG93cyB0aGF0XG4gICAgaW1hZ2UncyByZWdpb25zOyBzd2l0Y2hpbmcgYmFjayByZXN0b3JlcyB0aGVtLiBFZGl0cyBpbiB0aGUgdGFibGUgYXBwbHkgPGI+bGl2ZTwvYj4gdG8gdGhlIGRpYWdyYW0g4oCUIHRoZXJlIGlzXG4gICAgbm8gc2F2ZSBvciBjYW5jZWwuXG4gIDwvcD5cblxuICA8aDM+Q3JlYXRpbmcgcmVnaW9uczwvaDM+XG4gIDxwPlxuICAgIFVzZSB0aGUgZGlhZ3JhbSB0b29sYmFyIHRvb2xzIHRvIGRyYXcgbmV3IHJlZ2lvbnM6XG4gICAgPGkgY2xhc3M9XCJwaSBwaS1zdG9wXCI+PC9pPiByZWN0YW5nbGUsXG4gICAgPGltZyBzcmM9XCJhc3NldHMvcGxvdHRpbmcvcG9seWxpbmUuc3ZnXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgYWx0PVwiXCIgLz4gcG9seWxpbmUsXG4gICAgPGkgY2xhc3M9XCJwaSBwaS1wZW5jaWxcIj48L2k+IGZyZWVmb3JtIHBhdGgsIGJydXNoLCBvclxuICAgIDxpbWcgc3JjPVwiYXNzZXRzL3Bsb3R0aW5nL3dhbmQuc3ZnXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgYWx0PVwiXCIgLz4gd2FuZC4gQW55dGhpbmcgeW91IGRyYXcgYXBwZWFyc1xuICAgIGltbWVkaWF0ZWx5IGluIHRoZSB0YWJsZSwgd2l0aCB0aGUgY2xhc3MgbmFtZSBcIjxiPlJlZ2lvbjwvYj5cIiBieSBkZWZhdWx0LlxuICA8L3A+XG5cbiAgPGgzPlRoZSB0YWJsZSBjb2x1bW5zPC9oMz5cbiAgPHVsPlxuICAgIDxsaT5cbiAgICAgIDxiPkNsYXNzPC9iPiDigJQgdGhlIHJlZ2lvbidzIGNsYXNzLiBQaWNrIGEgY2xhc3MgZnJvbSB0aGUgZHJvcGRvd24gKGl0cyBjb2xvdXIgZm9sbG93cyksIG9yIHVzZSB0aGVcbiAgICAgIDxpIGNsYXNzPVwicGkgcGktcGVuY2lsXCI+PC9pPiBmb3IgYSBmcmVlLWZvcm0gbmFtZS5cbiAgICA8L2xpPlxuICAgIDxsaT5cbiAgICAgIDxiPlN1cmZhY2U8L2I+IOKAlCB0aGUgcmVnaW9uJ3MgYXJlYSwgaW4gwrVtwrIvbW3CsiB3aGVuIHRoZSBpbWFnZSBjYXJyaWVzIGEgcGh5c2ljYWwgcGl4ZWwgc2l6ZSwgb3RoZXJ3aXNlIGluXG4gICAgICBweMKyLiBIb2xlcyAoZG9udXRzKSBhbmQgbXVsdGktcGFydCByZWdpb25zIGFyZSBhY2NvdW50ZWQgZm9yLlxuICAgIDwvbGk+XG4gICAgPGxpPlRoZSB0cmFzaCBpY29uIGF0IHRoZSBlbmQgb2YgYSByb3cgZGVsZXRlcyB0aGF0IG9uZSByZWdpb24uPC9saT5cbiAgICA8bGk+VXNlIFwiPGI+eDUxMjwvYj5cIiB0byByb3VuZCBhbGwgcmVjdGFuZ2xlIHdpZHRocy9oZWlnaHRzIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUxMi48L2xpPlxuICA8L3VsPlxuICA8cD5cbiAgICBSZWdpb24gZ2VvbWV0cnkgaXMgZWRpdGVkIG9uIHRoZSBkaWFncmFtIGl0c2VsZiAoZHJhZyB2ZXJ0aWNlcywgdGhlIHZlcnRleCB0b29scywgYnJ1c2gvd2FuZCwgYW5kIHRoZVxuICAgIHJpZ2h0LWNsaWNrIHJlZ2lvbiBhY3Rpb25zKSwgbm90IGluIHRoaXMgdGFibGUuXG4gIDwvcD5cblxuICA8aDM+U2VsZWN0aW5nIHJvd3M8L2gzPlxuICA8dWw+XG4gICAgPGxpPlxuICAgICAgQ2xpY2sgYSByb3cgdG8gc2VsZWN0IGl0LiBUaGUgY29ycmVzcG9uZGluZyByZWdpb24gaXMgaGlnaGxpZ2h0ZWQgaW4gdGhlIGRpYWdyYW0gKFBsb3RseSBzaG93cyBpdHMgZWRpdFxuICAgICAgaGFuZGxlczsgdGhlIE9wZW5TZWFkcmFnb24gaW1hZ2UgdmlldyBoaWdobGlnaHRzIGl0IGFuZCBzaG93cyBpdHMgaGFuZGxlcyBpbiBzZWxlY3QgbW9kZSkuXG4gICAgPC9saT5cbiAgICA8bGk+XG4gICAgICA8a2JkPkN0cmw8L2tiZD4vPGtiZD5DbWQ8L2tiZD4rY2xpY2sgdG8gYWRkIG9yIHJlbW92ZSBhIHJvdyBmcm9tIHRoZSBzZWxlY3Rpb24uIDxrYmQ+U2hpZnQ8L2tiZD4rY2xpY2sgdG9cbiAgICAgIGV4dGVuZCB0aGUgc2VsZWN0aW9uIGluIGEgcmFuZ2UuXG4gICAgPC9saT5cbiAgICA8bGk+U2VsZWN0aW5nIGEgcmVnaW9uIGluIHRoZSBkaWFncmFtIGhpZ2hsaWdodHMgdGhlIG1hdGNoaW5nIHJvdyBpbiB0aGUgdGFibGUuPC9saT5cbiAgICA8bGk+XG4gICAgICBDbGlja3Mgb24gdGhlIGNvbG91ciBwaWNrZXIsIHRoZSB0cmFzaCBpY29uLCBvciB0aGUgYWN0aXZlIGNsYXNzLWVkaXQgaW5wdXQgZG8gbm90IGNoYW5nZSB0aGUgc2VsZWN0aW9uIOKAlFxuICAgICAgdGhhdCdzIHN0YW5kYXJkIFByaW1lTkcgYmVoYXZpb3VyLlxuICAgIDwvbGk+XG4gIDwvdWw+XG5cbiAgPGgzPkJ1bGsgYWN0aW9ucyBvbiB0aGUgc2VsZWN0ZWQgcm93czwvaDM+XG4gIDx1bD5cbiAgICA8bGk+XG4gICAgICA8aSBjbGFzcz1cInBpIHBpLWNoZWNrLXNxdWFyZVwiPjwvaT4gU2VsZWN0IGV2ZXJ5IHJlZ2lvbiBpbiB0aGUgdGFibGUgYXQgb25jZSAoYWxzbyBhIHJpZ2h0LWNsaWNrIGFjdGlvbiBvbiB0aGVcbiAgICAgIGltYWdlKS5cbiAgICA8L2xpPlxuICAgIDxsaT48aSBjbGFzcz1cInBpIHBpLXRhZ3NcIj48L2k+IEVkaXQgdGhlIGxhYmVsIG9uIGV2ZXJ5IHNlbGVjdGVkIHJvdyBhdCBvbmNlLjwvbGk+XG4gICAgPGxpPjxpIGNsYXNzPVwicGkgcGktdHJhc2hcIj48L2k+IERlbGV0ZSBldmVyeSBzZWxlY3RlZCByZWdpb24g4oCUIGJvdGggZnJvbSB0aGUgdGFibGUgYW5kIHRoZSBkaWFncmFtLjwvbGk+XG4gICAgPGxpPjxpIGNsYXNzPVwicGkgcGktdGltZXMtY2lyY2xlXCI+PC9pPiBEZWxldGUgZXZlcnkgcmVnaW9uIG9uIHRoaXMgaW1hZ2UuPC9saT5cbiAgPC91bD5cblxuICA8aDM+QW5ub3RhdGlvbiBjbGFzc2VzICZhbXA7IGNvbG91cnMgKHByZXNldHMpPC9oMz5cbiAgPHA+XG4gICAgUHJlc2V0IGEgY2xhc3Mgb25jZSDigJQgYSA8Yj5uYW1lPC9iPiBhbmQgYSA8Yj5jb2xvdXI8L2I+IOKAlCBhbmQgZXZlcnkgcmVnaW9uIHdpdGggdGhhdCBjbGFzcyBuYW1lIGlzIGRyYXduIGluXG4gICAgdGhhdCBjb2xvdXIsIDxiPmluY2x1ZGluZyByZWdpb25zIGxvYWRlZCBmcm9tIGEgR2VvSlNPTiBsYXRlcjwvYj4uIFRoZSBwcmVzZXQgY29sb3VyIGlzIHRoZSBzb3VyY2Ugb2YgdHJ1dGg6IG9uXG4gICAgbG9hZCBpdCA8Yj5vdmVycmlkZXMgdGhlIGNvbG91ciBzdG9yZWQgaW4gdGhlIGZpbGU8L2I+LCBzbyBhIGdpdmVuIGFubm90YXRpb24gdHlwZSBhbHdheXMgbG9va3MgdGhlIHNhbWUgYWNyb3NzXG4gICAgaW1hZ2VzIGFuZCBzZXNzaW9ucy5cbiAgPC9wPlxuICA8cD5TZXQgdXAgeW91ciBjbGFzc2VzIGluIHRoZSBhbm5vdGF0aW9uLWNsYXNzIG1hbmFnZXIg4oCUIDxpIGNsYXNzPVwicGkgcGktY29nXCI+PC9pPiA8Yj5NYW5hZ2U8L2I+OjwvcD5cbiAgPG9sPlxuICAgIDxsaT5cbiAgICAgIDxiPkFkZCBjbGFzczwvYj4sIHRoZW4gdHlwZSB0aGUgY2xhc3MgPGI+bmFtZSBleGFjdGx5IGFzIGl0IGFwcGVhcnMgaW4geW91ciBkYXRhPC9iPiAoZS5nLlxuICAgICAgPGNvZGU+VHVtb3I8L2NvZGU+KSBhbmQgcGljayBpdHMgPGI+Y29sb3VyPC9iPiBmcm9tIHRoZSBzd2F0Y2guIFJlcGVhdCBmb3IgZWFjaCBjbGFzcy5cbiAgICA8L2xpPlxuICAgIDxsaT5cbiAgICAgIE9wdGlvbmFsbHk6IGVkaXQgdGhlIDxiPmZhbGxiYWNrIHBhbGV0dGU8L2I+IChjb2xvdXJzIGdpdmVuIHRvIGNsYXNzZXMgdGhhdCBhcmVuJ3QgaW4geW91ciBsaXN0KSwgdG9nZ2xlXG4gICAgICA8Yj5hdXRvLWFkZDwvYj4gKGFkZHMgdW5tYXRjaGVkIGNsYXNzZXMgZm91bmQgb24gbG9hZCksIGFuZCBjaG9vc2UgPGI+ZXhhY3Q8L2I+IHZzLiA8Yj5ub3JtYWxpemVkPC9iPiBuYW1lXG4gICAgICBtYXRjaGluZyDigJQgbm9ybWFsaXplZCBpZ25vcmVzIGNhc2UgYW5kIHN1cnJvdW5kaW5nIHNwYWNlcywgc28gPGNvZGU+dHVtb3I8L2NvZGU+IG1hdGNoZXMgPGNvZGU+VHVtb3I8L2NvZGU+LlxuICAgIDwvbGk+XG4gICAgPGxpPlxuICAgICAgPGI+QXBwbHkuPC9iPiBQcmVzZXRzIGFyZSBzYXZlZCA8Yj5wZXIgdXNlcjwvYj4gb24gdGhlIHNlcnZlciwgc28gdGhleSBmb2xsb3cgeW91IGFjcm9zcyBpbWFnZXMgYW5kIHNlc3Npb25zLlxuICAgICAgWW91IGNhbiBhbHNvIDxiPnJlc2V0IHRvIGRlZmF1bHRzPC9iPiBvciA8Yj5pbXBvcnQgLyBleHBvcnQ8L2I+IHRoZSBzZXQgYXMgSlNPTiB0byBzaGFyZSBpdC5cbiAgICA8L2xpPlxuICA8L29sPlxuICA8cD5cbiAgICBOZXh0IHRpbWUgeW91IG9wZW4gb3IgPGkgY2xhc3M9XCJwaSBwaS11cGxvYWRcIj48L2k+IGltcG9ydCBhIEdlb0pTT04gd2hvc2UgcmVnaW9ucyBjYXJyeSB0aG9zZSBjbGFzcyBuYW1lcywgZWFjaFxuICAgIHJlZ2lvbiBpcyBzaG93biBpbiBpdHMgcHJlc2V0IGNvbG91ciBhdXRvbWF0aWNhbGx5IOKAlCBubyByZS1jb2xvdXJpbmcgbmVlZGVkLiBBIGNsYXNzIHRoYXQgaXNuJ3QgaW4geW91ciBsaXN0XG4gICAgaW5zdGVhZCBnZXRzIGEgc3RhYmxlIGNvbG91ciBmcm9tIHRoZSBmYWxsYmFjayBwYWxldHRlLlxuICA8L3A+XG4gIDxwPkRheSB0byBkYXk6PC9wPlxuICA8dWw+XG4gICAgPGxpPlxuICAgICAgVGhlIDxiPmNsYXNzIHN0cmlwPC9iPiBhYm92ZSB0aGUgdGFibGUgbGlzdHMgeW91ciBwcmVzZXRzIHdpdGggdGhlaXIgY29sb3Vycy4gQ2xpY2sgYSBjbGFzcyB0byBtYWtlIGl0XG4gICAgICA8Yj5hY3RpdmU8L2I+IChuZXcgcmVnaW9ucyBpbmhlcml0IGl0KTsgd2l0aCByb3dzIHNlbGVjdGVkLCBjbGlja2luZyBhIGNsYXNzIHJlLWNsYXNzaWZpZXMgdGhlbS5cbiAgICA8L2xpPlxuICAgIDxsaT5cbiAgICAgIFRoZSA8Yj5DbGFzczwvYj4gY29sdW1uIGRyb3Bkb3duIHJlLWNsYXNzaWZpZXMgb25lIHJlZ2lvbiB0byBhIHByZXNldCAoaXRzIGNvbG91ciBmb2xsb3dzKSwgb3IgdXNlIHRoZVxuICAgICAgPGkgY2xhc3M9XCJwaSBwaS1wZW5jaWxcIj48L2k+IGZvciBhIGZyZWUtZm9ybSBuYW1lLlxuICAgIDwvbGk+XG4gICAgPGxpPlxuICAgICAgUmVjb2xvdXIgYSBjbGFzcyBmcm9tIGl0cyBzd2F0Y2ggKGNsYXNzIHN0cmlwIG9yIE1hbmFnZSkgYW5kIGV2ZXJ5IHJlZ2lvbiBvZiB0aGF0IGNsYXNzIHVwZGF0ZXMgYXQgb25jZS5cbiAgICA8L2xpPlxuICAgIDxsaT5EZWxldGluZyBhIGNsYXNzIHJlYXNzaWducyBpdHMgcmVnaW9ucyB0byB0aGUgZGVmYXVsdCA8Yj5SZWdpb248L2I+IGNsYXNzLjwvbGk+XG4gICAgPGxpPlxuICAgICAgQSBjb2xvdXIgeW91IHNldCBvbiBhIDxiPnNpbmdsZTwvYj4gcmVnaW9uICg8aSBjbGFzcz1cInBpIHBpLXBhbGV0dGVcIj48L2k+IFNlbGVjdGVkIHJlZ2lvbnMpIGlzIGtlcHQgYW5kIGlzXG4gICAgICBub3Qgb3ZlcnJpZGRlbiBieSBpdHMgY2xhc3MuXG4gICAgPC9saT5cbiAgPC91bD5cblxuICA8aDM+UmVnaW9uIGFjdGlvbnMgKHJpZ2h0LWNsaWNrIHRoZSBkaWFncmFtKTwvaDM+XG4gIDxwPlxuICAgIFJpZ2h0LWNsaWNrIGEgcmVnaW9uIOKAlCBvciB0aGUgY3VycmVudCBtdWx0aS1zZWxlY3Rpb24g4oCUIG9uIHRoZSBkaWFncmFtIGZvciB0aGUgXCJTZWxlY3RlZCByZWdpb24ocylcIiBhY3Rpb25zOlxuICA8L3A+XG4gIDx1bD5cbiAgICA8bGk+XG4gICAgICA8Yj5NZXJnZSAvIGdyb3VwPC9iPiDigJQgY29tYmluZSAyKyBzZWxlY3RlZCByZWdpb25zIGludG8gb25lIChpdCBtYXkgZW5kIHVwIG11bHRpLXBhcnQgaWYgdGhlIHBpZWNlcyBkb24ndFxuICAgICAgdG91Y2gpLlxuICAgIDwvbGk+XG4gICAgPGxpPjxiPlVuZ3JvdXA8L2I+IOKAlCBzcGxpdCBhIG11bHRpLXBhcnQgcmVnaW9uIGJhY2sgaW50byBzZXBhcmF0ZSByZWdpb25zLjwvbGk+XG4gICAgPGxpPlxuICAgICAgPGI+SW52ZXJzZTwvYj4g4oCUIHJlcGxhY2UgdGhlIHNlbGVjdGlvbiB3aXRoIGV2ZXJ5dGhpbmcgb3V0c2lkZSBpdCAodGhlIHJlZ2lvbnMgYmVjb21lIGhvbGVzIGluIHRoZSBpbWFnZVxuICAgICAgcmVjdGFuZ2xlKS5cbiAgICA8L2xpPlxuICAgIDxsaT5cbiAgICAgIDxiPlNpbXBsaWZ5PC9iPiDigJQgcmVkdWNlIHRoZSB2ZXJ0ZXggY291bnQgKERvdWdsYXPigJNQZXVja2VyKSBieSBhIHBpeGVsIHRocmVzaG9sZDsgcGljayBhIHByZXNldCBvciBhIGN1c3RvbVxuICAgICAgdmFsdWUuXG4gICAgPC9saT5cbiAgICA8bGk+PGI+Q29udmVydCB0byBCw6l6aWVyIC8gdG8gcG9seWdvbjwvYj4gYW5kIDxiPkRlbGV0ZTwvYj4uPC9saT5cbiAgPC91bD5cblxuICA8aDM+RGlzcGxheSBvcHRpb25zPC9oMz5cbiAgPHVsPlxuICAgIDxsaT5cbiAgICAgIDxpIGNsYXNzPVwicGkgcGktdGFnXCI+PC9pPiBUb2dnbGUgc2hvd2luZyBjbGFzcyBsYWJlbHMgb24gZXZlcnkgcmVnaW9uIGluIHRoZSBkaWFncmFtIChzbG93ZXIgd2l0aCBtYW55XG4gICAgICByZWdpb25zKS5cbiAgICA8L2xpPlxuICA8L3VsPlxuXG4gIDxoMz5JbXBvcnQgLyBleHBvcnQ8L2gzPlxuICA8dWw+XG4gICAgPGxpPjxpIGNsYXNzPVwicGkgcGktdXBsb2FkXCI+PC9pPiBJbXBvcnQgcmVnaW9ucyBmcm9tIGEgR2VvSlNPTiBmaWxlLjwvbGk+XG4gICAgPGxpPlxuICAgICAgPGkgY2xhc3M9XCJwaSBwaS1kb3dubG9hZFwiPjwvaT4gRXhwb3J0IHRoZSBjdXJyZW50IGltYWdlJ3MgcmVnaW9ucyB0byBhIEdlb0pTT04gZmlsZS4gKFRoZSBwZXItaW1hZ2UgY2FjaGUgaXNcbiAgICAgIGluLW1lbW9yeSBvbmx5IOKAlCBleHBvcnRpbmcgaXMgaG93IHlvdSBwZXJzaXN0IHJlZ2lvbnMgYWNyb3NzIHNlc3Npb25zLilcbiAgICA8L2xpPlxuICA8L3VsPlxuXG4gIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJmb290ZXJcIj5cbiAgICA8cC1idXR0b24gaWNvbj1cInBpIHBpLWNoZWNrXCIgKGNsaWNrKT1cInZpc2libGVDaGFuZ2UuZW1pdChmYWxzZSlcIiBsYWJlbD1cIk9rXCIgc3R5bGVDbGFzcz1cInAtYnV0dG9uLXRleHRcIj5cbiAgICA8L3AtYnV0dG9uPlxuICA8L25nLXRlbXBsYXRlPlxuPC9wLWRpYWxvZz5cbiJdfQ==
|