@jax-data-science/sci-image-visualizer 0.8.2 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +201 -460
- package/esm2022/index.mjs +28 -15
- package/esm2022/lib/channel-histogram/channel-histogram.component.mjs +163 -91
- package/esm2022/lib/contracts/capabilities.contract.mjs +4 -3
- package/esm2022/lib/contracts/cell-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +5 -1
- package/esm2022/lib/contracts/color.mjs +60 -0
- package/esm2022/lib/contracts/colormap-lut.mjs +213 -57
- package/esm2022/lib/contracts/coordinate-transform.contract.mjs +1 -1
- package/esm2022/lib/contracts/display-types.mjs +11 -1
- package/esm2022/lib/contracts/instance-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/intensity.mjs +48 -5
- package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
- package/esm2022/lib/contracts/plot-type.mjs +134 -17
- package/esm2022/lib/contracts/ports/image-state.port.mjs +4 -1
- package/esm2022/lib/contracts/ports/preferences.port.mjs +5 -1
- package/esm2022/lib/contracts/ports/region-io.port.mjs +2 -1
- package/esm2022/lib/contracts/ports/spatial-data.port.mjs +5 -1
- package/esm2022/lib/contracts/ports/tile-access.port.mjs +2 -1
- package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
- package/esm2022/lib/contracts/region-overlay.contract.mjs +1 -1
- package/esm2022/lib/contracts/sam.contract.mjs +1 -1
- package/esm2022/lib/contracts/semantic-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/spatial-dataset.contract.mjs +3 -1
- package/esm2022/lib/contracts/toolbar-tool.contract.mjs +6 -4
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/contracts/viz-config.mjs +2 -1
- package/esm2022/lib/geometry/contour.mjs +63 -0
- package/esm2022/lib/geometry/raster.mjs +98 -0
- package/esm2022/lib/geometry/ring.mjs +201 -0
- package/esm2022/lib/hex-color-picker/hex-color-picker.component.mjs +202 -102
- package/esm2022/lib/implementations/base-store-visualizer.mjs +201 -48
- package/esm2022/lib/implementations/napari-js/napari-axes-gizmo.mjs +65 -0
- package/esm2022/lib/implementations/napari-js/napari-display-state.mjs +136 -0
- package/esm2022/lib/implementations/napari-js/napari-helpers.mjs +199 -0
- package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +602 -0
- package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +3 -4
- package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +66 -0
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +157 -591
- package/esm2022/lib/implementations/napari-js/napari-scene.mjs +2 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +614 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +769 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +199 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +263 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +159 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +106 -1408
- package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +2 -2
- package/esm2022/lib/implementations/napari-js/napari-surface-scene.mjs +271 -0
- package/esm2022/lib/implementations/napari-js/napari-tile-client.mjs +562 -0
- package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +344 -0
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +361 -4184
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +439 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-z-handle.mjs +6 -6
- package/esm2022/lib/implementations/napari-js/region-overlay/overlay-projection.mjs +96 -0
- package/esm2022/lib/implementations/napari-js/region-overlay/region-edit.mjs +35 -0
- package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +182 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +30 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +274 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +144 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/layer-groups.mjs +165 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/plan-context.mjs +78 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +182 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +369 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +306 -0
- package/esm2022/lib/implementations/osd/display-pipeline.mjs +102 -40
- package/esm2022/lib/implementations/osd/histogram-sampler.mjs +56 -31
- package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +128 -0
- package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +333 -1685
- package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +1 -1
- package/esm2022/lib/implementations/osd/osd-coords.mjs +5 -6
- package/esm2022/lib/implementations/osd/osd-export.mjs +122 -0
- package/esm2022/lib/implementations/osd/osd-lib.mjs +15 -1
- package/esm2022/lib/implementations/osd/osd-navigator-chrome.mjs +205 -0
- package/esm2022/lib/implementations/osd/osd-pixel-readback.mjs +68 -0
- package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +153 -0
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +185 -718
- package/esm2022/lib/implementations/osd/osd-scale-bar.mjs +52 -60
- package/esm2022/lib/implementations/osd/osd-tile-source.mjs +105 -0
- package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +2 -0
- package/esm2022/lib/implementations/osd/osd-viewer-mount.mjs +44 -0
- package/esm2022/lib/implementations/osd/osd-viewport.mjs +184 -0
- package/esm2022/lib/implementations/osd/osd-zoom.mjs +7 -1
- package/esm2022/lib/implementations/osd/simple-source.mjs +395 -0
- package/esm2022/lib/implementations/osd/slice-cache.mjs +53 -48
- package/esm2022/lib/implementations/osd/tile-client.mjs +32 -11
- package/esm2022/lib/implementations/osd/tile-recolor.mjs +330 -0
- package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +161 -73
- package/esm2022/lib/implementations/plotly/plotly-coordinate-transform.mjs +1 -1
- package/esm2022/lib/implementations/plotly/plotly-image-loader.mjs +112 -0
- package/esm2022/lib/implementations/plotly/plotly-image-recolor.mjs +178 -0
- package/esm2022/lib/implementations/plotly/plotly-intensity-inset.mjs +33 -0
- package/esm2022/lib/implementations/plotly/plotly-isosurface-controls.mjs +83 -0
- package/esm2022/lib/implementations/plotly/plotly-layouts.mjs +121 -0
- package/esm2022/lib/implementations/plotly/plotly-readback.mjs +117 -0
- package/esm2022/lib/implementations/plotly/plotly-region-overlay.mjs +19 -10
- package/esm2022/lib/implementations/plotly/plotly-shape-projection.mjs +223 -0
- package/esm2022/lib/implementations/plotly/plotly-trace-builders.mjs +79 -19
- package/esm2022/lib/implementations/plotly/plotly-zoom-controller.mjs +223 -0
- package/esm2022/lib/implementations/plotly/plotly.service.mjs +439 -1655
- package/esm2022/lib/implementations/region-centroids.mjs +47 -0
- package/esm2022/lib/implementations/simple-slice-access.service.mjs +22 -12
- package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +172 -92
- package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +103 -22
- package/esm2022/lib/implementations/tile-server/index.mjs +6 -0
- package/esm2022/lib/implementations/tile-server/native-histogram.mjs +30 -0
- package/esm2022/lib/implementations/tile-server/poll-descriptor.mjs +65 -0
- package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +42 -0
- package/esm2022/lib/implementations/tile-server/transport.mjs +135 -0
- package/esm2022/lib/intensity/intensity-profile.mjs +107 -0
- package/esm2022/lib/intensity/intensity-profile.service.mjs +223 -0
- package/esm2022/lib/intensity-inset/intensity-inset.component.mjs +133 -0
- package/esm2022/lib/models/bezier.mjs +1 -11
- package/esm2022/lib/models/class-preset.mjs +41 -3
- package/esm2022/lib/models/geometry.mjs +27 -164
- package/esm2022/lib/models/polygon-edit.mjs +254 -0
- package/esm2022/lib/models/polygon-factory.mjs +118 -0
- package/esm2022/lib/models/region-clone.mjs +68 -0
- package/esm2022/lib/models/region-geojson.mjs +373 -0
- package/esm2022/lib/models/region.mjs +34 -33
- package/esm2022/lib/models/shape.mjs +18 -16
- package/esm2022/lib/plot-mode/contribution-host.mjs +297 -0
- package/esm2022/lib/plot-mode/plot-mode-controller.mjs +9 -6
- package/esm2022/lib/plot-mode/plot-type-menu.mjs +85 -0
- package/esm2022/lib/plot-mode/tool-params-model.mjs +87 -0
- package/esm2022/lib/plot.utilities.mjs +296 -473
- package/esm2022/lib/processing/image-crop.mjs +1 -1
- package/esm2022/lib/processing/processing-image.mjs +28 -15
- package/esm2022/lib/provide-visualization.mjs +40 -14
- package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +99 -0
- package/esm2022/lib/region-editor/file-stem.mjs +13 -0
- package/esm2022/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.mjs +118 -0
- package/esm2022/lib/region-editor/mask-export.service.mjs +98 -0
- package/esm2022/lib/region-editor/mask-raster.mjs +11 -5
- package/esm2022/lib/region-editor/region-color-dialog/region-color-dialog.component.mjs +56 -0
- package/esm2022/lib/region-editor/region-editor-help/region-editor-help.component.mjs +28 -0
- package/esm2022/lib/region-editor/region-editor.component.mjs +402 -651
- package/esm2022/lib/region-editor/region-metrics.mjs +68 -0
- package/esm2022/lib/region-editor/region-persistence.service.mjs +134 -0
- package/esm2022/lib/region-editor/region-table/region-table.component.mjs +153 -0
- package/esm2022/lib/region-editor/save-mask-dialog/save-mask-dialog.component.mjs +91 -0
- package/esm2022/lib/region-editor/save-regions-dialog/save-regions-dialog.component.mjs +92 -0
- package/esm2022/lib/region-ops.service.mjs +28 -70
- package/esm2022/lib/region-overlay/region-geometry.mjs +360 -0
- package/esm2022/lib/region-overlay/region-hit-test.mjs +103 -0
- package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
- package/esm2022/lib/render-orchestrator.mjs +14 -11
- package/esm2022/lib/render-session.mjs +207 -0
- package/esm2022/lib/routing-visualizer.service.mjs +459 -411
- package/esm2022/lib/spatial/density-raster.mjs +14 -0
- package/esm2022/lib/spatial/embedding-compute-coordinator.mjs +239 -0
- package/esm2022/lib/spatial/embedding-compute.mjs +43 -10
- package/esm2022/lib/spatial/gene-search.mjs +1 -1
- package/esm2022/lib/spatial/glyphs.mjs +97 -0
- package/esm2022/lib/spatial/lod.mjs +187 -0
- package/esm2022/lib/spatial/spatial-controls.facade.mjs +200 -0
- package/esm2022/lib/spatial/spatial-density.mjs +25 -16
- package/esm2022/lib/spatial/spatial-encoding.mjs +26 -82
- package/esm2022/lib/spatial/spatial-expression.mjs +43 -42
- package/esm2022/lib/spatial/spatial-framing.mjs +1 -1
- package/esm2022/lib/spatial/spatial-heatmap.mjs +6 -3
- package/esm2022/lib/spatial/spatial-hover.mjs +5 -33
- package/esm2022/lib/spatial/spatial-panel-model.mjs +282 -0
- package/esm2022/lib/spatial/spatial-sections.mjs +1 -1
- package/esm2022/lib/spatial/spatial-selection.mjs +33 -46
- package/esm2022/lib/spatial/spatial-tile-merge.mjs +219 -0
- package/esm2022/lib/spatial/spatial-tiles.mjs +12 -648
- package/esm2022/lib/spatial/spatial-volume-image.mjs +2 -4
- package/esm2022/lib/spatial/stats.mjs +71 -0
- package/esm2022/lib/spatial/transcript-grouping.mjs +307 -0
- package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +150 -0
- package/esm2022/lib/spatial-controls/spatial-charts/chart-data-model.mjs +309 -0
- package/esm2022/lib/spatial-controls/spatial-charts/chart-help.mjs +145 -0
- package/esm2022/lib/spatial-controls/spatial-charts/plotly-chart-host.mjs +158 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.mjs +47 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +297 -802
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.mjs +89 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.mjs +52 -0
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +143 -1238
- package/esm2022/lib/spatial-controls/spatial-gene-picker.mjs +153 -0
- package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +241 -0
- package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +193 -0
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +132 -0
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.model.mjs +67 -0
- package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +147 -0
- package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +300 -0
- package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +370 -0
- package/esm2022/lib/store/class-color.util.mjs +46 -3
- package/esm2022/lib/store/region-history.mjs +146 -0
- package/esm2022/lib/store/region-scope-cache.mjs +140 -0
- package/esm2022/lib/store/region-selection.mjs +82 -0
- package/esm2022/lib/store/region-store.service.mjs +279 -675
- package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
- package/esm2022/lib/store/visualizer-store.service.mjs +49 -71
- package/esm2022/lib/toast-outlets.mjs +5 -4
- package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +92 -434
- package/esm2022/lib/toolbar/canvas-tools.mjs +20 -0
- package/esm2022/lib/toolbar/crop/slide-crop.mjs +26 -42
- package/esm2022/lib/toolbar/plot-type-selector/plot-type-selector.component.mjs +85 -0
- package/esm2022/lib/toolbar/region-tools/region-tool-buttons.mjs +74 -0
- package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +114 -0
- package/esm2022/lib/toolbar/segmentation/cell-segment-tool.service.mjs +74 -78
- package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +50 -8
- package/esm2022/lib/toolbar/segmentation/onnx-sam-session.mjs +61 -42
- package/esm2022/lib/toolbar/segmentation/pending-calls.mjs +47 -0
- package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +12 -4
- package/esm2022/lib/toolbar/segmentation/sam-onnx-core.mjs +70 -14
- package/esm2022/lib/toolbar/segmentation/sam-point-tool.service.mjs +135 -172
- package/esm2022/lib/toolbar/segmentation/sam-prompt.mjs +9 -90
- package/esm2022/lib/toolbar/segmentation/sam-session.service.mjs +183 -0
- package/esm2022/lib/toolbar/segmentation/sam-tool.service.mjs +95 -150
- package/esm2022/lib/toolbar/segmentation/segmentation-commit.mjs +12 -0
- package/esm2022/lib/toolbar/segmentation/segmentation-runner.mjs +108 -0
- package/esm2022/lib/toolbar/segmentation-tools/segmentation-tools.component.mjs +155 -0
- package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +81 -0
- package/esm2022/lib/toolbar/tool-kit/async-tool-status.mjs +37 -0
- package/esm2022/lib/toolbar/tool-kit/canvas-tool-manager.mjs +63 -0
- package/esm2022/lib/toolbar/tool-kit/canvas-tool.mjs +2 -0
- package/esm2022/lib/toolbar/tool-kit/frame-pixels.mjs +108 -0
- package/esm2022/lib/toolbar/tool-kit/mask-stroke-editor.mjs +306 -0
- package/esm2022/lib/toolbar/tool-kit/matrix-frame.mjs +61 -0
- package/esm2022/lib/toolbar/tool-kit/tool-overlay.mjs +140 -0
- package/esm2022/lib/toolbar/tool-kit/undo-gesture.mjs +24 -0
- package/esm2022/lib/toolbar/tool-slider/tool-slider.component.mjs +63 -0
- package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +50 -0
- package/esm2022/lib/toolbar/toolbar.component.mjs +68 -117
- package/esm2022/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.mjs +93 -115
- package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +107 -0
- package/esm2022/lib/toolbar/wand/wand-region-grow.mjs +321 -0
- package/esm2022/lib/toolbar/wand/wand-tool.service.mjs +121 -416
- package/esm2022/lib/toolbar/wand/wand.service.mjs +30 -894
- package/esm2022/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.mjs +48 -90
- package/esm2022/lib/util/mark-for-check.mjs +17 -0
- package/esm2022/lib/util/supersede.mjs +56 -0
- package/esm2022/lib/visualization.module.mjs +39 -141
- package/esm2022/lib/visualizer/floating-drag.directive.mjs +58 -0
- package/esm2022/lib/visualizer/region-actions.mjs +149 -0
- package/esm2022/lib/visualizer/region-load.mjs +60 -0
- package/esm2022/lib/visualizer/spatial-dataset-binder.mjs +163 -0
- package/esm2022/lib/visualizer/tool-modes.mjs +113 -0
- package/esm2022/lib/visualizer/viewer-shortcuts.mjs +167 -0
- package/esm2022/lib/visualizer/visualizer-context-menu.mjs +119 -0
- package/esm2022/lib/visualizer.component.mjs +480 -1902
- package/esm2022/lib/workers/spatial-math-ops.mjs +43 -0
- package/esm2022/lib/workers/spatial-math-worker.mjs +10 -0
- package/esm2022/lib/workers/spatial-math.mjs +190 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs +41083 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs +238 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs +12 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +41 -34430
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
- package/fesm2022/mask.worker.js +36 -917
- package/fesm2022/onnx-sam.worker.js +52 -16
- package/fesm2022/spatial-math.worker.js +471 -0
- package/fesm2022/tsne.worker.js +32 -15
- package/index.d.ts +13 -10
- package/lib/channel-histogram/channel-histogram.component.d.ts +53 -43
- package/lib/contracts/capabilities.contract.d.ts +4 -2
- package/lib/contracts/cell-segmenter.contract.d.ts +1 -0
- package/lib/contracts/channel-histogram-api.contract.d.ts +4 -0
- package/lib/contracts/color.d.ts +27 -0
- package/lib/contracts/colormap-lut.d.ts +19 -4
- package/lib/contracts/coordinate-transform.contract.d.ts +3 -3
- package/lib/contracts/display-types.d.ts +21 -0
- package/lib/contracts/instance-segmenter.contract.d.ts +5 -0
- package/lib/contracts/intensity.d.ts +13 -2
- package/lib/contracts/plot-type.d.ts +3 -1
- package/lib/contracts/ports/image-state.port.d.ts +6 -2
- package/lib/contracts/ports/preferences.port.d.ts +4 -0
- package/lib/contracts/ports/region-io.port.d.ts +1 -0
- package/lib/contracts/ports/spatial-data.port.d.ts +4 -10
- package/lib/contracts/ports/tile-access.port.d.ts +1 -0
- package/lib/contracts/region-editor-api.contract.d.ts +1 -1
- package/lib/contracts/region-overlay.contract.d.ts +5 -0
- package/lib/contracts/sam.contract.d.ts +7 -0
- package/lib/contracts/semantic-segmenter.contract.d.ts +6 -0
- package/lib/contracts/spatial-dataset.contract.d.ts +19 -6
- package/lib/contracts/toolbar-tool.contract.d.ts +1 -0
- package/lib/contracts/visualizer.contract.d.ts +221 -54
- package/lib/contracts/viz-config.d.ts +1 -0
- package/lib/geometry/contour.d.ts +24 -0
- package/lib/geometry/raster.d.ts +42 -0
- package/lib/geometry/ring.d.ts +67 -0
- package/lib/hex-color-picker/hex-color-picker.component.d.ts +61 -27
- package/lib/implementations/base-store-visualizer.d.ts +61 -15
- package/lib/implementations/napari-js/napari-axes-gizmo.d.ts +36 -0
- package/lib/implementations/napari-js/napari-display-state.d.ts +76 -0
- package/lib/implementations/napari-js/napari-helpers.d.ts +129 -0
- package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +162 -0
- package/lib/implementations/napari-js/napari-loading-badge.d.ts +0 -1
- package/lib/implementations/napari-js/napari-loading-state.d.ts +30 -0
- package/lib/implementations/napari-js/napari-region-overlay.d.ts +62 -70
- package/lib/implementations/napari-js/napari-scene.d.ts +93 -0
- package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +163 -0
- package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +212 -0
- package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +114 -0
- package/lib/implementations/napari-js/napari-spatial-hover.d.ts +89 -0
- package/lib/implementations/napari-js/napari-spatial-scene.d.ts +118 -0
- package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +56 -263
- package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +1 -1
- package/lib/implementations/napari-js/napari-surface-scene.d.ts +76 -0
- package/lib/implementations/napari-js/napari-tile-client.d.ts +214 -0
- package/lib/implementations/napari-js/napari-tool-bridge.d.ts +179 -0
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +121 -878
- package/lib/implementations/napari-js/napari-volume-scene.d.ts +104 -0
- package/lib/implementations/napari-js/napari-volume-z-handle.d.ts +8 -12
- package/lib/implementations/napari-js/region-overlay/overlay-projection.d.ts +59 -0
- package/lib/implementations/napari-js/region-overlay/region-edit.d.ts +15 -0
- package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +54 -0
- package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +26 -0
- package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +70 -0
- package/lib/implementations/napari-js/spatial-tiles/density-layer.d.ts +61 -0
- package/lib/implementations/napari-js/spatial-tiles/layer-groups.d.ts +67 -0
- package/lib/implementations/napari-js/spatial-tiles/plan-context.d.ts +38 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +71 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-jobs.d.ts +105 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +56 -0
- package/lib/implementations/osd/display-pipeline.d.ts +38 -9
- package/lib/implementations/osd/histogram-sampler.d.ts +22 -12
- package/lib/implementations/osd/openseadragon-viewer-options.d.ts +35 -0
- package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +78 -354
- package/lib/implementations/osd/osd-coordinate-transform.d.ts +2 -1
- package/lib/implementations/osd/osd-coords.d.ts +6 -4
- package/lib/implementations/osd/osd-export.d.ts +36 -0
- package/lib/implementations/osd/osd-lib.d.ts +7 -0
- package/lib/implementations/osd/osd-navigator-chrome.d.ts +69 -0
- package/lib/implementations/osd/osd-pixel-readback.d.ts +22 -0
- package/lib/implementations/osd/osd-region-overlay-draw.d.ts +37 -0
- package/lib/implementations/osd/osd-region-overlay.d.ts +36 -48
- package/lib/implementations/osd/osd-scale-bar.d.ts +8 -6
- package/lib/implementations/osd/osd-tile-source.d.ts +49 -0
- package/lib/implementations/osd/osd-viewer-like.d.ts +100 -0
- package/lib/implementations/osd/osd-viewer-mount.d.ts +14 -0
- package/lib/implementations/osd/osd-viewport.d.ts +77 -0
- package/lib/implementations/osd/osd-zoom.d.ts +6 -0
- package/lib/implementations/osd/simple-source.d.ts +161 -0
- package/lib/implementations/osd/slice-cache.d.ts +12 -3
- package/lib/implementations/osd/tile-client.d.ts +11 -14
- package/lib/implementations/osd/tile-recolor.d.ts +141 -0
- package/lib/implementations/plotly/omics-trace-builders.d.ts +32 -20
- package/lib/implementations/plotly/plotly-image-loader.d.ts +49 -0
- package/lib/implementations/plotly/plotly-image-recolor.d.ts +75 -0
- package/lib/implementations/plotly/plotly-intensity-inset.d.ts +8 -0
- package/lib/implementations/plotly/plotly-isosurface-controls.d.ts +38 -0
- package/lib/implementations/plotly/plotly-layouts.d.ts +188 -0
- package/lib/implementations/plotly/plotly-readback.d.ts +41 -0
- package/lib/implementations/plotly/plotly-region-overlay.d.ts +2 -2
- package/lib/implementations/plotly/plotly-shape-projection.d.ts +92 -0
- package/lib/implementations/plotly/plotly-trace-builders.d.ts +23 -12
- package/lib/implementations/plotly/plotly-zoom-controller.d.ts +86 -0
- package/lib/implementations/plotly/plotly.service.d.ts +136 -401
- package/lib/implementations/region-centroids.d.ts +14 -0
- package/lib/implementations/simple-slice-access.service.d.ts +7 -4
- package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +42 -18
- package/lib/implementations/spatial-data-http/spatial-wire.d.ts +34 -9
- package/lib/implementations/tile-server/index.d.ts +5 -0
- package/lib/implementations/tile-server/native-histogram.d.ts +25 -0
- package/lib/implementations/tile-server/poll-descriptor.d.ts +39 -0
- package/lib/implementations/tile-server/tile-protocol.d.ts +80 -0
- package/lib/implementations/tile-server/transport.d.ts +62 -0
- package/lib/intensity/intensity-profile.d.ts +66 -0
- package/lib/intensity/intensity-profile.service.d.ts +108 -0
- package/lib/intensity-inset/intensity-inset.component.d.ts +58 -0
- package/lib/models/bezier.d.ts +0 -5
- package/lib/models/class-preset.d.ts +18 -0
- package/lib/models/geometry.d.ts +14 -48
- package/lib/models/polygon-edit.d.ts +72 -0
- package/lib/models/polygon-factory.d.ts +40 -0
- package/lib/models/region-clone.d.ts +20 -0
- package/lib/models/region-geojson.d.ts +17 -0
- package/lib/models/region.d.ts +40 -4
- package/lib/models/shape.d.ts +8 -0
- package/lib/plot-mode/contribution-host.d.ts +125 -0
- package/lib/plot-mode/plot-type-menu.d.ts +60 -0
- package/lib/plot-mode/tool-params-model.d.ts +49 -0
- package/lib/plot.utilities.d.ts +19 -30
- package/lib/processing/processing-image.d.ts +5 -2
- package/lib/provide-visualization.d.ts +19 -2
- package/lib/region-editor/classes-panel/classes-panel.component.d.ts +56 -0
- package/lib/region-editor/file-stem.d.ts +7 -0
- package/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.d.ts +45 -0
- package/lib/region-editor/mask-export.service.d.ts +54 -0
- package/lib/region-editor/mask-raster.d.ts +2 -8
- package/lib/region-editor/region-color-dialog/region-color-dialog.component.d.ts +29 -0
- package/lib/region-editor/region-editor-help/region-editor-help.component.d.ts +11 -0
- package/lib/region-editor/region-editor.component.d.ts +166 -199
- package/lib/region-editor/region-metrics.d.ts +26 -0
- package/lib/region-editor/region-persistence.service.d.ts +69 -0
- package/lib/region-editor/region-table/region-table.component.d.ts +83 -0
- package/lib/region-editor/save-mask-dialog/save-mask-dialog.component.d.ts +36 -0
- package/lib/region-editor/save-regions-dialog/save-regions-dialog.component.d.ts +37 -0
- package/lib/region-ops.service.d.ts +1 -7
- package/lib/region-overlay/region-geometry.d.ts +157 -0
- package/lib/region-overlay/region-hit-test.d.ts +38 -0
- package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
- package/lib/render-orchestrator.d.ts +6 -2
- package/lib/render-session.d.ts +75 -0
- package/lib/routing-visualizer.service.d.ts +110 -58
- package/lib/spatial/density-raster.d.ts +6 -0
- package/lib/spatial/embedding-compute-coordinator.d.ts +123 -0
- package/lib/spatial/embedding-compute.d.ts +21 -2
- package/lib/spatial/glyphs.d.ts +16 -0
- package/lib/spatial/lod.d.ts +94 -0
- package/lib/spatial/spatial-controls.facade.d.ts +64 -0
- package/lib/spatial/spatial-density.d.ts +15 -5
- package/lib/spatial/spatial-encoding.d.ts +11 -44
- package/lib/spatial/spatial-expression.d.ts +40 -22
- package/lib/spatial/spatial-framing.d.ts +1 -0
- package/lib/spatial/spatial-heatmap.d.ts +2 -0
- package/lib/spatial/spatial-hover.d.ts +4 -16
- package/lib/spatial/spatial-panel-model.d.ts +135 -0
- package/lib/spatial/spatial-selection.d.ts +21 -26
- package/lib/spatial/spatial-tile-merge.d.ts +41 -0
- package/lib/spatial/spatial-tiles.d.ts +9 -256
- package/lib/spatial/stats.d.ts +38 -0
- package/lib/spatial/transcript-grouping.d.ts +119 -0
- package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-charts/chart-data-model.d.ts +153 -0
- package/lib/spatial-controls/spatial-charts/chart-help.d.ts +69 -0
- package/lib/spatial-controls/spatial-charts/plotly-chart-host.d.ts +98 -0
- package/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.d.ts +26 -0
- package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +101 -260
- package/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.d.ts +43 -0
- package/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.d.ts +27 -0
- package/lib/spatial-controls/spatial-controls.component.d.ts +68 -448
- package/lib/spatial-controls/spatial-gene-picker.d.ts +86 -0
- package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +102 -0
- package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +72 -0
- package/lib/spatial-controls/spatial-key/spatial-key.component.d.ts +66 -0
- package/lib/spatial-controls/spatial-key/spatial-key.model.d.ts +33 -0
- package/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +117 -0
- package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +142 -0
- package/lib/store/class-color.util.d.ts +35 -1
- package/lib/store/region-history.d.ts +66 -0
- package/lib/store/region-scope-cache.d.ts +63 -0
- package/lib/store/region-selection.d.ts +36 -0
- package/lib/store/region-store.service.d.ts +104 -112
- package/lib/store/visualizer-store.service.d.ts +22 -33
- package/lib/toast-outlets.d.ts +4 -3
- package/lib/toolbar/brush/brush-tool.service.d.ts +31 -98
- package/lib/toolbar/canvas-tools.d.ts +20 -0
- package/lib/toolbar/crop/slide-crop.d.ts +10 -4
- package/lib/toolbar/plot-type-selector/plot-type-selector.component.d.ts +38 -0
- package/lib/toolbar/region-tools/region-tool-buttons.d.ts +21 -0
- package/lib/toolbar/region-tools/region-tools.component.d.ts +60 -0
- package/lib/toolbar/segmentation/cell-segment-tool.service.d.ts +10 -14
- package/lib/toolbar/segmentation/cellpose-segmenter.service.d.ts +12 -2
- package/lib/toolbar/segmentation/onnx-sam-session.d.ts +22 -3
- package/lib/toolbar/segmentation/pending-calls.d.ts +31 -0
- package/lib/toolbar/segmentation/sam-model-registry.d.ts +9 -3
- package/lib/toolbar/segmentation/sam-onnx-core.d.ts +18 -5
- package/lib/toolbar/segmentation/sam-point-tool.service.d.ts +46 -32
- package/lib/toolbar/segmentation/sam-prompt.d.ts +7 -31
- package/lib/toolbar/segmentation/sam-session.service.d.ts +74 -0
- package/lib/toolbar/segmentation/sam-tool.service.d.ts +23 -30
- package/lib/toolbar/segmentation/segmentation-commit.d.ts +8 -0
- package/lib/toolbar/segmentation/segmentation-runner.d.ts +52 -0
- package/lib/toolbar/segmentation-tools/segmentation-tools.component.d.ts +87 -0
- package/lib/toolbar/stack-controls/stack-controls.component.d.ts +40 -0
- package/lib/toolbar/tool-kit/async-tool-status.d.ts +21 -0
- package/lib/toolbar/tool-kit/canvas-tool-manager.d.ts +36 -0
- package/lib/toolbar/tool-kit/canvas-tool.d.ts +86 -0
- package/lib/toolbar/tool-kit/frame-pixels.d.ts +45 -0
- package/lib/toolbar/tool-kit/mask-stroke-editor.d.ts +125 -0
- package/lib/toolbar/tool-kit/matrix-frame.d.ts +40 -0
- package/lib/toolbar/tool-kit/tool-overlay.d.ts +60 -0
- package/lib/toolbar/tool-kit/undo-gesture.d.ts +17 -0
- package/lib/toolbar/tool-slider/tool-slider.component.d.ts +33 -0
- package/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.d.ts +24 -0
- package/lib/toolbar/toolbar.component.d.ts +47 -83
- package/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.d.ts +33 -40
- package/lib/toolbar/view-controls/view-controls.component.d.ts +54 -0
- package/lib/toolbar/wand/wand-region-grow.d.ts +49 -0
- package/lib/toolbar/wand/wand-tool.service.d.ts +39 -124
- package/lib/toolbar/wand/wand.service.d.ts +22 -116
- package/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.d.ts +17 -37
- package/lib/util/mark-for-check.d.ts +11 -0
- package/lib/util/supersede.d.ts +53 -0
- package/lib/visualization.module.d.ts +18 -39
- package/lib/visualizer/floating-drag.directive.d.ts +30 -0
- package/lib/visualizer/region-actions.d.ts +54 -0
- package/lib/visualizer/region-load.d.ts +27 -0
- package/lib/visualizer/spatial-dataset-binder.d.ts +74 -0
- package/lib/visualizer/tool-modes.d.ts +49 -0
- package/lib/visualizer/viewer-shortcuts.d.ts +71 -0
- package/lib/visualizer/visualizer-context-menu.d.ts +55 -0
- package/lib/visualizer.component.d.ts +201 -447
- package/lib/workers/spatial-math-ops.d.ts +65 -0
- package/lib/workers/spatial-math-worker.d.ts +7 -0
- package/lib/workers/spatial-math.d.ts +74 -0
- package/package.json +12 -3
- package/src/lib/styles/_viz-icons-rules.scss +73 -0
- package/src/lib/styles/viz-icons.scss +14 -0
- package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +0 -97
- package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +0 -195
- package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +0 -92
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs +0 -329
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map +0 -1
- package/lib/implementations/napari-js/napari-axes-labels.d.ts +0 -49
- package/lib/implementations/napari-js/napari-navigator.d.ts +0 -72
- package/lib/implementations/napari-js/napari-scale-bar.d.ts +0 -35
- package/src/lib/assets/cell-detection.svg +0 -37
- package/src/lib/assets/click.svg +0 -1
- package/src/lib/assets/colormap-luts.json +0 -1
- package/src/lib/assets/edit-selection-white.svg +0 -47
- package/src/lib/assets/icons/colormap-earth.png +0 -0
- package/src/lib/assets/icons/colormap-placeholder.png +0 -0
- package/src/lib/assets/icons/colormap-pubu.png +0 -0
- package/src/lib/assets/interactive-segmentation-cursor.svg +0 -1
- package/src/lib/assets/picture-segmentation.svg +0 -43
- package/src/lib/assets/test/download-379.svg +0 -1
- package/src/lib/assets/test/download-98.svg +0 -1
- package/src/lib/assets/test/json-1.svg +0 -1
- package/src/lib/assets/test/load-53.svg +0 -1
- package/src/lib/assets/test/mask-44.svg +0 -1
- package/src/lib/assets/test/mask-download-44.svg +0 -15
- package/src/lib/assets/test/mask-save-44.svg +0 -11
- package/src/lib/assets/test/overlay-1.svg +0 -1
- package/src/lib/assets/test/overlay-4.svg +0 -1
- package/src/lib/assets/test/region-26.svg +0 -1
- package/src/lib/assets/test/save-56.svg +0 -1
- package/src/lib/assets/test/upload-43.svg +0 -1
|
@@ -1,27 +1,43 @@
|
|
|
1
|
+
import { LruCache } from 'napari-js';
|
|
1
2
|
import * as ort from 'onnxruntime-web';
|
|
2
3
|
import { fetchModel, runEncoder, runDecoder } from './sam-onnx-core';
|
|
3
4
|
import { getOrtWasmBase } from './ort-runtime-config';
|
|
5
|
+
import { PendingCalls } from './pending-calls';
|
|
6
|
+
/**
|
|
7
|
+
* onnxruntime-web implementation of {@link ISamSession} (jit-ui#90), with two
|
|
8
|
+
* execution modes chosen per model:
|
|
9
|
+
*
|
|
10
|
+
* - **in-process** (main thread) — for small WASM models flagged `inProcess`
|
|
11
|
+
* (e.g. micro-sam ViT-T). Fast load + inference with no Web Worker spawn /
|
|
12
|
+
* second ORT runtime / message round-trips; the brief encode runs on the main
|
|
13
|
+
* thread (fine for a tiny model).
|
|
14
|
+
* - **worker** — for WebGPU models (e.g. ViT-B, patho-sam fp16) whose heavy
|
|
15
|
+
* encode would otherwise freeze the tab. Runs in {@link ./onnx-sam.worker} so
|
|
16
|
+
* the UI stays responsive (the spinner animates).
|
|
17
|
+
*
|
|
18
|
+
* Both modes share their inference math via {@link ./sam-onnx-core}. Lazy-imported
|
|
19
|
+
* by the SAM tools so onnxruntime-web / the worker never load in unit tests or
|
|
20
|
+
* the initial bundle.
|
|
21
|
+
*/
|
|
4
22
|
export class OnnxSamSession {
|
|
5
23
|
constructor() {
|
|
6
24
|
this.mode = null;
|
|
7
25
|
this.loaded = false;
|
|
8
|
-
this.model = null;
|
|
9
26
|
this.inputSize = 1024;
|
|
10
27
|
// ── worker mode ──
|
|
11
28
|
this.worker = null;
|
|
12
|
-
this.
|
|
13
|
-
this.pending = new Map();
|
|
29
|
+
this.calls = new PendingCalls();
|
|
14
30
|
// ── in-process mode ──
|
|
15
31
|
this.encoder = null;
|
|
16
32
|
this.decoder = null;
|
|
17
33
|
this.nextToken = 1;
|
|
18
|
-
|
|
34
|
+
/** The few most recently used embeddings, by token (one per recently viewed image). */
|
|
35
|
+
this.embeddings = new LruCache(3);
|
|
19
36
|
}
|
|
20
37
|
async loadModel(model, onProgress) {
|
|
21
38
|
if (!model.encoderUrl || !model.decoderUrl) {
|
|
22
39
|
throw new Error(`SAM model "${model.id}" has no ONNX URLs configured.`);
|
|
23
40
|
}
|
|
24
|
-
this.model = model;
|
|
25
41
|
this.inputSize = model.inputSize;
|
|
26
42
|
const hasGpu = typeof navigator !== 'undefined' && 'gpu' in navigator;
|
|
27
43
|
const eps = model.encoderProviders ?? (hasGpu ? ['webgpu', 'wasm'] : ['wasm']);
|
|
@@ -31,8 +47,8 @@ export class OnnxSamSession {
|
|
|
31
47
|
this.mode = !usesWebGpu && model.inProcess ? 'inproc' : 'worker';
|
|
32
48
|
if (this.mode === 'inproc') {
|
|
33
49
|
ort.env.wasm.wasmPaths = getOrtWasmBase();
|
|
34
|
-
const encBuf = await fetchModel(model.encoderUrl, onProgress);
|
|
35
|
-
const decBuf = await fetchModel(model.decoderUrl);
|
|
50
|
+
const encBuf = await fetchModel(model.encoderUrl, onProgress, model.revision);
|
|
51
|
+
const decBuf = await fetchModel(model.decoderUrl, undefined, model.revision);
|
|
36
52
|
this.encoder = await ort.InferenceSession.create(encBuf, { executionProviders: eps });
|
|
37
53
|
this.decoder = await ort.InferenceSession.create(decBuf, { executionProviders: ['wasm'] });
|
|
38
54
|
}
|
|
@@ -41,6 +57,7 @@ export class OnnxSamSession {
|
|
|
41
57
|
type: 'load',
|
|
42
58
|
encoderUrl: model.encoderUrl,
|
|
43
59
|
decoderUrl: model.decoderUrl,
|
|
60
|
+
revision: model.revision,
|
|
44
61
|
wasmPaths: getOrtWasmBase(),
|
|
45
62
|
inputSize: model.inputSize,
|
|
46
63
|
encoderProviders: model.encoderProviders,
|
|
@@ -56,19 +73,25 @@ export class OnnxSamSession {
|
|
|
56
73
|
const e = await runEncoder(this.encoder, image.data, image.width, image.height, this.inputSize);
|
|
57
74
|
const token = this.nextToken++;
|
|
58
75
|
this.embeddings.set(token, e);
|
|
59
|
-
if (this.embeddings.size > 3)
|
|
60
|
-
this.embeddings.delete(this.embeddings.keys().next().value);
|
|
61
76
|
return {
|
|
62
|
-
data: new Float32Array(0),
|
|
63
|
-
|
|
77
|
+
data: new Float32Array(0),
|
|
78
|
+
dims: e.dims,
|
|
79
|
+
scale: e.scale,
|
|
80
|
+
imageWidth: e.imageWidth,
|
|
81
|
+
imageHeight: e.imageHeight,
|
|
82
|
+
token,
|
|
64
83
|
};
|
|
65
84
|
}
|
|
66
85
|
// worker: transfer the RGBA buffer (callers pass a fresh frame buffer).
|
|
67
86
|
const buffer = image.data.buffer;
|
|
68
87
|
const res = await this.call({ type: 'embed', width: image.width, height: image.height, buffer }, [buffer]);
|
|
69
88
|
return {
|
|
70
|
-
data: new Float32Array(0),
|
|
71
|
-
|
|
89
|
+
data: new Float32Array(0),
|
|
90
|
+
dims: res['dims'],
|
|
91
|
+
scale: res['scale'],
|
|
92
|
+
imageWidth: res['imageWidth'],
|
|
93
|
+
imageHeight: res['imageHeight'],
|
|
94
|
+
token: res['token'],
|
|
72
95
|
};
|
|
73
96
|
}
|
|
74
97
|
async decode(embedding, prompt) {
|
|
@@ -79,12 +102,17 @@ export class OnnxSamSession {
|
|
|
79
102
|
return runDecoder(this.decoder, e, prompt);
|
|
80
103
|
}
|
|
81
104
|
const res = await this.call({ type: 'decode', token: embedding.token, prompt });
|
|
82
|
-
return {
|
|
105
|
+
return {
|
|
106
|
+
mask: new Uint8Array(res['buffer']),
|
|
107
|
+
width: res['width'],
|
|
108
|
+
height: res['height'],
|
|
109
|
+
iou: res['iou'],
|
|
110
|
+
};
|
|
83
111
|
}
|
|
112
|
+
/** Release the worker / ORT sessions. Calls still in flight reject (RT-8), so
|
|
113
|
+
* their callers' `finally` blocks run (e.g. a tool's busy flag clears). */
|
|
84
114
|
dispose() {
|
|
85
|
-
this.
|
|
86
|
-
this.worker = null;
|
|
87
|
-
this.pending.clear();
|
|
115
|
+
this.dropWorker(new Error('SAM session disposed'));
|
|
88
116
|
this.encoder?.release?.();
|
|
89
117
|
this.decoder?.release?.();
|
|
90
118
|
this.encoder = this.decoder = null;
|
|
@@ -97,37 +125,28 @@ export class OnnxSamSession {
|
|
|
97
125
|
if (this.worker)
|
|
98
126
|
return this.worker;
|
|
99
127
|
const worker = new Worker(new URL('./onnx-sam.worker', import.meta.url), { type: 'module' });
|
|
100
|
-
worker.onmessage = (ev) =>
|
|
101
|
-
const m = ev.data;
|
|
102
|
-
const p = this.pending.get(m.id);
|
|
103
|
-
if (!p)
|
|
104
|
-
return;
|
|
105
|
-
if (m.type === 'progress') {
|
|
106
|
-
p.onProgress?.(m.fraction);
|
|
107
|
-
return;
|
|
108
|
-
}
|
|
109
|
-
this.pending.delete(m.id);
|
|
110
|
-
if (m.type === 'error')
|
|
111
|
-
p.reject(new Error(m.error));
|
|
112
|
-
else
|
|
113
|
-
p.resolve(m);
|
|
114
|
-
};
|
|
128
|
+
worker.onmessage = (ev) => this.calls.handle(ev.data);
|
|
115
129
|
worker.onerror = (ev) => {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
this.
|
|
130
|
+
// A crashed worker can't serve the loaded model any more: drop it, so the
|
|
131
|
+
// next run reloads instead of posting to a dead worker.
|
|
132
|
+
this.dropWorker(new Error(ev.message || 'SAM worker crashed.'));
|
|
133
|
+
this.loaded = false;
|
|
134
|
+
this.mode = null;
|
|
120
135
|
};
|
|
121
136
|
this.worker = worker;
|
|
122
137
|
return worker;
|
|
123
138
|
}
|
|
139
|
+
/** Terminate the worker (if any) and reject every call still waiting on it. */
|
|
140
|
+
dropWorker(err) {
|
|
141
|
+
this.worker?.terminate();
|
|
142
|
+
this.worker = null;
|
|
143
|
+
this.calls.rejectAll(err);
|
|
144
|
+
}
|
|
124
145
|
call(msg, transfer = [], onProgress) {
|
|
125
|
-
const id = ++this.seq;
|
|
126
146
|
const worker = this.ensureWorker();
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
});
|
|
147
|
+
const { id, promise } = this.calls.open(onProgress);
|
|
148
|
+
worker.postMessage({ ...msg, id }, transfer);
|
|
149
|
+
return promise;
|
|
131
150
|
}
|
|
132
151
|
}
|
|
133
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25ueC1zYW0tc2Vzc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdG9vbGJhci9zZWdtZW50YXRpb24vb25ueC1zYW0tc2Vzc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssR0FBRyxNQUFNLGlCQUFpQixDQUFDO0FBS3ZDLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBc0IsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUF3QnRELE1BQU0sT0FBTyxjQUFjO0lBQTNCO1FBQ1UsU0FBSSxHQUErQixJQUFJLENBQUM7UUFDeEMsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUNmLFVBQUssR0FBdUIsSUFBSSxDQUFDO1FBQ2pDLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFFekIsb0JBQW9CO1FBQ1osV0FBTSxHQUFrQixJQUFJLENBQUM7UUFDN0IsUUFBRyxHQUFHLENBQUMsQ0FBQztRQUNDLFlBQU8sR0FBRyxJQUFJLEdBQUcsRUFBbUIsQ0FBQztRQUV0RCx3QkFBd0I7UUFDaEIsWUFBTyxHQUFnQyxJQUFJLENBQUM7UUFDNUMsWUFBTyxHQUFnQyxJQUFJLENBQUM7UUFDNUMsY0FBUyxHQUFHLENBQUMsQ0FBQztRQUNMLGVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBeUIsQ0FBQztJQThHakUsQ0FBQztJQTVHQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQWtCLEVBQUUsVUFBdUM7UUFDekUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQyxjQUFjLEtBQUssQ0FBQyxFQUFFLGdDQUFnQyxDQUFDLENBQUM7UUFDMUUsQ0FBQztRQUNELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25C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SSxDQUFDLEdBQVEsRUFBRSxXQUEyQixFQUFFLEVBQUUsVUFBZ0M7UUFDcEYsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ3RCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNuQyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUN0RCxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBvcnQgZnJvbSAnb25ueHJ1bnRpbWUtd2ViJztcblxuaW1wb3J0IHtcbiAgSVNhbVNlc3Npb24sIFNhbUVtYmVkZGluZywgU2FtTWFza1Jlc3VsdCwgU2FtTW9kZWxEZWYsIFNhbVByb21wdCxcbn0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3NhbS5jb250cmFjdCc7XG5pbXBvcnQgeyBmZXRjaE1vZGVsLCBydW5FbmNvZGVyLCBydW5EZWNvZGVyLCB0eXBlIENvcmVFbWJlZGRpbmcgfSBmcm9tICcuL3NhbS1vbm54LWNvcmUnO1xuaW1wb3J0IHsgZ2V0T3J0V2FzbUJhc2UgfSBmcm9tICcuL29ydC1ydW50aW1lLWNvbmZpZyc7XG5cbi8qKlxuICogb25ueHJ1bnRpbWUtd2ViIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJU2FtU2Vzc2lvbn0gKGppdC11aSM5MCksIHdpdGggdHdvXG4gKiBleGVjdXRpb24gbW9kZXMgY2hvc2VuIHBlciBtb2RlbDpcbiAqXG4gKiAgLSAqKmluLXByb2Nlc3MqKiAobWFpbiB0aHJlYWQpIOKAlCBmb3Igc21hbGwgV0FTTSBtb2RlbHMgZmxhZ2dlZCBgaW5Qcm9jZXNzYFxuICogICAgKGUuZy4gbWljcm8tc2FtIFZpVC1UKS4gRmFzdCBsb2FkICsgaW5mZXJlbmNlIHdpdGggbm8gV2ViIFdvcmtlciBzcGF3biAvXG4gKiAgICBzZWNvbmQgT1JUIHJ1bnRpbWUgLyBtZXNzYWdlIHJvdW5kLXRyaXBzOyB0aGUgYnJpZWYgZW5jb2RlIHJ1bnMgb24gdGhlIG1haW5cbiAqICAgIHRocmVhZCAoZmluZSBmb3IgYSB0aW55IG1vZGVsKS5cbiAqICAtICoqd29ya2VyKiog4oCUIGZvciBXZWJHUFUgbW9kZWxzIChlLmcuIFZpVC1CLCBwYXRoby1zYW0gZnAxNikgd2hvc2UgaGVhdnlcbiAqICAgIGVuY29kZSB3b3VsZCBvdGhlcndpc2UgZnJlZXplIHRoZSB0YWIuIFJ1bnMgaW4ge0BsaW5rIC4vb25ueC1zYW0ud29ya2VyfSBzb1xuICogICAgdGhlIFVJIHN0YXlzIHJlc3BvbnNpdmUgKHRoZSBzcGlubmVyIGFuaW1hdGVzKS5cbiAqXG4gKiBCb3RoIG1vZGVzIHNoYXJlIHRoZWlyIGluZmVyZW5jZSBtYXRoIHZpYSB7QGxpbmsgLi9zYW0tb25ueC1jb3JlfS4gTGF6eS1pbXBvcnRlZFxuICogYnkgdGhlIFNBTSB0b29scyBzbyBvbm54cnVudGltZS13ZWIgLyB0aGUgd29ya2VyIG5ldmVyIGxvYWQgaW4gdW5pdCB0ZXN0cyBvclxuICogdGhlIGluaXRpYWwgYnVuZGxlLlxuICovXG50eXBlIFBlbmRpbmcgPSB7XG4gIHJlc29sdmU6IChtc2c6IGFueSkgPT4gdm9pZDtcbiAgcmVqZWN0OiAoZXJyOiBFcnJvcikgPT4gdm9pZDtcbiAgb25Qcm9ncmVzcz86IChmcmFjdGlvbjogbnVtYmVyKSA9PiB2b2lkO1xufTtcblxuZXhwb3J0IGNsYXNzIE9ubnhTYW1TZXNzaW9uIGltcGxlbWVudHMgSVNhbVNlc3Npb24ge1xuICBwcml2YXRlIG1vZGU6ICdpbnByb2MnIHwgJ3dvcmtlcicgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsb2FkZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBtb2RlbDogU2FtTW9kZWxEZWYgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBpbnB1dFNpemUgPSAxMDI0O1xuXG4gIC8vIOKUgOKUgCB3b3JrZXIgbW9kZSDilIDilIBcbiAgcHJpdmF0ZSB3b3JrZXI6IFdvcmtlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNlcSA9IDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVuZGluZyA9IG5ldyBNYXA8bnVtYmVyLCBQZW5kaW5nPigpO1xuXG4gIC8vIOKUgOKUgCBpbi1wcm9jZXNzIG1vZGUg4pSA4pSAXG4gIHByaXZhdGUgZW5jb2Rlcjogb3J0LkluZmVyZW5jZVNlc3Npb24gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBkZWNvZGVyOiBvcnQuSW5mZXJlbmNlU2Vzc2lvbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG5leHRUb2tlbiA9IDE7XG4gIHByaXZhdGUgcmVhZG9ubHkgZW1iZWRkaW5ncyA9IG5ldyBNYXA8bnVtYmVyLCBDb3JlRW1iZWRkaW5nPigpO1xuXG4gIGFzeW5jIGxvYWRNb2RlbChtb2RlbDogU2FtTW9kZWxEZWYsIG9uUHJvZ3Jlc3M/OiAoZnJhY3Rpb246IG51bWJlcikgPT4gdm9pZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghbW9kZWwuZW5jb2RlclVybCB8fCAhbW9kZWwuZGVjb2RlclVybCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTQU0gbW9kZWwgXCIke21vZGVsLmlkfVwiIGhhcyBubyBPTk5YIFVSTHMgY29uZmlndXJlZC5gKTtcbiAgICB9XG4gICAgdGhpcy5tb2RlbCA9IG1vZGVsO1xuICAgIHRoaXMuaW5wdXRTaXplID0gbW9kZWwuaW5wdXRTaXplO1xuICAgIGNvbnN0IGhhc0dwdSA9IHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmICdncHUnIGluIG5hdmlnYXRvcjtcbiAgICBjb25zdCBlcHM6IHN0cmluZ1tdID0gbW9kZWwuZW5jb2RlclByb3ZpZGVycyA/PyAoaGFzR3B1ID8gWyd3ZWJncHUnLCAnd2FzbSddIDogWyd3YXNtJ10pO1xuICAgIGNvbnN0IHVzZXNXZWJHcHUgPSBlcHMuaW5jbHVkZXMoJ3dlYmdwdScpO1xuICAgIC8vIFdlYkdQVSBtdXN0IHJ1biBpbiB0aGUgd29ya2VyIChlbHNlIGl0IGZyZWV6ZXMgdGhlIG1haW4gdGhyZWFkKTsgc21hbGxcbiAgICAvLyBXQVNNIG1vZGVscyBvcHQgaW50byB0aGUgZmFzdGVyIGluLXByb2Nlc3MgcGF0aCB2aWEgYGluUHJvY2Vzc2AuXG4gICAgdGhpcy5tb2RlID0gIXVzZXNXZWJHcHUgJiYgbW9kZWwuaW5Qcm9jZXNzID8gJ2lucHJvYycgOiAnd29ya2VyJztcblxuICAgIGlmICh0aGlzLm1vZGUgPT09ICdpbnByb2MnKSB7XG4gICAgICBvcnQuZW52Lndhc20ud2FzbVBhdGhzID0gZ2V0T3J0V2FzbUJhc2UoKTtcbiAgICAgIGNvbnN0IGVuY0J1ZiA9IGF3YWl0IGZldGNoTW9kZWwobW9kZWwuZW5jb2RlclVybCwgb25Qcm9ncmVzcyk7XG4gICAgICBjb25zdCBkZWNCdWYgPSBhd2FpdCBmZXRjaE1vZGVsKG1vZGVsLmRlY29kZXJVcmwpO1xuICAgICAgdGhpcy5lbmNvZGVyID0gYXdhaXQgb3J0LkluZmVyZW5jZVNlc3Npb24uY3JlYXRlKGVuY0J1ZiwgeyBleGVjdXRpb25Qcm92aWRlcnM6IGVwcyB9KTtcbiAgICAgIHRoaXMuZGVjb2RlciA9IGF3YWl0IG9ydC5JbmZlcmVuY2VTZXNzaW9uLmNyZWF0ZShkZWNCdWYsIHsgZXhlY3V0aW9uUHJvdmlkZXJzOiBbJ3dhc20nXSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5jYWxsKHtcbiAgICAgICAgdHlwZTogJ2xvYWQnLFxuICAgICAgICBlbmNvZGVyVXJsOiBtb2RlbC5lbmNvZGVyVXJsLFxuICAgICAgICBkZWNvZGVyVXJsOiBtb2RlbC5kZWNvZGVyVXJsLFxuICAgICAgICB3YXNtUGF0aHM6IGdldE9ydFdhc21CYXNlKCksXG4gICAgICAgIGlucHV0U2l6ZTogbW9kZWwuaW5wdXRTaXplLFxuICAgICAgICBlbmNvZGVyUHJvdmlkZXJzOiBtb2RlbC5lbmNvZGVyUHJvdmlkZXJzLFxuICAgICAgfSwgW10sIG9uUHJvZ3Jlc3MpO1xuICAgIH1cbiAgICB0aGlzLmxvYWRlZCA9IHRydWU7XG4gIH1cblxuICBpc0xvYWRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkZWQ7XG4gIH1cblxuICBhc3luYyBlbWJlZChpbWFnZTogeyBkYXRhOiBVaW50OENsYW1wZWRBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSk6IFByb21pc2U8U2FtRW1iZWRkaW5nPiB7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ2lucHJvYycpIHtcbiAgICAgIGNvbnN0IGUgPSBhd2FpdCBydW5FbmNvZGVyKHRoaXMuZW5jb2RlciEsIGltYWdlLmRhdGEsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIHRoaXMuaW5wdXRTaXplKTtcbiAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5uZXh0VG9rZW4rKztcbiAgICAgIHRoaXMuZW1iZWRkaW5ncy5zZXQodG9rZW4sIGUpO1xuICAgICAgaWYgKHRoaXMuZW1iZWRkaW5ncy5zaXplID4gMykgdGhpcy5lbWJlZGRpbmdzLmRlbGV0ZSh0aGlzLmVtYmVkZGluZ3Mua2V5cygpLm5leHQoKS52YWx1ZSBhcyBudW1iZXIpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogbmV3IEZsb2F0MzJBcnJheSgwKSwgZGltczogZS5kaW1zLCBzY2FsZTogZS5zY2FsZSxcbiAgICAgICAgaW1hZ2VXaWR0aDogZS5pbWFnZVdpZHRoLCBpbWFnZUhlaWdodDogZS5pbWFnZUhlaWdodCwgdG9rZW4sXG4gICAgICB9O1xuICAgIH1cbiAgICAvLyB3b3JrZXI6IHRyYW5zZmVyIHRoZSBSR0JBIGJ1ZmZlciAoY2FsbGVycyBwYXNzIGEgZnJlc2ggZnJhbWUgYnVmZmVyKS5cbiAgICBjb25zdCBidWZmZXIgPSBpbWFnZS5kYXRhLmJ1ZmZlcjtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNhbGwoeyB0eXBlOiAnZW1iZWQnLCB3aWR0aDogaW1hZ2Uud2lkdGgsIGhlaWdodDogaW1hZ2UuaGVpZ2h0LCBidWZmZXIgfSwgW2J1ZmZlcl0pO1xuICAgIHJldHVybiB7XG4gICAgICBkYXRhOiBuZXcgRmxvYXQzMkFycmF5KDApLCBkaW1zOiByZXMuZGltcywgc2NhbGU6IHJlcy5zY2FsZSxcbiAgICAgIGltYWdlV2lkdGg6IHJlcy5pbWFnZVdpZHRoLCBpbWFnZUhlaWdodDogcmVzLmltYWdlSGVpZ2h0LCB0b2tlbjogcmVzLnRva2VuLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBkZWNvZGUoZW1iZWRkaW5nOiBTYW1FbWJlZGRpbmcsIHByb21wdDogU2FtUHJvbXB0KTogUHJvbWlzZTxTYW1NYXNrUmVzdWx0PiB7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ2lucHJvYycpIHtcbiAgICAgIGNvbnN0IGUgPSB0aGlzLmVtYmVkZGluZ3MuZ2V0KGVtYmVkZGluZy50b2tlbiBhcyBudW1iZXIpO1xuICAgICAgaWYgKCFlKSB0aHJvdyBuZXcgRXJyb3IoJ1NBTSBlbWJlZGRpbmcgZXhwaXJlZDsgcmUtZW5jb2RlIHRoZSBpbWFnZS4nKTtcbiAgICAgIHJldHVybiBydW5EZWNvZGVyKHRoaXMuZGVjb2RlciEsIGUsIHByb21wdCk7XG4gICAgfVxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY2FsbCh7IHR5cGU6ICdkZWNvZGUnLCB0b2tlbjogZW1iZWRkaW5nLnRva2VuLCBwcm9tcHQgfSk7XG4gICAgcmV0dXJuIHsgbWFzazogbmV3IFVpbnQ4QXJyYXkocmVzLmJ1ZmZlciksIHdpZHRoOiByZXMud2lkdGgsIGhlaWdodDogcmVzLmhlaWdodCwgaW91OiByZXMuaW91IH07XG4gIH1cblxuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMud29ya2VyPy50ZXJtaW5hdGUoKTtcbiAgICB0aGlzLndvcmtlciA9IG51bGw7XG4gICAgdGhpcy5wZW5kaW5nLmNsZWFyKCk7XG4gICAgdGhpcy5lbmNvZGVyPy5yZWxlYXNlPy4oKTtcbiAgICB0aGlzLmRlY29kZXI/LnJlbGVhc2U/LigpO1xuICAgIHRoaXMuZW5jb2RlciA9IHRoaXMuZGVjb2RlciA9IG51bGw7XG4gICAgdGhpcy5lbWJlZGRpbmdzLmNsZWFyKCk7XG4gICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcbiAgICB0aGlzLm1vZGUgPSBudWxsO1xuICB9XG5cbiAgLy8g4pSA4pSAIHdvcmtlciBwbHVtYmluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgcHJpdmF0ZSBlbnN1cmVXb3JrZXIoKTogV29ya2VyIHtcbiAgICBpZiAodGhpcy53b3JrZXIpIHJldHVybiB0aGlzLndvcmtlcjtcbiAgICBjb25zdCB3b3JrZXIgPSBuZXcgV29ya2VyKG5ldyBVUkwoJy4vb25ueC1zYW0ud29ya2VyJywgaW1wb3J0Lm1ldGEudXJsKSwgeyB0eXBlOiAnbW9kdWxlJyB9KTtcbiAgICB3b3JrZXIub25tZXNzYWdlID0gKGV2OiBNZXNzYWdlRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IG0gPSBldi5kYXRhO1xuICAgICAgY29uc3QgcCA9IHRoaXMucGVuZGluZy5nZXQobS5pZCk7XG4gICAgICBpZiAoIXApIHJldHVybjtcbiAgICAgIGlmIChtLnR5cGUgPT09ICdwcm9ncmVzcycpIHsgcC5vblByb2dyZXNzPy4obS5mcmFjdGlvbik7IHJldHVybjsgfVxuICAgICAgdGhpcy5wZW5kaW5nLmRlbGV0ZShtLmlkKTtcbiAgICAgIGlmIChtLnR5cGUgPT09ICdlcnJvcicpIHAucmVqZWN0KG5ldyBFcnJvcihtLmVycm9yKSk7XG4gICAgICBlbHNlIHAucmVzb2x2ZShtKTtcbiAgICB9O1xuICAgIHdvcmtlci5vbmVycm9yID0gKGV2OiBFcnJvckV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoZXYubWVzc2FnZSB8fCAnU0FNIHdvcmtlciBjcmFzaGVkLicpO1xuICAgICAgZm9yIChjb25zdCBwIG9mIHRoaXMucGVuZGluZy52YWx1ZXMoKSkgcC5yZWplY3QoZXJyKTtcbiAgICAgIHRoaXMucGVuZGluZy5jbGVhcigpO1xuICAgIH07XG4gICAgdGhpcy53b3JrZXIgPSB3b3JrZXI7XG4gICAgcmV0dXJuIHdvcmtlcjtcbiAgfVxuXG4gIHByaXZhdGUgY2FsbChtc2c6IGFueSwgdHJhbnNmZXI6IFRyYW5zZmVyYWJsZVtdID0gW10sIG9uUHJvZ3Jlc3M/OiAoZjogbnVtYmVyKSA9PiB2b2lkKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBpZCA9ICsrdGhpcy5zZXE7XG4gICAgY29uc3Qgd29ya2VyID0gdGhpcy5lbnN1cmVXb3JrZXIoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5wZW5kaW5nLnNldChpZCwgeyByZXNvbHZlLCByZWplY3QsIG9uUHJvZ3Jlc3MgfSk7XG4gICAgICB3b3JrZXIucG9zdE1lc3NhZ2UoeyAuLi5tc2csIGlkIH0sIHRyYW5zZmVyKTtcbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
152
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25ueC1zYW0tc2Vzc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdG9vbGJhci9zZWdtZW50YXRpb24vb25ueC1zYW0tc2Vzc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3JDLE9BQU8sS0FBSyxHQUFHLE1BQU0saUJBQWlCLENBQUM7QUFHdkMsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFzQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFlLE1BQU0saUJBQWlCLENBQUM7QUFFNUQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFBM0I7UUFDVSxTQUFJLEdBQStCLElBQUksQ0FBQztRQUN4QyxXQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ2YsY0FBUyxHQUFHLElBQUksQ0FBQztRQUV6QixvQkFBb0I7UUFDWixXQUFNLEdBQWtCLElBQUksQ0FBQztRQUNwQixVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUU1Qyx3QkFBd0I7UUFDaEIsWUFBTyxHQUFnQyxJQUFJLENBQUM7UUFDNUMsWUFBTyxHQUFnQyxJQUFJLENBQUM7UUFDNUMsY0FBUyxHQUFHLENBQUMsQ0FBQztRQUN0Qix1RkFBdUY7UUFDdEUsZUFBVSxHQUFHLElBQUksUUFBUSxDQUF3QixDQUFDLENBQUMsQ0FBQztJQWlJdkUsQ0FBQztJQS9IQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQWtCLEVBQUUsVUFBdUM7UUFDekUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQyxjQUFjLEtBQUss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IjpbImltcG9ydCB7IExydUNhY2hlIH0gZnJvbSAnbmFwYXJpLWpzJztcbmltcG9ydCAqIGFzIG9ydCBmcm9tICdvbm54cnVudGltZS13ZWInO1xuXG5pbXBvcnQgeyBJU2FtU2Vzc2lvbiwgU2FtRW1iZWRkaW5nLCBTYW1NYXNrUmVzdWx0LCBTYW1Nb2RlbERlZiwgU2FtUHJvbXB0IH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3NhbS5jb250cmFjdCc7XG5pbXBvcnQgeyBmZXRjaE1vZGVsLCBydW5FbmNvZGVyLCBydW5EZWNvZGVyLCB0eXBlIENvcmVFbWJlZGRpbmcgfSBmcm9tICcuL3NhbS1vbm54LWNvcmUnO1xuaW1wb3J0IHsgZ2V0T3J0V2FzbUJhc2UgfSBmcm9tICcuL29ydC1ydW50aW1lLWNvbmZpZyc7XG5pbXBvcnQgeyBQZW5kaW5nQ2FsbHMsIFdvcmtlclJlcGx5IH0gZnJvbSAnLi9wZW5kaW5nLWNhbGxzJztcblxuLyoqXG4gKiBvbm54cnVudGltZS13ZWIgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElTYW1TZXNzaW9ufSAoaml0LXVpIzkwKSwgd2l0aCB0d29cbiAqIGV4ZWN1dGlvbiBtb2RlcyBjaG9zZW4gcGVyIG1vZGVsOlxuICpcbiAqICAtICoqaW4tcHJvY2VzcyoqIChtYWluIHRocmVhZCkg4oCUIGZvciBzbWFsbCBXQVNNIG1vZGVscyBmbGFnZ2VkIGBpblByb2Nlc3NgXG4gKiAgICAoZS5nLiBtaWNyby1zYW0gVmlULVQpLiBGYXN0IGxvYWQgKyBpbmZlcmVuY2Ugd2l0aCBubyBXZWIgV29ya2VyIHNwYXduIC9cbiAqICAgIHNlY29uZCBPUlQgcnVudGltZSAvIG1lc3NhZ2Ugcm91bmQtdHJpcHM7IHRoZSBicmllZiBlbmNvZGUgcnVucyBvbiB0aGUgbWFpblxuICogICAgdGhyZWFkIChmaW5lIGZvciBhIHRpbnkgbW9kZWwpLlxuICogIC0gKip3b3JrZXIqKiDigJQgZm9yIFdlYkdQVSBtb2RlbHMgKGUuZy4gVmlULUIsIHBhdGhvLXNhbSBmcDE2KSB3aG9zZSBoZWF2eVxuICogICAgZW5jb2RlIHdvdWxkIG90aGVyd2lzZSBmcmVlemUgdGhlIHRhYi4gUnVucyBpbiB7QGxpbmsgLi9vbm54LXNhbS53b3JrZXJ9IHNvXG4gKiAgICB0aGUgVUkgc3RheXMgcmVzcG9uc2l2ZSAodGhlIHNwaW5uZXIgYW5pbWF0ZXMpLlxuICpcbiAqIEJvdGggbW9kZXMgc2hhcmUgdGhlaXIgaW5mZXJlbmNlIG1hdGggdmlhIHtAbGluayAuL3NhbS1vbm54LWNvcmV9LiBMYXp5LWltcG9ydGVkXG4gKiBieSB0aGUgU0FNIHRvb2xzIHNvIG9ubnhydW50aW1lLXdlYiAvIHRoZSB3b3JrZXIgbmV2ZXIgbG9hZCBpbiB1bml0IHRlc3RzIG9yXG4gKiB0aGUgaW5pdGlhbCBidW5kbGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBPbm54U2FtU2Vzc2lvbiBpbXBsZW1lbnRzIElTYW1TZXNzaW9uIHtcbiAgcHJpdmF0ZSBtb2RlOiAnaW5wcm9jJyB8ICd3b3JrZXInIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbG9hZGVkID0gZmFsc2U7XG4gIHByaXZhdGUgaW5wdXRTaXplID0gMTAyNDtcblxuICAvLyDilIDilIAgd29ya2VyIG1vZGUg4pSA4pSAXG4gIHByaXZhdGUgd29ya2VyOiBXb3JrZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBjYWxscyA9IG5ldyBQZW5kaW5nQ2FsbHMoKTtcblxuICAvLyDilIDilIAgaW4tcHJvY2VzcyBtb2RlIOKUgOKUgFxuICBwcml2YXRlIGVuY29kZXI6IG9ydC5JbmZlcmVuY2VTZXNzaW9uIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZGVjb2Rlcjogb3J0LkluZmVyZW5jZVNlc3Npb24gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBuZXh0VG9rZW4gPSAxO1xuICAvKiogVGhlIGZldyBtb3N0IHJlY2VudGx5IHVzZWQgZW1iZWRkaW5ncywgYnkgdG9rZW4gKG9uZSBwZXIgcmVjZW50bHkgdmlld2VkIGltYWdlKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBlbWJlZGRpbmdzID0gbmV3IExydUNhY2hlPENvcmVFbWJlZGRpbmcsIG51bWJlcj4oMyk7XG5cbiAgYXN5bmMgbG9hZE1vZGVsKG1vZGVsOiBTYW1Nb2RlbERlZiwgb25Qcm9ncmVzcz86IChmcmFjdGlvbjogbnVtYmVyKSA9PiB2b2lkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFtb2RlbC5lbmNvZGVyVXJsIHx8ICFtb2RlbC5kZWNvZGVyVXJsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNBTSBtb2RlbCBcIiR7bW9kZWwuaWR9XCIgaGFzIG5vIE9OTlggVVJMcyBjb25maWd1cmVkLmApO1xuICAgIH1cbiAgICB0aGlzLmlucHV0U2l6ZSA9IG1vZGVsLmlucHV0U2l6ZTtcbiAgICBjb25zdCBoYXNHcHUgPSB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiAnZ3B1JyBpbiBuYXZpZ2F0b3I7XG4gICAgY29uc3QgZXBzOiBzdHJpbmdbXSA9IG1vZGVsLmVuY29kZXJQcm92aWRlcnMgPz8gKGhhc0dwdSA/IFsnd2ViZ3B1JywgJ3dhc20nXSA6IFsnd2FzbSddKTtcbiAgICBjb25zdCB1c2VzV2ViR3B1ID0gZXBzLmluY2x1ZGVzKCd3ZWJncHUnKTtcbiAgICAvLyBXZWJHUFUgbXVzdCBydW4gaW4gdGhlIHdvcmtlciAoZWxzZSBpdCBmcmVlemVzIHRoZSBtYWluIHRocmVhZCk7IHNtYWxsXG4gICAgLy8gV0FTTSBtb2RlbHMgb3B0IGludG8gdGhlIGZhc3RlciBpbi1wcm9jZXNzIHBhdGggdmlhIGBpblByb2Nlc3NgLlxuICAgIHRoaXMubW9kZSA9ICF1c2VzV2ViR3B1ICYmIG1vZGVsLmluUHJvY2VzcyA/ICdpbnByb2MnIDogJ3dvcmtlcic7XG5cbiAgICBpZiAodGhpcy5tb2RlID09PSAnaW5wcm9jJykge1xuICAgICAgb3J0LmVudi53YXNtLndhc21QYXRocyA9IGdldE9ydFdhc21CYXNlKCk7XG4gICAgICBjb25zdCBlbmNCdWYgPSBhd2FpdCBmZXRjaE1vZGVsKG1vZGVsLmVuY29kZXJVcmwsIG9uUHJvZ3Jlc3MsIG1vZGVsLnJldmlzaW9uKTtcbiAgICAgIGNvbnN0IGRlY0J1ZiA9IGF3YWl0IGZldGNoTW9kZWwobW9kZWwuZGVjb2RlclVybCwgdW5kZWZpbmVkLCBtb2RlbC5yZXZpc2lvbik7XG4gICAgICB0aGlzLmVuY29kZXIgPSBhd2FpdCBvcnQuSW5mZXJlbmNlU2Vzc2lvbi5jcmVhdGUoZW5jQnVmLCB7IGV4ZWN1dGlvblByb3ZpZGVyczogZXBzIH0pO1xuICAgICAgdGhpcy5kZWNvZGVyID0gYXdhaXQgb3J0LkluZmVyZW5jZVNlc3Npb24uY3JlYXRlKGRlY0J1ZiwgeyBleGVjdXRpb25Qcm92aWRlcnM6IFsnd2FzbSddIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmNhbGwoXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnbG9hZCcsXG4gICAgICAgICAgZW5jb2RlclVybDogbW9kZWwuZW5jb2RlclVybCxcbiAgICAgICAgICBkZWNvZGVyVXJsOiBtb2RlbC5kZWNvZGVyVXJsLFxuICAgICAgICAgIHJldmlzaW9uOiBtb2RlbC5yZXZpc2lvbixcbiAgICAgICAgICB3YXNtUGF0aHM6IGdldE9ydFdhc21CYXNlKCksXG4gICAgICAgICAgaW5wdXRTaXplOiBtb2RlbC5pbnB1dFNpemUsXG4gICAgICAgICAgZW5jb2RlclByb3ZpZGVyczogbW9kZWwuZW5jb2RlclByb3ZpZGVycyxcbiAgICAgICAgfSxcbiAgICAgICAgW10sXG4gICAgICAgIG9uUHJvZ3Jlc3MsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmxvYWRlZCA9IHRydWU7XG4gIH1cblxuICBpc0xvYWRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkZWQ7XG4gIH1cblxuICBhc3luYyBlbWJlZChpbWFnZTogeyBkYXRhOiBVaW50OENsYW1wZWRBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSk6IFByb21pc2U8U2FtRW1iZWRkaW5nPiB7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ2lucHJvYycpIHtcbiAgICAgIGNvbnN0IGUgPSBhd2FpdCBydW5FbmNvZGVyKHRoaXMuZW5jb2RlciEsIGltYWdlLmRhdGEsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIHRoaXMuaW5wdXRTaXplKTtcbiAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5uZXh0VG9rZW4rKztcbiAgICAgIHRoaXMuZW1iZWRkaW5ncy5zZXQodG9rZW4sIGUpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogbmV3IEZsb2F0MzJBcnJheSgwKSxcbiAgICAgICAgZGltczogZS5kaW1zLFxuICAgICAgICBzY2FsZTogZS5zY2FsZSxcbiAgICAgICAgaW1hZ2VXaWR0aDogZS5pbWFnZVdpZHRoLFxuICAgICAgICBpbWFnZUhlaWdodDogZS5pbWFnZUhlaWdodCxcbiAgICAgICAgdG9rZW4sXG4gICAgICB9O1xuICAgIH1cbiAgICAvLyB3b3JrZXI6IHRyYW5zZmVyIHRoZSBSR0JBIGJ1ZmZlciAoY2FsbGVycyBwYXNzIGEgZnJlc2ggZnJhbWUgYnVmZmVyKS5cbiAgICBjb25zdCBidWZmZXIgPSBpbWFnZS5kYXRhLmJ1ZmZlcjtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNhbGwoeyB0eXBlOiAnZW1iZWQnLCB3aWR0aDogaW1hZ2Uud2lkdGgsIGhlaWdodDogaW1hZ2UuaGVpZ2h0LCBidWZmZXIgfSwgW2J1ZmZlcl0pO1xuICAgIHJldHVybiB7XG4gICAgICBkYXRhOiBuZXcgRmxvYXQzMkFycmF5KDApLFxuICAgICAgZGltczogcmVzWydkaW1zJ10gYXMgbnVtYmVyW10sXG4gICAgICBzY2FsZTogcmVzWydzY2FsZSddIGFzIG51bWJlcixcbiAgICAgIGltYWdlV2lkdGg6IHJlc1snaW1hZ2VXaWR0aCddIGFzIG51bWJlcixcbiAgICAgIGltYWdlSGVpZ2h0OiByZXNbJ2ltYWdlSGVpZ2h0J10gYXMgbnVtYmVyLFxuICAgICAgdG9rZW46IHJlc1sndG9rZW4nXSBhcyBudW1iZXIsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGRlY29kZShlbWJlZGRpbmc6IFNhbUVtYmVkZGluZywgcHJvbXB0OiBTYW1Qcm9tcHQpOiBQcm9taXNlPFNhbU1hc2tSZXN1bHQ+IHtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnaW5wcm9jJykge1xuICAgICAgY29uc3QgZSA9IHRoaXMuZW1iZWRkaW5ncy5nZXQoZW1iZWRkaW5nLnRva2VuIGFzIG51bWJlcik7XG4gICAgICBpZiAoIWUpIHRocm93IG5ldyBFcnJvcignU0FNIGVtYmVkZGluZyBleHBpcmVkOyByZS1lbmNvZGUgdGhlIGltYWdlLicpO1xuICAgICAgcmV0dXJuIHJ1bkRlY29kZXIodGhpcy5kZWNvZGVyISwgZSwgcHJvbXB0KTtcbiAgICB9XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jYWxsKHsgdHlwZTogJ2RlY29kZScsIHRva2VuOiBlbWJlZGRpbmcudG9rZW4sIHByb21wdCB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgbWFzazogbmV3IFVpbnQ4QXJyYXkocmVzWydidWZmZXInXSBhcyBBcnJheUJ1ZmZlciksXG4gICAgICB3aWR0aDogcmVzWyd3aWR0aCddIGFzIG51bWJlcixcbiAgICAgIGhlaWdodDogcmVzWydoZWlnaHQnXSBhcyBudW1iZXIsXG4gICAgICBpb3U6IHJlc1snaW91J10gYXMgbnVtYmVyLFxuICAgIH07XG4gIH1cblxuICAvKiogUmVsZWFzZSB0aGUgd29ya2VyIC8gT1JUIHNlc3Npb25zLiBDYWxscyBzdGlsbCBpbiBmbGlnaHQgcmVqZWN0IChSVC04KSwgc29cbiAgICogIHRoZWlyIGNhbGxlcnMnIGBmaW5hbGx5YCBibG9ja3MgcnVuIChlLmcuIGEgdG9vbCdzIGJ1c3kgZmxhZyBjbGVhcnMpLiAqL1xuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuZHJvcFdvcmtlcihuZXcgRXJyb3IoJ1NBTSBzZXNzaW9uIGRpc3Bvc2VkJykpO1xuICAgIHRoaXMuZW5jb2Rlcj8ucmVsZWFzZT8uKCk7XG4gICAgdGhpcy5kZWNvZGVyPy5yZWxlYXNlPy4oKTtcbiAgICB0aGlzLmVuY29kZXIgPSB0aGlzLmRlY29kZXIgPSBudWxsO1xuICAgIHRoaXMuZW1iZWRkaW5ncy5jbGVhcigpO1xuICAgIHRoaXMubG9hZGVkID0gZmFsc2U7XG4gICAgdGhpcy5tb2RlID0gbnVsbDtcbiAgfVxuXG4gIC8vIOKUgOKUgCB3b3JrZXIgcGx1bWJpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHByaXZhdGUgZW5zdXJlV29ya2VyKCk6IFdvcmtlciB7XG4gICAgaWYgKHRoaXMud29ya2VyKSByZXR1cm4gdGhpcy53b3JrZXI7XG4gICAgY29uc3Qgd29ya2VyID0gbmV3IFdvcmtlcihuZXcgVVJMKCcuL29ubngtc2FtLndvcmtlcicsIGltcG9ydC5tZXRhLnVybCksIHsgdHlwZTogJ21vZHVsZScgfSk7XG4gICAgd29ya2VyLm9ubWVzc2FnZSA9IChldjogTWVzc2FnZUV2ZW50PFdvcmtlclJlcGx5PikgPT4gdGhpcy5jYWxscy5oYW5kbGUoZXYuZGF0YSk7XG4gICAgd29ya2VyLm9uZXJyb3IgPSAoZXY6IEVycm9yRXZlbnQpID0+IHtcbiAgICAgIC8vIEEgY3Jhc2hlZCB3b3JrZXIgY2FuJ3Qgc2VydmUgdGhlIGxvYWRlZCBtb2RlbCBhbnkgbW9yZTogZHJvcCBpdCwgc28gdGhlXG4gICAgICAvLyBuZXh0IHJ1biByZWxvYWRzIGluc3RlYWQgb2YgcG9zdGluZyB0byBhIGRlYWQgd29ya2VyLlxuICAgICAgdGhpcy5kcm9wV29ya2VyKG5ldyBFcnJvcihldi5tZXNzYWdlIHx8ICdTQU0gd29ya2VyIGNyYXNoZWQuJykpO1xuICAgICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMubW9kZSA9IG51bGw7XG4gICAgfTtcbiAgICB0aGlzLndvcmtlciA9IHdvcmtlcjtcbiAgICByZXR1cm4gd29ya2VyO1xuICB9XG5cbiAgLyoqIFRlcm1pbmF0ZSB0aGUgd29ya2VyIChpZiBhbnkpIGFuZCByZWplY3QgZXZlcnkgY2FsbCBzdGlsbCB3YWl0aW5nIG9uIGl0LiAqL1xuICBwcml2YXRlIGRyb3BXb3JrZXIoZXJyOiBFcnJvcik6IHZvaWQge1xuICAgIHRoaXMud29ya2VyPy50ZXJtaW5hdGUoKTtcbiAgICB0aGlzLndvcmtlciA9IG51bGw7XG4gICAgdGhpcy5jYWxscy5yZWplY3RBbGwoZXJyKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsbChcbiAgICBtc2c6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIHRyYW5zZmVyOiBUcmFuc2ZlcmFibGVbXSA9IFtdLFxuICAgIG9uUHJvZ3Jlc3M/OiAoZjogbnVtYmVyKSA9PiB2b2lkLFxuICApOiBQcm9taXNlPFdvcmtlclJlcGx5PiB7XG4gICAgY29uc3Qgd29ya2VyID0gdGhpcy5lbnN1cmVXb3JrZXIoKTtcbiAgICBjb25zdCB7IGlkLCBwcm9taXNlIH0gPSB0aGlzLmNhbGxzLm9wZW4ob25Qcm9ncmVzcyk7XG4gICAgd29ya2VyLnBvc3RNZXNzYWdlKHsgLi4ubXNnLCBpZCB9LCB0cmFuc2Zlcik7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Request/response bookkeeping for a worker RPC: each call gets an id and a
|
|
3
|
+
* promise that its reply settles. Every exit path (dispose, a worker crash)
|
|
4
|
+
* must {@link rejectAll}, or awaiting callers never reach their `finally` and a
|
|
5
|
+
* tool's busy flag sticks forever (RT-8).
|
|
6
|
+
*/
|
|
7
|
+
export class PendingCalls {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.seq = 0;
|
|
10
|
+
this.pending = new Map();
|
|
11
|
+
}
|
|
12
|
+
/** Calls still awaiting a reply. */
|
|
13
|
+
get size() {
|
|
14
|
+
return this.pending.size;
|
|
15
|
+
}
|
|
16
|
+
/** Register a new call; post the message with the returned id. */
|
|
17
|
+
open(onProgress) {
|
|
18
|
+
const id = ++this.seq;
|
|
19
|
+
const promise = new Promise((resolve, reject) => {
|
|
20
|
+
this.pending.set(id, { resolve, reject, onProgress });
|
|
21
|
+
});
|
|
22
|
+
return { id, promise };
|
|
23
|
+
}
|
|
24
|
+
/** Route a worker reply to its call: progress, error or result. */
|
|
25
|
+
handle(reply) {
|
|
26
|
+
const p = this.pending.get(reply.id);
|
|
27
|
+
if (!p)
|
|
28
|
+
return;
|
|
29
|
+
if (reply.type === 'progress') {
|
|
30
|
+
p.onProgress?.(reply.fraction ?? 0);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
this.pending.delete(reply.id);
|
|
34
|
+
if (reply.type === 'error')
|
|
35
|
+
p.reject(new Error(reply.error ?? 'SAM worker error.'));
|
|
36
|
+
else
|
|
37
|
+
p.resolve(reply);
|
|
38
|
+
}
|
|
39
|
+
/** Reject every pending call with `err` and forget them. */
|
|
40
|
+
rejectAll(err) {
|
|
41
|
+
const calls = Array.from(this.pending.values());
|
|
42
|
+
this.pending.clear();
|
|
43
|
+
for (const p of calls)
|
|
44
|
+
p.reject(err);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVuZGluZy1jYWxscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdG9vbGJhci9zZWdtZW50YXRpb24vcGVuZGluZy1jYWxscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkE7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUF6QjtRQUNVLFFBQUcsR0FBRyxDQUFDLENBQUM7UUFDQyxZQUFPLEdBQUcsSUFBSSxHQUFHLEVBQW1CLENBQUM7SUFtQ3hELENBQUM7SUFqQ0Msb0NBQW9DO0lBQ3BDLElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7SUFDM0IsQ0FBQztJQUVELGtFQUFrRTtJQUNsRSxJQUFJLENBQUMsVUFBdUM7UUFDMUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ3RCLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFjLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQzNELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUN4RCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELG1FQUFtRTtJQUNuRSxNQUFNLENBQUMsS0FBa0I7UUFDdkIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxDQUFDO1lBQUUsT0FBTztRQUNmLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUM5QixDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNwQyxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5QixJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssT0FBTztZQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7O1lBQy9FLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELDREQUE0RDtJQUM1RCxTQUFTLENBQUMsR0FBVTtRQUNsQixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3JCLEtBQUssTUFBTSxDQUFDLElBQUksS0FBSztZQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIEEgcmVwbHkgZnJvbSB0aGUgU0FNIHdvcmtlcjogcHJvZ3Jlc3MgZm9yLCBvciB0aGUgcmVzdWx0IG9mLCBjYWxsIGBpZGAuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtlclJlcGx5IHtcbiAgaWQ6IG51bWJlcjtcbiAgdHlwZTogc3RyaW5nO1xuICAvKiogUHJlc2VudCBvbiBgdHlwZTogJ3Byb2dyZXNzJ2AgcmVwbGllcy4gKi9cbiAgZnJhY3Rpb24/OiBudW1iZXI7XG4gIC8qKiBQcmVzZW50IG9uIGB0eXBlOiAnZXJyb3InYCByZXBsaWVzLiAqL1xuICBlcnJvcj86IHN0cmluZztcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn1cblxuaW50ZXJmYWNlIFBlbmRpbmcge1xuICByZXNvbHZlOiAocmVwbHk6IFdvcmtlclJlcGx5KSA9PiB2b2lkO1xuICByZWplY3Q6IChlcnI6IEVycm9yKSA9PiB2b2lkO1xuICBvblByb2dyZXNzPzogKGZyYWN0aW9uOiBudW1iZXIpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogUmVxdWVzdC9yZXNwb25zZSBib29ra2VlcGluZyBmb3IgYSB3b3JrZXIgUlBDOiBlYWNoIGNhbGwgZ2V0cyBhbiBpZCBhbmQgYVxuICogcHJvbWlzZSB0aGF0IGl0cyByZXBseSBzZXR0bGVzLiBFdmVyeSBleGl0IHBhdGggKGRpc3Bvc2UsIGEgd29ya2VyIGNyYXNoKVxuICogbXVzdCB7QGxpbmsgcmVqZWN0QWxsfSwgb3IgYXdhaXRpbmcgY2FsbGVycyBuZXZlciByZWFjaCB0aGVpciBgZmluYWxseWAgYW5kIGFcbiAqIHRvb2wncyBidXN5IGZsYWcgc3RpY2tzIGZvcmV2ZXIgKFJULTgpLlxuICovXG5leHBvcnQgY2xhc3MgUGVuZGluZ0NhbGxzIHtcbiAgcHJpdmF0ZSBzZXEgPSAwO1xuICBwcml2YXRlIHJlYWRvbmx5IHBlbmRpbmcgPSBuZXcgTWFwPG51bWJlciwgUGVuZGluZz4oKTtcblxuICAvKiogQ2FsbHMgc3RpbGwgYXdhaXRpbmcgYSByZXBseS4gKi9cbiAgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wZW5kaW5nLnNpemU7XG4gIH1cblxuICAvKiogUmVnaXN0ZXIgYSBuZXcgY2FsbDsgcG9zdCB0aGUgbWVzc2FnZSB3aXRoIHRoZSByZXR1cm5lZCBpZC4gKi9cbiAgb3BlbihvblByb2dyZXNzPzogKGZyYWN0aW9uOiBudW1iZXIpID0+IHZvaWQpOiB7IGlkOiBudW1iZXI7IHByb21pc2U6IFByb21pc2U8V29ya2VyUmVwbHk+IH0ge1xuICAgIGNvbnN0IGlkID0gKyt0aGlzLnNlcTtcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8V29ya2VyUmVwbHk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMucGVuZGluZy5zZXQoaWQsIHsgcmVzb2x2ZSwgcmVqZWN0LCBvblByb2dyZXNzIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiB7IGlkLCBwcm9taXNlIH07XG4gIH1cblxuICAvKiogUm91dGUgYSB3b3JrZXIgcmVwbHkgdG8gaXRzIGNhbGw6IHByb2dyZXNzLCBlcnJvciBvciByZXN1bHQuICovXG4gIGhhbmRsZShyZXBseTogV29ya2VyUmVwbHkpOiB2b2lkIHtcbiAgICBjb25zdCBwID0gdGhpcy5wZW5kaW5nLmdldChyZXBseS5pZCk7XG4gICAgaWYgKCFwKSByZXR1cm47XG4gICAgaWYgKHJlcGx5LnR5cGUgPT09ICdwcm9ncmVzcycpIHtcbiAgICAgIHAub25Qcm9ncmVzcz8uKHJlcGx5LmZyYWN0aW9uID8/IDApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnBlbmRpbmcuZGVsZXRlKHJlcGx5LmlkKTtcbiAgICBpZiAocmVwbHkudHlwZSA9PT0gJ2Vycm9yJykgcC5yZWplY3QobmV3IEVycm9yKHJlcGx5LmVycm9yID8/ICdTQU0gd29ya2VyIGVycm9yLicpKTtcbiAgICBlbHNlIHAucmVzb2x2ZShyZXBseSk7XG4gIH1cblxuICAvKiogUmVqZWN0IGV2ZXJ5IHBlbmRpbmcgY2FsbCB3aXRoIGBlcnJgIGFuZCBmb3JnZXQgdGhlbS4gKi9cbiAgcmVqZWN0QWxsKGVycjogRXJyb3IpOiB2b2lkIHtcbiAgICBjb25zdCBjYWxscyA9IEFycmF5LmZyb20odGhpcy5wZW5kaW5nLnZhbHVlcygpKTtcbiAgICB0aGlzLnBlbmRpbmcuY2xlYXIoKTtcbiAgICBmb3IgKGNvbnN0IHAgb2YgY2FsbHMpIHAucmVqZWN0KGVycik7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -12,7 +12,12 @@
|
|
|
12
12
|
* cellpose default). A host can repoint them at its own hosting (e.g. a GCS
|
|
13
13
|
* bucket) at runtime via {@link setSamModelUrls}; an empty URL disables a model
|
|
14
14
|
* (the session throws a clear "not configured" error). Export/quantization
|
|
15
|
-
* tooling: the sibling `browser-onnx-tools` project; see
|
|
15
|
+
* tooling: the sibling `browser-onnx-tools` project; see
|
|
16
|
+
* docs/design/sam-segmentation-design.md.
|
|
17
|
+
*
|
|
18
|
+
* Downloads are cached in the browser by URL and `revision`: when a model's files are
|
|
19
|
+
* re-exported under the same URLs, set (or bump) its `revision` so browsers fetch the
|
|
20
|
+
* new files instead of serving the old ones from cache.
|
|
16
21
|
*/
|
|
17
22
|
export const SAM_MODELS = [
|
|
18
23
|
{
|
|
@@ -92,17 +97,20 @@ export function isSamModelReady(model) {
|
|
|
92
97
|
/**
|
|
93
98
|
* Point a registered model at its hosted ONNX pair (HF / GCS). Called by the
|
|
94
99
|
* host's composition root once hosting is decided, keeping deployment URLs out
|
|
95
|
-
* of the library.
|
|
100
|
+
* of the library. Pass `revision` when the files at those URLs can be replaced in
|
|
101
|
+
* place, and change it whenever they are (see {@link SamModelDef.revision}).
|
|
96
102
|
*/
|
|
97
|
-
export function setSamModelUrls(id, encoderUrl, decoderUrl) {
|
|
103
|
+
export function setSamModelUrls(id, encoderUrl, decoderUrl, revision) {
|
|
98
104
|
const m = SAM_MODELS.find((x) => x.id === id);
|
|
99
105
|
if (m) {
|
|
100
106
|
m.encoderUrl = encoderUrl;
|
|
101
107
|
m.decoderUrl = decoderUrl;
|
|
108
|
+
if (revision !== undefined)
|
|
109
|
+
m.revision = revision;
|
|
102
110
|
// The configured (hosted) model becomes the active default, so the tools
|
|
103
111
|
// use it rather than the first registry entry (which may be unhosted).
|
|
104
112
|
if (encoderUrl && decoderUrl)
|
|
105
113
|
activeDefaultId = id;
|
|
106
114
|
}
|
|
107
115
|
}
|
|
108
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FtLW1vZGVsLXJlZ2lzdHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90b29sYmFyL3NlZ21lbnRhdGlvbi9zYW0tbW9kZWwtcmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFrQjtJQUN2QztRQUNFLEVBQUUsRUFBRSxtQkFBbUI7UUFDdkIsS0FBSyxFQUFFLGlCQUFpQjtRQUN4QixVQUFVLEVBQUUsOEZBQThGO1FBQzFHLFVBQVUsRUFBRSx5RkFBeUY7UUFDckcsT0FBTyxFQUFFLE1BQU07UUFDZixTQUFTLEVBQUUsSUFBSTtRQUNmLFVBQVUsRUFBRSxJQUFJO1FBQ2hCLDBFQUEwRTtRQUMxRSx3RUFBd0U7UUFDeEUsaUVBQWlFO1FBQ2pFLGdCQUFnQixFQUFFLENBQUMsTUFBTSxDQUFDO1FBQzFCLHFFQUFxRTtRQUNyRSwyRUFBMkU7UUFDM0UseUNBQXlDO1FBQ3pDLFNBQVMsRUFBRSxJQUFJO0tBQ2hCO0lBQ0Q7UUFDRSxFQUFFLEVBQUUsbUJBQW1CO1FBQ3ZCLEtBQUssRUFBRSxpQkFBaUI7UUFDeEIsVUFBVSxFQUFFLDhGQUE4RjtRQUMxRyxVQUFVLEVBQUUseUZBQXlGO1FBQ3JHLE9BQU8sRUFBRSxNQUFNO1FBQ2YsU0FBUyxFQUFFLElBQUk7UUFDZixVQUFVLEVBQUUsSUFBSTtLQUNqQjtJQUNEO1FBQ0UsRUFBRSxFQUFFLGlCQUFpQjtRQUNyQixLQUFLLEVBQUUsaUJBQWlCO1FBQ3hCLFVBQVUsRUFBRSw0RkFBNEY7UUFDeEcsVUFBVSxFQUFFLHVGQUF1RjtRQUNuRyxPQUFPLEVBQUUsTUFBTTtRQUNmLFNBQVMsRUFBRSxJQUFJO1FBQ2YsVUFBVSxFQUFFLElBQUk7S0FDakI7SUFDRDtRQUNFLEVBQUUsRUFBRSxzQkFBc0I7UUFDMUIsS0FBSyxFQUFFLHdCQUF3QjtRQUMvQixVQUFVLEVBQUUsNEZBQTRGO1FBQ3hHLFVBQVUsRUFBRSx1RkFBdUY7UUFDbkcsT0FBTyxFQUFFLE1BQU07UUFDZixTQUFTLEVBQUUsSUFBSTtRQUNmLFVBQVUsRUFBRSxJQUFJO1FBQ2hCLDRFQUE0RTtRQUM1RSw0RUFBNEU7UUFDNUUseUVBQXlFO1FBQ3pFLGdCQUFnQixFQUFFLENBQUMsTUFBTSxDQUFDO0tBQzNCO0NBQ0YsQ0FBQztBQUVGO2lEQUNpRDtBQUNqRCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBRXJEO29GQUNvRjtBQUNwRixJQUFJLGVBQWUsR0FBRyxvQkFBb0IsQ0FBQztBQUUzQztzQkFDc0I7QUFDdEIsTUFBTSxVQUFVLFdBQVcsQ0FBQyxFQUFXO0lBQ3JDLE1BQU0sTUFBTSxHQUFHLEVBQUUsSUFBSSxlQUFlLENBQUM7SUFDckMsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLE1BQU0sQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRSxDQUFDO0FBRUQsMEVBQTBFO0FBQzFFLE1BQU0sVUFBVSxvQkFBb0I7SUFDbEMsT0FBTyxlQUFlLENBQUM7QUFDekIsQ0FBQztBQUVELG9FQUFvRTtBQUNwRSxNQUFNLFVBQVUsa0JBQWtCLENBQUMsRUFBVTtJQUMzQyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQUUsZUFBZSxHQUFHLEVBQUUsQ0FBQztBQUNoRSxDQUFDO0FBRUQsa0ZBQWtGO0FBQ2xGLE1BQU0sVUFBVSxlQUFlLENBQUMsS0FBa0I7SUFDaEQsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztBQUNsRCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsRUFBVSxFQUFFLFVBQWtCLEVBQUUsVUFBa0I7SUFDaEYsTUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUM5QyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ04sQ0FBQyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDMUIsQ0FBQyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDMUIseUVBQXlFO1FBQ3pFLHVFQUF1RTtRQUN2RSxJQUFJLFVBQVUsSUFBSSxVQUFVO1lBQUUsZUFBZSxHQUFHLEVBQUUsQ0FBQztJQUNyRCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNhbU1vZGVsRGVmIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3NhbS5jb250cmFjdCc7XG5cbi8qKlxuICogUmVnaXN0cnkgb2YgcHJvbXB0YWJsZSBTQU0gbW9kZWxzIGZvciB0aGUgYnJvd3NlciBzZWdtZW50IHRvb2wuXG4gKlxuICogbWljcm8tc2FtIChtaWNyb3Njb3B5LWZpbmV0dW5lZCwgcHJvbXB0YWJsZSkgYW5kIHBhdGhvLXNhbSAoaGlzdG9wYXRob2xvZ3ktXG4gKiBmaW5ldHVuZWQpIGFyZSBlbnRyaWVzOyBTQU0zIHNsb3RzIGluIGhlcmUgb25jZSBpdHMgcXVhbnRpemVkIE9OTlggZXhwb3J0IGFuZFxuICogYSBgdmFyaWFudDogJ3NhbTMnYCBkZWNvZGVyIHBhdGggYXJlIHB1Ymxpc2hlZC4gVGhlXG4gKiBhdXRvbWF0aWMgY2VsbHBvc2UtU0FNIG1vZGVsIGlzIGludGVudGlvbmFsbHkgTk9UIGhlcmUg4oCUIGl0J3Mgbm90IHByb21wdGFibGVcbiAqIGFuZCBsaXZlcyBpbiB0aGUgcHJvY2Vzc2luZy1waXBlbGluZSdzIGNlbGxwb3NlIGVuZ2luZSBhcyB0aGUgYXV0b21hdGljIHRvb2wuXG4gKlxuICogYGVuY29kZXJVcmxgIC8gYGRlY29kZXJVcmxgIHBvaW50IGF0IHRoZSBwdWJsaWMgSEYtaG9zdGVkIE9OTlggcGFpcnMgYnlcbiAqIGRlZmF1bHQsIHNvIHRoZSBzZWdtZW50IHRvb2xzIHdvcmsgb3V0IG9mIHRoZSBib3ggaW4gYW55IGhvc3QgKG1pcnJvcmluZyB0aGVcbiAqIGNlbGxwb3NlIGRlZmF1bHQpLiBBIGhvc3QgY2FuIHJlcG9pbnQgdGhlbSBhdCBpdHMgb3duIGhvc3RpbmcgKGUuZy4gYSBHQ1NcbiAqIGJ1Y2tldCkgYXQgcnVudGltZSB2aWEge0BsaW5rIHNldFNhbU1vZGVsVXJsc307IGFuIGVtcHR5IFVSTCBkaXNhYmxlcyBhIG1vZGVsXG4gKiAodGhlIHNlc3Npb24gdGhyb3dzIGEgY2xlYXIgXCJub3QgY29uZmlndXJlZFwiIGVycm9yKS4gRXhwb3J0L3F1YW50aXphdGlvblxuICogdG9vbGluZzogdGhlIHNpYmxpbmcgYGJyb3dzZXItb25ueC10b29sc2AgcHJvamVjdDsgc2VlIGRvY3Mvc2FtLXNlZ21lbnRhdGlvbi1kZXNpZ24ubWQuXG4gKi9cbmV4cG9ydCBjb25zdCBTQU1fTU9ERUxTOiBTYW1Nb2RlbERlZltdID0gW1xuICB7XG4gICAgaWQ6ICdtaWNyb3NhbS12aXQtdC1sbScsXG4gICAgbGFiZWw6ICdtaWNyby1zYW0gVmlULVQnLFxuICAgIGVuY29kZXJVcmw6ICdodHRwczovL2h1Z2dpbmdmYWNlLmNvL2pheC1pbWFnZS10b29scy9taWNyb3NhbS12aXQtdC1sbS1vbm54L3Jlc29sdmUvbWFpbi9lbmNvZGVyLmZwMTYub25ueCcsXG4gICAgZGVjb2RlclVybDogJ2h0dHBzOi8vaHVnZ2luZ2ZhY2UuY28vamF4LWltYWdlLXRvb2xzL21pY3Jvc2FtLXZpdC10LWxtLW9ubngvcmVzb2x2ZS9tYWluL2RlY29kZXIub25ueCcsXG4gICAgdmFyaWFudDogJ3NhbTEnLFxuICAgIGlucHV0U2l6ZTogMTAyNCxcbiAgICBtaWNyb3Njb3B5OiB0cnVlLFxuICAgIC8vIFRpbnlWaVQncyBmcDE2IGF0dGVudGlvbiBvdmVyZmxvd3Mgb24gdGhlIG9ubnhydW50aW1lLXdlYiBXZWJHUFUgRVAgYW5kXG4gICAgLy8gcmV0dXJucyBhbiBlbXB0eSBtYXNrIChcIk5vIG1hc2tzIGZvdW5kXCIpOyBpdCdzIG51bWVyaWNhbGx5IGNvcnJlY3Qgb25cbiAgICAvLyBXQVNNLCBhbmQgdGhlIGVuY29kZXIgaXMgdGlueSAofjE0IE1CKSBzbyBXQVNNIGlzIHBsZW50eSBmYXN0LlxuICAgIGVuY29kZXJQcm92aWRlcnM6IFsnd2FzbSddLFxuICAgIC8vIFNtYWxsIGVub3VnaCB0byBydW4gaW4tcHJvY2VzcyBvbiB0aGUgbWFpbiB0aHJlYWQg4oCUIGF2b2lkcyB0aGUgV2ViXG4gICAgLy8gV29ya2VyJ3Mgc3Bhd24gLyBzZWNvbmQtT1JULXJ1bnRpbWUgLyByb3VuZC10cmlwIG92ZXJoZWFkLCB3aGljaCBtYWRlIGl0XG4gICAgLy8gbm90aWNlYWJseSBzbG93ZXIgdG8gbG9hZCBhbmQgc2VnbWVudC5cbiAgICBpblByb2Nlc3M6IHRydWUsXG4gIH0sXG4gIHtcbiAgICBpZDogJ21pY3Jvc2FtLXZpdC1iLWxtJyxcbiAgICBsYWJlbDogJ21pY3JvLXNhbSBWaVQtQicsXG4gICAgZW5jb2RlclVybDogJ2h0dHBzOi8vaHVnZ2luZ2ZhY2UuY28vamF4LWltYWdlLXRvb2xzL21pY3Jvc2FtLXZpdC1iLWxtLW9ubngvcmVzb2x2ZS9tYWluL2VuY29kZXIuZnAxNi5vbm54JyxcbiAgICBkZWNvZGVyVXJsOiAnaHR0cHM6Ly9odWdnaW5nZmFjZS5jby9qYXgtaW1hZ2UtdG9vbHMvbWljcm9zYW0tdml0LWItbG0tb25ueC9yZXNvbHZlL21haW4vZGVjb2Rlci5vbm54JyxcbiAgICB2YXJpYW50OiAnc2FtMScsXG4gICAgaW5wdXRTaXplOiAxMDI0LFxuICAgIG1pY3Jvc2NvcHk6IHRydWUsXG4gIH0sXG4gIHtcbiAgICBpZDogJ3BhdGhvLXNhbS12aXQtYicsXG4gICAgbGFiZWw6ICdwYXRoby1zYW0gVmlULUInLFxuICAgIGVuY29kZXJVcmw6ICdodHRwczovL2h1Z2dpbmdmYWNlLmNvL2pheC1pbWFnZS10b29scy9wYXRoby1zYW0tdml0LWItb25ueC9yZXNvbHZlL21haW4vZW5jb2Rlci5mcDE2Lm9ubngnLFxuICAgIGRlY29kZXJVcmw6ICdodHRwczovL2h1Z2dpbmdmYWNlLmNvL2pheC1pbWFnZS10b29scy9wYXRoby1zYW0tdml0LWItb25ueC9yZXNvbHZlL21haW4vZGVjb2Rlci5vbm54JyxcbiAgICB2YXJpYW50OiAnc2FtMScsXG4gICAgaW5wdXRTaXplOiAxMDI0LFxuICAgIG1pY3Jvc2NvcHk6IHRydWUsXG4gIH0sXG4gIHtcbiAgICBpZDogJ3BhdGhvLXNhbS12aXQtYi1pbnQ4JyxcbiAgICBsYWJlbDogJ3BhdGhvLXNhbSBWaVQtQiAoaW50OCknLFxuICAgIGVuY29kZXJVcmw6ICdodHRwczovL2h1Z2dpbmdmYWNlLmNvL2pheC1pbWFnZS10b29scy9wYXRoby1zYW0tdml0LWItb25ueC9yZXNvbHZlL21haW4vZW5jb2Rlci5pbnQ4Lm9ubngnLFxuICAgIGRlY29kZXJVcmw6ICdodHRwczovL2h1Z2dpbmdmYWNlLmNvL2pheC1pbWFnZS10b29scy9wYXRoby1zYW0tdml0LWItb25ueC9yZXNvbHZlL21haW4vZGVjb2Rlci5vbm54JyxcbiAgICB2YXJpYW50OiAnc2FtMScsXG4gICAgaW5wdXRTaXplOiAxMDI0LFxuICAgIG1pY3Jvc2NvcHk6IHRydWUsXG4gICAgLy8gaW50OCBkeW5hbWljLXF1YW50aXplZCBlbmNvZGVyICh+MTAwIE1CIHZzIH4xODAgTUIgZnAxNiwgSW9VIH4wLjk5IG9uIHRoZVxuICAgIC8vIHNhbml0eSB0ZXN0KS4gb25ueHJ1bnRpbWUtd2ViJ3MgV2ViR1BVIEVQIGRvZXNuJ3Qgc3VwcG9ydCBpbnQ4IG1hdG11bCwgc29cbiAgICAvLyBpdCBydW5zIG9uIFdBU00g4oCUIHNtYWxsZXIgZG93bmxvYWQsIHNsb3dlciBlbmNvZGUgdGhhbiB0aGUgZnAxNiBlbnRyeS5cbiAgICBlbmNvZGVyUHJvdmlkZXJzOiBbJ3dhc20nXSxcbiAgfSxcbl07XG5cbi8qKiBJbml0aWFsIGRlZmF1bHQgbW9kZWwgaWQgKG92ZXJyaWRkZW4gYXQgcnVudGltZSBvbmNlIHRoZSBob3N0IGNvbmZpZ3VyZXMgYVxuICogIGhvc3RlZCBtb2RlbCB2aWEge0BsaW5rIHNldFNhbU1vZGVsVXJsc30pLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfU0FNX01PREVMX0lEID0gU0FNX01PREVMU1swXS5pZDtcblxuLyoqIFRoZSBhY3RpdmUgZGVmYXVsdCDigJQgdXBkYXRlZCB3aGVuIHRoZSBob3N0IGNvbmZpZ3VyZXMgYSBtb2RlbCdzIE9OTlggVVJMcyxcbiAqICBzbyB0aGUgdG9vbCB1c2VzIHRoZSBtb2RlbCB0aGF0J3MgYWN0dWFsbHkgaG9zdGVkIChub3QganVzdCB0aGUgZmlyc3QgZW50cnkpLiAqL1xubGV0IGFjdGl2ZURlZmF1bHRJZCA9IERFRkFVTFRfU0FNX01PREVMX0lEO1xuXG4vKiogTG9vayB1cCBhIG1vZGVsIGJ5IGlkOyBmYWxscyBiYWNrIHRvIHRoZSBhY3RpdmUgZGVmYXVsdCB3aGVuIGlkIGlzXG4gKiAgdW5rbm93bi9hYnNlbnQuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2FtTW9kZWwoaWQ/OiBzdHJpbmcpOiBTYW1Nb2RlbERlZiB7XG4gIGNvbnN0IHdhbnRlZCA9IGlkID8/IGFjdGl2ZURlZmF1bHRJZDtcbiAgcmV0dXJuIFNBTV9NT0RFTFMuZmluZCgobSkgPT4gbS5pZCA9PT0gd2FudGVkKSA/PyBTQU1fTU9ERUxTWzBdO1xufVxuXG4vKiogVGhlIGFjdGl2ZSBkZWZhdWx0IG1vZGVsIGlkICh3aGF0IHRoZSB0b29scy9waWNrZXIgdXNlIHdoZW4gdW5zZXQpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRTYW1Nb2RlbElkKCk6IHN0cmluZyB7XG4gIHJldHVybiBhY3RpdmVEZWZhdWx0SWQ7XG59XG5cbi8qKiBTZXQgdGhlIGFjdGl2ZSBkZWZhdWx0IG1vZGVsIGlkIChtdXN0IGJlIGEgcmVnaXN0ZXJlZCBtb2RlbCkuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RGVmYXVsdFNhbU1vZGVsKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKFNBTV9NT0RFTFMuc29tZSgobSkgPT4gbS5pZCA9PT0gaWQpKSBhY3RpdmVEZWZhdWx0SWQgPSBpZDtcbn1cblxuLyoqIFRydWUgd2hlbiBhIG1vZGVsIGhhcyBib3RoIE9OTlggVVJMcyBjb25maWd1cmVkIChpLmUuIGl0IGNhbiBhY3R1YWxseSBydW4pLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2FtTW9kZWxSZWFkeShtb2RlbDogU2FtTW9kZWxEZWYpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhbW9kZWwuZW5jb2RlclVybCAmJiAhIW1vZGVsLmRlY29kZXJVcmw7XG59XG5cbi8qKlxuICogUG9pbnQgYSByZWdpc3RlcmVkIG1vZGVsIGF0IGl0cyBob3N0ZWQgT05OWCBwYWlyIChIRiAvIEdDUykuIENhbGxlZCBieSB0aGVcbiAqIGhvc3QncyBjb21wb3NpdGlvbiByb290IG9uY2UgaG9zdGluZyBpcyBkZWNpZGVkLCBrZWVwaW5nIGRlcGxveW1lbnQgVVJMcyBvdXRcbiAqIG9mIHRoZSBsaWJyYXJ5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0U2FtTW9kZWxVcmxzKGlkOiBzdHJpbmcsIGVuY29kZXJVcmw6IHN0cmluZywgZGVjb2RlclVybDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IG0gPSBTQU1fTU9ERUxTLmZpbmQoKHgpID0+IHguaWQgPT09IGlkKTtcbiAgaWYgKG0pIHtcbiAgICBtLmVuY29kZXJVcmwgPSBlbmNvZGVyVXJsO1xuICAgIG0uZGVjb2RlclVybCA9IGRlY29kZXJVcmw7XG4gICAgLy8gVGhlIGNvbmZpZ3VyZWQgKGhvc3RlZCkgbW9kZWwgYmVjb21lcyB0aGUgYWN0aXZlIGRlZmF1bHQsIHNvIHRoZSB0b29sc1xuICAgIC8vIHVzZSBpdCByYXRoZXIgdGhhbiB0aGUgZmlyc3QgcmVnaXN0cnkgZW50cnkgKHdoaWNoIG1heSBiZSB1bmhvc3RlZCkuXG4gICAgaWYgKGVuY29kZXJVcmwgJiYgZGVjb2RlclVybCkgYWN0aXZlRGVmYXVsdElkID0gaWQ7XG4gIH1cbn1cbiJdfQ==
|
|
116
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FtLW1vZGVsLXJlZ2lzdHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90b29sYmFyL3NlZ21lbnRhdGlvbi9zYW0tbW9kZWwtcmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFrQjtJQUN2QztRQUNFLEVBQUUsRUFBRSxtQkFBbUI7UUFDdkIsS0FBSyxFQUFFLGlCQUFpQjtRQUN4QixVQUFVLEVBQUUsOEZBQThGO1FBQzFHLFVBQVUsRUFBRSx5RkFBeUY7UUFDckcsT0FBTyxFQUFFLE1BQU07UUFDZixTQUFTLEVBQUUsSUFBSTtRQUNmLFVBQVUsRUFBRSxJQUFJO1FBQ2hCLDBFQUEwRTtRQUMxRSx3RUFBd0U7UUFDeEUsaUVBQWlFO1FBQ2pFLGdCQUFnQixFQUFFLENBQUMsTUFBTSxDQUFDO1FBQzFCLHFFQUFxRTtRQUNyRSwyRUFBMkU7UUFDM0UseUNBQXlDO1FBQ3pDLFNBQVMsRUFBRSxJQUFJO0tBQ2hCO0lBQ0Q7UUFDRSxFQUFFLEVBQUUsbUJBQW1CO1FBQ3ZCLEtBQUssRUFBRSxpQkFBaUI7UUFDeEIsVUFBVSxFQUFFLDhGQUE4RjtRQUMxRyxVQUFVLEVBQUUseUZBQXlGO1FBQ3JHLE9BQU8sRUFBRSxNQUFNO1FBQ2YsU0FBUyxFQUFFLElBQUk7UUFDZixVQUFVLEVBQUUsSUFBSTtLQUNqQjtJQUNEO1FBQ0UsRUFBRSxFQUFFLGlCQUFpQjtRQUNyQixLQUFLLEVBQUUsaUJBQWlCO1FBQ3hCLFVBQVUsRUFBRSw0RkFBNEY7UUFDeEcsVUFBVSxFQUFFLHVGQUF1RjtRQUNuRyxPQUFPLEVBQUUsTUFBTTtRQUNmLFNBQVMsRUFBRSxJQUFJO1FBQ2YsVUFBVSxFQUFFLElBQUk7S0FDakI7SUFDRDtRQUNFLEVBQUUsRUFBRSxzQkFBc0I7UUFDMUIsS0FBSyxFQUFFLHdCQUF3QjtRQUMvQixVQUFVLEVBQUUsNEZBQTRGO1FBQ3hHLFVBQVUsRUFBRSx1RkFBdUY7UUFDbkcsT0FBTyxFQUFFLE1BQU07UUFDZixTQUFTLEVBQUUsSUFBSTtRQUNmLFVBQVUsRUFBRSxJQUFJO1FBQ2hCLDRFQUE0RTtRQUM1RSw0RUFBNEU7UUFDNUUseUVBQXlFO1FBQ3pFLGdCQUFnQixFQUFFLENBQUMsTUFBTSxDQUFDO0tBQzNCO0NBQ0YsQ0FBQztBQUVGO2lEQUNpRDtBQUNqRCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBRXJEO29GQUNvRjtBQUNwRixJQUFJLGVBQWUsR0FBRyxvQkFBb0IsQ0FBQztBQUUzQztzQkFDc0I7QUFDdEIsTUFBTSxVQUFVLFdBQVcsQ0FBQyxFQUFXO0lBQ3JDLE1BQU0sTUFBTSxHQUFHLEVBQUUsSUFBSSxlQUFlLENBQUM7SUFDckMsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLE1BQU0sQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRSxDQUFDO0FBRUQsMEVBQTBFO0FBQzFFLE1BQU0sVUFBVSxvQkFBb0I7SUFDbEMsT0FBTyxlQUFlLENBQUM7QUFDekIsQ0FBQztBQUVELG9FQUFvRTtBQUNwRSxNQUFNLFVBQVUsa0JBQWtCLENBQUMsRUFBVTtJQUMzQyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQUUsZUFBZSxHQUFHLEVBQUUsQ0FBQztBQUNoRSxDQUFDO0FBRUQsa0ZBQWtGO0FBQ2xGLE1BQU0sVUFBVSxlQUFlLENBQUMsS0FBa0I7SUFDaEQsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztBQUNsRCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLEVBQVUsRUFBRSxVQUFrQixFQUFFLFVBQWtCLEVBQUUsUUFBaUI7SUFDbkcsTUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUM5QyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ04sQ0FBQyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDMUIsQ0FBQyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDMUIsSUFBSSxRQUFRLEtBQUssU0FBUztZQUFFLENBQUMsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ2xELHlFQUF5RTtRQUN6RSx1RUFBdUU7UUFDdkUsSUFBSSxVQUFVLElBQUksVUFBVTtZQUFFLGVBQWUsR0FBRyxFQUFFLENBQUM7SUFDckQsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTYW1Nb2RlbERlZiB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zYW0uY29udHJhY3QnO1xuXG4vKipcbiAqIFJlZ2lzdHJ5IG9mIHByb21wdGFibGUgU0FNIG1vZGVscyBmb3IgdGhlIGJyb3dzZXIgc2VnbWVudCB0b29sLlxuICpcbiAqIG1pY3JvLXNhbSAobWljcm9zY29weS1maW5ldHVuZWQsIHByb21wdGFibGUpIGFuZCBwYXRoby1zYW0gKGhpc3RvcGF0aG9sb2d5LVxuICogZmluZXR1bmVkKSBhcmUgZW50cmllczsgU0FNMyBzbG90cyBpbiBoZXJlIG9uY2UgaXRzIHF1YW50aXplZCBPTk5YIGV4cG9ydCBhbmRcbiAqIGEgYHZhcmlhbnQ6ICdzYW0zJ2AgZGVjb2RlciBwYXRoIGFyZSBwdWJsaXNoZWQuIFRoZVxuICogYXV0b21hdGljIGNlbGxwb3NlLVNBTSBtb2RlbCBpcyBpbnRlbnRpb25hbGx5IE5PVCBoZXJlIOKAlCBpdCdzIG5vdCBwcm9tcHRhYmxlXG4gKiBhbmQgbGl2ZXMgaW4gdGhlIHByb2Nlc3NpbmctcGlwZWxpbmUncyBjZWxscG9zZSBlbmdpbmUgYXMgdGhlIGF1dG9tYXRpYyB0b29sLlxuICpcbiAqIGBlbmNvZGVyVXJsYCAvIGBkZWNvZGVyVXJsYCBwb2ludCBhdCB0aGUgcHVibGljIEhGLWhvc3RlZCBPTk5YIHBhaXJzIGJ5XG4gKiBkZWZhdWx0LCBzbyB0aGUgc2VnbWVudCB0b29scyB3b3JrIG91dCBvZiB0aGUgYm94IGluIGFueSBob3N0IChtaXJyb3JpbmcgdGhlXG4gKiBjZWxscG9zZSBkZWZhdWx0KS4gQSBob3N0IGNhbiByZXBvaW50IHRoZW0gYXQgaXRzIG93biBob3N0aW5nIChlLmcuIGEgR0NTXG4gKiBidWNrZXQpIGF0IHJ1bnRpbWUgdmlhIHtAbGluayBzZXRTYW1Nb2RlbFVybHN9OyBhbiBlbXB0eSBVUkwgZGlzYWJsZXMgYSBtb2RlbFxuICogKHRoZSBzZXNzaW9uIHRocm93cyBhIGNsZWFyIFwibm90IGNvbmZpZ3VyZWRcIiBlcnJvcikuIEV4cG9ydC9xdWFudGl6YXRpb25cbiAqIHRvb2xpbmc6IHRoZSBzaWJsaW5nIGBicm93c2VyLW9ubngtdG9vbHNgIHByb2plY3Q7IHNlZVxuICogZG9jcy9kZXNpZ24vc2FtLXNlZ21lbnRhdGlvbi1kZXNpZ24ubWQuXG4gKlxuICogRG93bmxvYWRzIGFyZSBjYWNoZWQgaW4gdGhlIGJyb3dzZXIgYnkgVVJMIGFuZCBgcmV2aXNpb25gOiB3aGVuIGEgbW9kZWwncyBmaWxlcyBhcmVcbiAqIHJlLWV4cG9ydGVkIHVuZGVyIHRoZSBzYW1lIFVSTHMsIHNldCAob3IgYnVtcCkgaXRzIGByZXZpc2lvbmAgc28gYnJvd3NlcnMgZmV0Y2ggdGhlXG4gKiBuZXcgZmlsZXMgaW5zdGVhZCBvZiBzZXJ2aW5nIHRoZSBvbGQgb25lcyBmcm9tIGNhY2hlLlxuICovXG5leHBvcnQgY29uc3QgU0FNX01PREVMUzogU2FtTW9kZWxEZWZbXSA9IFtcbiAge1xuICAgIGlkOiAnbWljcm9zYW0tdml0LXQtbG0nLFxuICAgIGxhYmVsOiAnbWljcm8tc2FtIFZpVC1UJyxcbiAgICBlbmNvZGVyVXJsOiAnaHR0cHM6Ly9odWdnaW5nZmFjZS5jby9qYXgtaW1hZ2UtdG9vbHMvbWljcm9zYW0tdml0LXQtbG0tb25ueC9yZXNvbHZlL21haW4vZW5jb2Rlci5mcDE2Lm9ubngnLFxuICAgIGRlY29kZXJVcmw6ICdodHRwczovL2h1Z2dpbmdmYWNlLmNvL2pheC1pbWFnZS10b29scy9taWNyb3NhbS12aXQtdC1sbS1vbm54L3Jlc29sdmUvbWFpbi9kZWNvZGVyLm9ubngnLFxuICAgIHZhcmlhbnQ6ICdzYW0xJyxcbiAgICBpbnB1dFNpemU6IDEwMjQsXG4gICAgbWljcm9zY29weTogdHJ1ZSxcbiAgICAvLyBUaW55VmlUJ3MgZnAxNiBhdHRlbnRpb24gb3ZlcmZsb3dzIG9uIHRoZSBvbm54cnVudGltZS13ZWIgV2ViR1BVIEVQIGFuZFxuICAgIC8vIHJldHVybnMgYW4gZW1wdHkgbWFzayAoXCJObyBtYXNrcyBmb3VuZFwiKTsgaXQncyBudW1lcmljYWxseSBjb3JyZWN0IG9uXG4gICAgLy8gV0FTTSwgYW5kIHRoZSBlbmNvZGVyIGlzIHRpbnkgKH4xNCBNQikgc28gV0FTTSBpcyBwbGVudHkgZmFzdC5cbiAgICBlbmNvZGVyUHJvdmlkZXJzOiBbJ3dhc20nXSxcbiAgICAvLyBTbWFsbCBlbm91Z2ggdG8gcnVuIGluLXByb2Nlc3Mgb24gdGhlIG1haW4gdGhyZWFkIOKAlCBhdm9pZHMgdGhlIFdlYlxuICAgIC8vIFdvcmtlcidzIHNwYXduIC8gc2Vjb25kLU9SVC1ydW50aW1lIC8gcm91bmQtdHJpcCBvdmVyaGVhZCwgd2hpY2ggbWFkZSBpdFxuICAgIC8vIG5vdGljZWFibHkgc2xvd2VyIHRvIGxvYWQgYW5kIHNlZ21lbnQuXG4gICAgaW5Qcm9jZXNzOiB0cnVlLFxuICB9LFxuICB7XG4gICAgaWQ6ICdtaWNyb3NhbS12aXQtYi1sbScsXG4gICAgbGFiZWw6ICdtaWNyby1zYW0gVmlULUInLFxuICAgIGVuY29kZXJVcmw6ICdodHRwczovL2h1Z2dpbmdmYWNlLmNvL2pheC1pbWFnZS10b29scy9taWNyb3NhbS12aXQtYi1sbS1vbm54L3Jlc29sdmUvbWFpbi9lbmNvZGVyLmZwMTYub25ueCcsXG4gICAgZGVjb2RlclVybDogJ2h0dHBzOi8vaHVnZ2luZ2ZhY2UuY28vamF4LWltYWdlLXRvb2xzL21pY3Jvc2FtLXZpdC1iLWxtLW9ubngvcmVzb2x2ZS9tYWluL2RlY29kZXIub25ueCcsXG4gICAgdmFyaWFudDogJ3NhbTEnLFxuICAgIGlucHV0U2l6ZTogMTAyNCxcbiAgICBtaWNyb3Njb3B5OiB0cnVlLFxuICB9LFxuICB7XG4gICAgaWQ6ICdwYXRoby1zYW0tdml0LWInLFxuICAgIGxhYmVsOiAncGF0aG8tc2FtIFZpVC1CJyxcbiAgICBlbmNvZGVyVXJsOiAnaHR0cHM6Ly9odWdnaW5nZmFjZS5jby9qYXgtaW1hZ2UtdG9vbHMvcGF0aG8tc2FtLXZpdC1iLW9ubngvcmVzb2x2ZS9tYWluL2VuY29kZXIuZnAxNi5vbm54JyxcbiAgICBkZWNvZGVyVXJsOiAnaHR0cHM6Ly9odWdnaW5nZmFjZS5jby9qYXgtaW1hZ2UtdG9vbHMvcGF0aG8tc2FtLXZpdC1iLW9ubngvcmVzb2x2ZS9tYWluL2RlY29kZXIub25ueCcsXG4gICAgdmFyaWFudDogJ3NhbTEnLFxuICAgIGlucHV0U2l6ZTogMTAyNCxcbiAgICBtaWNyb3Njb3B5OiB0cnVlLFxuICB9LFxuICB7XG4gICAgaWQ6ICdwYXRoby1zYW0tdml0LWItaW50OCcsXG4gICAgbGFiZWw6ICdwYXRoby1zYW0gVmlULUIgKGludDgpJyxcbiAgICBlbmNvZGVyVXJsOiAnaHR0cHM6Ly9odWdnaW5nZmFjZS5jby9qYXgtaW1hZ2UtdG9vbHMvcGF0aG8tc2FtLXZpdC1iLW9ubngvcmVzb2x2ZS9tYWluL2VuY29kZXIuaW50OC5vbm54JyxcbiAgICBkZWNvZGVyVXJsOiAnaHR0cHM6Ly9odWdnaW5nZmFjZS5jby9qYXgtaW1hZ2UtdG9vbHMvcGF0aG8tc2FtLXZpdC1iLW9ubngvcmVzb2x2ZS9tYWluL2RlY29kZXIub25ueCcsXG4gICAgdmFyaWFudDogJ3NhbTEnLFxuICAgIGlucHV0U2l6ZTogMTAyNCxcbiAgICBtaWNyb3Njb3B5OiB0cnVlLFxuICAgIC8vIGludDggZHluYW1pYy1xdWFudGl6ZWQgZW5jb2RlciAofjEwMCBNQiB2cyB+MTgwIE1CIGZwMTYsIElvVSB+MC45OSBvbiB0aGVcbiAgICAvLyBzYW5pdHkgdGVzdCkuIG9ubnhydW50aW1lLXdlYidzIFdlYkdQVSBFUCBkb2Vzbid0IHN1cHBvcnQgaW50OCBtYXRtdWwsIHNvXG4gICAgLy8gaXQgcnVucyBvbiBXQVNNIOKAlCBzbWFsbGVyIGRvd25sb2FkLCBzbG93ZXIgZW5jb2RlIHRoYW4gdGhlIGZwMTYgZW50cnkuXG4gICAgZW5jb2RlclByb3ZpZGVyczogWyd3YXNtJ10sXG4gIH0sXG5dO1xuXG4vKiogSW5pdGlhbCBkZWZhdWx0IG1vZGVsIGlkIChvdmVycmlkZGVuIGF0IHJ1bnRpbWUgb25jZSB0aGUgaG9zdCBjb25maWd1cmVzIGFcbiAqICBob3N0ZWQgbW9kZWwgdmlhIHtAbGluayBzZXRTYW1Nb2RlbFVybHN9KS4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NBTV9NT0RFTF9JRCA9IFNBTV9NT0RFTFNbMF0uaWQ7XG5cbi8qKiBUaGUgYWN0aXZlIGRlZmF1bHQg4oCUIHVwZGF0ZWQgd2hlbiB0aGUgaG9zdCBjb25maWd1cmVzIGEgbW9kZWwncyBPTk5YIFVSTHMsXG4gKiAgc28gdGhlIHRvb2wgdXNlcyB0aGUgbW9kZWwgdGhhdCdzIGFjdHVhbGx5IGhvc3RlZCAobm90IGp1c3QgdGhlIGZpcnN0IGVudHJ5KS4gKi9cbmxldCBhY3RpdmVEZWZhdWx0SWQgPSBERUZBVUxUX1NBTV9NT0RFTF9JRDtcblxuLyoqIExvb2sgdXAgYSBtb2RlbCBieSBpZDsgZmFsbHMgYmFjayB0byB0aGUgYWN0aXZlIGRlZmF1bHQgd2hlbiBpZCBpc1xuICogIHVua25vd24vYWJzZW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNhbU1vZGVsKGlkPzogc3RyaW5nKTogU2FtTW9kZWxEZWYge1xuICBjb25zdCB3YW50ZWQgPSBpZCA/PyBhY3RpdmVEZWZhdWx0SWQ7XG4gIHJldHVybiBTQU1fTU9ERUxTLmZpbmQoKG0pID0+IG0uaWQgPT09IHdhbnRlZCkgPz8gU0FNX01PREVMU1swXTtcbn1cblxuLyoqIFRoZSBhY3RpdmUgZGVmYXVsdCBtb2RlbCBpZCAod2hhdCB0aGUgdG9vbHMvcGlja2VyIHVzZSB3aGVuIHVuc2V0KS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0U2FtTW9kZWxJZCgpOiBzdHJpbmcge1xuICByZXR1cm4gYWN0aXZlRGVmYXVsdElkO1xufVxuXG4vKiogU2V0IHRoZSBhY3RpdmUgZGVmYXVsdCBtb2RlbCBpZCAobXVzdCBiZSBhIHJlZ2lzdGVyZWQgbW9kZWwpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldERlZmF1bHRTYW1Nb2RlbChpZDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChTQU1fTU9ERUxTLnNvbWUoKG0pID0+IG0uaWQgPT09IGlkKSkgYWN0aXZlRGVmYXVsdElkID0gaWQ7XG59XG5cbi8qKiBUcnVlIHdoZW4gYSBtb2RlbCBoYXMgYm90aCBPTk5YIFVSTHMgY29uZmlndXJlZCAoaS5lLiBpdCBjYW4gYWN0dWFsbHkgcnVuKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NhbU1vZGVsUmVhZHkobW9kZWw6IFNhbU1vZGVsRGVmKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIW1vZGVsLmVuY29kZXJVcmwgJiYgISFtb2RlbC5kZWNvZGVyVXJsO1xufVxuXG4vKipcbiAqIFBvaW50IGEgcmVnaXN0ZXJlZCBtb2RlbCBhdCBpdHMgaG9zdGVkIE9OTlggcGFpciAoSEYgLyBHQ1MpLiBDYWxsZWQgYnkgdGhlXG4gKiBob3N0J3MgY29tcG9zaXRpb24gcm9vdCBvbmNlIGhvc3RpbmcgaXMgZGVjaWRlZCwga2VlcGluZyBkZXBsb3ltZW50IFVSTHMgb3V0XG4gKiBvZiB0aGUgbGlicmFyeS4gUGFzcyBgcmV2aXNpb25gIHdoZW4gdGhlIGZpbGVzIGF0IHRob3NlIFVSTHMgY2FuIGJlIHJlcGxhY2VkIGluXG4gKiBwbGFjZSwgYW5kIGNoYW5nZSBpdCB3aGVuZXZlciB0aGV5IGFyZSAoc2VlIHtAbGluayBTYW1Nb2RlbERlZi5yZXZpc2lvbn0pLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0U2FtTW9kZWxVcmxzKGlkOiBzdHJpbmcsIGVuY29kZXJVcmw6IHN0cmluZywgZGVjb2RlclVybDogc3RyaW5nLCByZXZpc2lvbj86IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBtID0gU0FNX01PREVMUy5maW5kKCh4KSA9PiB4LmlkID09PSBpZCk7XG4gIGlmIChtKSB7XG4gICAgbS5lbmNvZGVyVXJsID0gZW5jb2RlclVybDtcbiAgICBtLmRlY29kZXJVcmwgPSBkZWNvZGVyVXJsO1xuICAgIGlmIChyZXZpc2lvbiAhPT0gdW5kZWZpbmVkKSBtLnJldmlzaW9uID0gcmV2aXNpb247XG4gICAgLy8gVGhlIGNvbmZpZ3VyZWQgKGhvc3RlZCkgbW9kZWwgYmVjb21lcyB0aGUgYWN0aXZlIGRlZmF1bHQsIHNvIHRoZSB0b29sc1xuICAgIC8vIHVzZSBpdCByYXRoZXIgdGhhbiB0aGUgZmlyc3QgcmVnaXN0cnkgZW50cnkgKHdoaWNoIG1heSBiZSB1bmhvc3RlZCkuXG4gICAgaWYgKGVuY29kZXJVcmwgJiYgZGVjb2RlclVybCkgYWN0aXZlRGVmYXVsdElkID0gaWQ7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -3,18 +3,71 @@ import * as ort from 'onnxruntime-web';
|
|
|
3
3
|
* Shared, DOM-free SAM inference primitives used by BOTH inference backends:
|
|
4
4
|
* the in-process session (`OnnxSamSession`, main thread) and the dedicated
|
|
5
5
|
* Web Worker (`onnx-sam.worker`). Keeping these here avoids duplicating the
|
|
6
|
-
* preprocessing / decoder-prompt math
|
|
7
|
-
*
|
|
6
|
+
* preprocessing / decoder-prompt math; nothing here may import Angular or the
|
|
7
|
+
* DOM, since the worker bundles it.
|
|
8
8
|
*/
|
|
9
|
+
/** SAM's per-channel (RGB) pixel mean, subtracted before the encoder. */
|
|
9
10
|
export const PIXEL_MEAN = [123.675, 116.28, 103.53];
|
|
11
|
+
/** SAM's per-channel (RGB) pixel standard deviation, divided out before the encoder. */
|
|
10
12
|
export const PIXEL_STD = [58.395, 57.12, 57.375];
|
|
11
|
-
|
|
13
|
+
/** Cache API store for downloaded model files. Bump the version only when the cache
|
|
14
|
+
* LAYOUT changes — opening the cache deletes every older `sam-onnx*` store. A model
|
|
15
|
+
* re-exported under the same URLs bumps its own `SamModelDef.revision` instead,
|
|
16
|
+
* which re-downloads that model alone (see {@link modelCacheKey}). */
|
|
17
|
+
const MODEL_CACHE_PREFIX = 'sam-onnx';
|
|
18
|
+
const MODEL_CACHE = `${MODEL_CACHE_PREFIX}-v2`;
|
|
19
|
+
let staleCachesPurged = null;
|
|
20
|
+
/** Delete model caches from earlier versions (once per page/worker). */
|
|
21
|
+
function purgeStaleModelCaches() {
|
|
22
|
+
staleCachesPurged ??= caches
|
|
23
|
+
.keys()
|
|
24
|
+
.then((names) => Promise.all(names.filter((n) => n.startsWith(MODEL_CACHE_PREFIX) && n !== MODEL_CACHE).map((n) => caches.delete(n))))
|
|
25
|
+
.then(() => undefined)
|
|
26
|
+
.catch(() => undefined); // best effort: a stale cache only wastes space
|
|
27
|
+
return staleCachesPurged;
|
|
28
|
+
}
|
|
29
|
+
/** Open the current model cache, or null where the Cache API is unavailable. */
|
|
30
|
+
async function openModelCache() {
|
|
31
|
+
if (typeof caches === 'undefined')
|
|
32
|
+
return null;
|
|
33
|
+
await purgeStaleModelCaches();
|
|
34
|
+
return caches.open(MODEL_CACHE).catch(() => null);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Delete every downloaded SAM model (several hundred MB per origin). Resolves
|
|
38
|
+
* to true when something was removed; false where the Cache API is unavailable.
|
|
39
|
+
*/
|
|
40
|
+
export async function clearSamModelCache() {
|
|
41
|
+
if (typeof caches === 'undefined')
|
|
42
|
+
return false;
|
|
43
|
+
const names = (await caches.keys()).filter((n) => n.startsWith(MODEL_CACHE_PREFIX));
|
|
44
|
+
const removed = await Promise.all(names.map((n) => caches.delete(n)));
|
|
45
|
+
return removed.some(Boolean);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* The Cache API key a model file is stored under: its URL, plus the model's
|
|
49
|
+
* `SamModelDef.revision` as a query parameter when it has one, so a bumped revision
|
|
50
|
+
* misses the cache and downloads the re-exported file.
|
|
51
|
+
*/
|
|
52
|
+
export function modelCacheKey(url, revision) {
|
|
53
|
+
if (!revision)
|
|
54
|
+
return url;
|
|
55
|
+
return `${url}${url.includes('?') ? '&' : '?'}siv-model-rev=${encodeURIComponent(revision)}`;
|
|
56
|
+
}
|
|
57
|
+
/** Store a downloaded file under `key`, first dropping every other copy of the same file
|
|
58
|
+
* (other revisions, or the same path under another query): a model is several hundred
|
|
59
|
+
* MB, and a superseded copy would otherwise stay on disk for good. */
|
|
60
|
+
async function cacheModel(cache, url, key, body) {
|
|
61
|
+
await cache.delete(url, { ignoreSearch: true }).catch(() => undefined);
|
|
62
|
+
await cache.put(key, body).catch(() => undefined);
|
|
63
|
+
}
|
|
12
64
|
/** Fetch a model as an ArrayBuffer, streaming progress and caching in the Cache
|
|
13
|
-
* API (so it isn't re-downloaded). Cache hit → progress
|
|
14
|
-
* the main thread and in a worker (both have `fetch` + `caches`). */
|
|
15
|
-
export async function fetchModel(url, onProgress) {
|
|
16
|
-
const
|
|
17
|
-
const
|
|
65
|
+
* API (so it isn't re-downloaded) under {@link modelCacheKey}. Cache hit → progress
|
|
66
|
+
* jumps to 1. Works on the main thread and in a worker (both have `fetch` + `caches`). */
|
|
67
|
+
export async function fetchModel(url, onProgress, revision) {
|
|
68
|
+
const key = modelCacheKey(url, revision);
|
|
69
|
+
const cache = await openModelCache();
|
|
70
|
+
const hit = cache ? await cache.match(key) : null;
|
|
18
71
|
if (hit) {
|
|
19
72
|
onProgress?.(1);
|
|
20
73
|
return await hit.arrayBuffer();
|
|
@@ -27,7 +80,7 @@ export async function fetchModel(url, onProgress) {
|
|
|
27
80
|
const buf = await resp.arrayBuffer();
|
|
28
81
|
onProgress?.(1);
|
|
29
82
|
if (cache)
|
|
30
|
-
await cache
|
|
83
|
+
await cacheModel(cache, url, key, new Response(buf));
|
|
31
84
|
return buf;
|
|
32
85
|
}
|
|
33
86
|
const reader = resp.body.getReader();
|
|
@@ -48,8 +101,8 @@ export async function fetchModel(url, onProgress) {
|
|
|
48
101
|
off += c.length;
|
|
49
102
|
}
|
|
50
103
|
if (cache) {
|
|
51
|
-
|
|
52
|
-
|
|
104
|
+
// The Response copies its body, so no extra full-size copy of the model here.
|
|
105
|
+
await cacheModel(cache, url, key, new Response(out, { headers: { 'content-length': String(received) } }));
|
|
53
106
|
}
|
|
54
107
|
onProgress?.(1);
|
|
55
108
|
return out.buffer;
|
|
@@ -134,8 +187,11 @@ export async function runEncoder(encoder, data, width, height, inputSize) {
|
|
|
134
187
|
});
|
|
135
188
|
const emb = out[encoder.outputNames[0]];
|
|
136
189
|
return {
|
|
137
|
-
data: emb.data,
|
|
138
|
-
|
|
190
|
+
data: emb.data,
|
|
191
|
+
dims: emb.dims,
|
|
192
|
+
scale,
|
|
193
|
+
imageWidth: width,
|
|
194
|
+
imageHeight: height,
|
|
139
195
|
};
|
|
140
196
|
}
|
|
141
197
|
/** Run the decoder for one prompt against a cached embedding → a binary mask. */
|
|
@@ -156,4 +212,4 @@ export async function runDecoder(decoder, e, prompt) {
|
|
|
156
212
|
const logits = masks.data.subarray(idx * h * w, (idx + 1) * h * w);
|
|
157
213
|
return { mask: binarizeMask(logits), width: w, height: h, iou: iou[idx] ?? 1 };
|
|
158
214
|
}
|
|
159
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FtLW9ubngtY29yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLW9ubngtY29yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssR0FBRyxNQUFNLGlCQUFpQixDQUFDO0FBSXZDOzs7Ozs7R0FNRztBQUVILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDcEQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNqRCxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUM7QUFtQi9COztzRUFFc0U7QUFDdEUsTUFBTSxDQUFDLEtBQUssVUFBVSxVQUFVLENBQUMsR0FBVyxFQUFFLFVBQWdDO0lBQzVFLE1BQU0sS0FBSyxHQUFHLE9BQU8sTUFBTSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3RHLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDbEQsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQUMsT0FBTyxNQUFNLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUFDLENBQUM7SUFFN0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxTQUFTLEdBQUcsaUJBQWlCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDekIsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEIsSUFBSSxLQUFLO1lBQUUsTUFBTSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxRSxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3JDLE1BQU0sTUFBTSxHQUFpQixFQUFFLENBQUM7SUFDaEMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ2pCLFNBQVMsQ0FBQztRQUNSLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDNUMsSUFBSSxJQUFJO1lBQUUsTUFBTTtRQUNoQixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25CLFFBQVEsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQ3pCLFVBQVUsRUFBRSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBQ0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQ1osS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFBQyxDQUFDO0lBQzdELElBQUksS0FBSyxFQUFFLENBQUM7UUFDVixNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQzthQUNqRyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUNELFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hCLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQztBQUNwQixDQUFDO0FBRUQsMEZBQTBGO0FBQzFGLE1BQU0sVUFBVSxVQUFVLENBQ3hCLElBQXVCLEVBQUUsS0FBYSxFQUFFLE1BQWMsRUFBRSxJQUFZLEVBQUUsS0FBYTtJQUVuRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQztJQUN2QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQztJQUN4QyxNQUFNLEdBQUcsR0FBRyxJQUFJLFlBQVksQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsY0FBYztJQUM3RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDOUIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztRQUMzQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzFCLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDbkIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN4QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDOUIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztZQUMxQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzFCLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDbkIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN2QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUM1QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDNUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FB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TSxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQy9GLENBQUMsQ0FBQztJQUNILE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFELE1BQU0sR0FBRyxHQUFJLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLElBQXFCLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckYsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBZ0IsQ0FBQztJQUMzQyxNQUFNLEdBQUcsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzQyxNQUFNLE1BQU0sR0FBSSxLQUFLLENBQUMsSUFBcUIsQ0FBQyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3JGLE9BQU8sRUFBRSxJQUFJLEVBQUUsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ2pGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBvcnQgZnJvbSAnb25ueHJ1bnRpbWUtd2ViJztcblxuaW1wb3J0IHR5cGUgeyBTYW1Qcm9tcHQgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvc2FtLmNvbnRyYWN0JztcblxuLyoqXG4gKiBTaGFyZWQsIERPTS1mcmVlIFNBTSBpbmZlcmVuY2UgcHJpbWl0aXZlcyB1c2VkIGJ5IEJPVEggaW5mZXJlbmNlIGJhY2tlbmRzOlxuICogdGhlIGluLXByb2Nlc3Mgc2Vzc2lvbiAoYE9ubnhTYW1TZXNzaW9uYCwgbWFpbiB0aHJlYWQpIGFuZCB0aGUgZGVkaWNhdGVkXG4gKiBXZWIgV29ya2VyIChgb25ueC1zYW0ud29ya2VyYCkuIEtlZXBpbmcgdGhlc2UgaGVyZSBhdm9pZHMgZHVwbGljYXRpbmcgdGhlXG4gKiBwcmVwcm9jZXNzaW5nIC8gZGVjb2Rlci1wcm9tcHQgbWF0aCBhbmQga2VlcHMgdGhlIHdvcmtlciBET00tZnJlZSAoaXQgY2FuJ3RcbiAqIGltcG9ydCBzYW0tcHJvbXB0LnRzLCB3aGljaCBwdWxscyBpbiBET00gdHlwZXMpLlxuICovXG5cbmV4cG9ydCBjb25zdCBQSVhFTF9NRUFOID0gWzEyMy42NzUsIDExNi4yOCwgMTAzLjUzXTtcbmV4cG9ydCBjb25zdCBQSVhFTF9TVEQgPSBbNTguMzk1LCA1Ny4xMiwgNTcuMzc1XTtcbmNvbnN0IE1PREVMX0NBQ0hFID0gJ3NhbS1vbm54JztcblxuLyoqIEVuY29kZXIgb3V0cHV0IGZvciBvbmUgaW1hZ2UsIHJldXNlZCBhY3Jvc3MgcHJvbXB0cy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29yZUVtYmVkZGluZyB7XG4gIGRhdGE6IEZsb2F0MzJBcnJheTtcbiAgZGltczogbnVtYmVyW107XG4gIHNjYWxlOiBudW1iZXI7XG4gIGltYWdlV2lkdGg6IG51bWJlcjtcbiAgaW1hZ2VIZWlnaHQ6IG51bWJlcjtcbn1cblxuLyoqIERlY29kZXIgb3V0cHV0OiBhIGJpbmFyeSBtYXNrIGF0IG9yaWdpbmFsLWltYWdlIHJlc29sdXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIENvcmVNYXNrIHtcbiAgbWFzazogVWludDhBcnJheTtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIGlvdTogbnVtYmVyO1xufVxuXG4vKiogRmV0Y2ggYSBtb2RlbCBhcyBhbiBBcnJheUJ1ZmZlciwgc3RyZWFtaW5nIHByb2dyZXNzIGFuZCBjYWNoaW5nIGluIHRoZSBDYWNoZVxuICogIEFQSSAoc28gaXQgaXNuJ3QgcmUtZG93bmxvYWRlZCkuIENhY2hlIGhpdCDihpIgcHJvZ3Jlc3MganVtcHMgdG8gMS4gV29ya3Mgb25cbiAqICB0aGUgbWFpbiB0aHJlYWQgYW5kIGluIGEgd29ya2VyIChib3RoIGhhdmUgYGZldGNoYCArIGBjYWNoZXNgKS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaE1vZGVsKHVybDogc3RyaW5nLCBvblByb2dyZXNzPzogKGY6IG51bWJlcikgPT4gdm9pZCk6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgY29uc3QgY2FjaGUgPSB0eXBlb2YgY2FjaGVzICE9PSAndW5kZWZpbmVkJyA/IGF3YWl0IGNhY2hlcy5vcGVuKE1PREVMX0NBQ0hFKS5jYXRjaCgoKSA9PiBudWxsKSA6IG51bGw7XG4gIGNvbnN0IGhpdCA9IGNhY2hlID8gYXdhaXQgY2FjaGUubWF0Y2godXJsKSA6IG51bGw7XG4gIGlmIChoaXQpIHsgb25Qcm9ncmVzcz8uKDEpOyByZXR1cm4gYXdhaXQgaGl0LmFycmF5QnVmZmVyKCk7IH1cblxuICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgaWYgKCFyZXNwLm9rKSB0aHJvdyBuZXcgRXJyb3IoYGZldGNoICR7dXJsfSBmYWlsZWQ6IEhUVFAgJHtyZXNwLnN0YXR1c31gKTtcbiAgY29uc3QgdG90YWwgPSBOdW1iZXIocmVzcC5oZWFkZXJzLmdldCgnY29udGVudC1sZW5ndGgnKSkgfHwgMDtcbiAgaWYgKCFyZXNwLmJvZHkgfHwgIXRvdGFsKSB7XG4gICAgY29uc3QgYnVmID0gYXdhaXQgcmVzcC5hcnJheUJ1ZmZlcigpO1xuICAgIG9uUHJvZ3Jlc3M/LigxKTtcbiAgICBpZiAoY2FjaGUpIGF3YWl0IGNhY2hlLnB1dCh1cmwsIG5ldyBSZXNwb25zZShidWYpKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIHJldHVybiBidWY7XG4gIH1cbiAgY29uc3QgcmVhZGVyID0gcmVzcC5ib2R5LmdldFJlYWRlcigpO1xuICBjb25zdCBjaHVua3M6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuICBsZXQgcmVjZWl2ZWQgPSAwO1xuICBmb3IgKDs7KSB7XG4gICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICBpZiAoZG9uZSkgYnJlYWs7XG4gICAgY2h1bmtzLnB1c2godmFsdWUpO1xuICAgIHJlY2VpdmVkICs9IHZhbHVlLmxlbmd0aDtcbiAgICBvblByb2dyZXNzPy4ocmVjZWl2ZWQgLyB0b3RhbCk7XG4gIH1cbiAgY29uc3Qgb3V0ID0gbmV3IFVpbnQ4QXJyYXkocmVjZWl2ZWQpO1xuICBsZXQgb2ZmID0gMDtcbiAgZm9yIChjb25zdCBjIG9mIGNodW5rcykgeyBvdXQuc2V0KGMsIG9mZik7IG9mZiArPSBjLmxlbmd0aDsgfVxuICBpZiAoY2FjaGUpIHtcbiAgICBhd2FpdCBjYWNoZS5wdXQodXJsLCBuZXcgUmVzcG9uc2Uob3V0LnNsaWNlKCksIHsgaGVhZGVyczogeyAnY29udGVudC1sZW5ndGgnOiBTdHJpbmcocmVjZWl2ZWQpIH0gfSkpXG4gICAgICAuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgfVxuICBvblByb2dyZXNzPy4oMSk7XG4gIHJldHVybiBvdXQuYnVmZmVyO1xufVxuXG4vKiogUmVzaXplIChsb25nIHNpZGUg4oaSIHNpemUsIGJpbGluZWFyKSwgcGFkIHRvIHNpemXDl3NpemUsIFNBTS1ub3JtYWxpemUg4oaSIENIVyBmbG9hdDMyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZXByb2Nlc3MoXG4gIGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgc2l6ZTogbnVtYmVyLCBzY2FsZTogbnVtYmVyLFxuKTogRmxvYXQzMkFycmF5IHtcbiAgY29uc3QgbmV3VyA9IE1hdGgucm91bmQod2lkdGggKiBzY2FsZSk7XG4gIGNvbnN0IG5ld0ggPSBNYXRoLnJvdW5kKGhlaWdodCAqIHNjYWxlKTtcbiAgY29uc3QgY2h3ID0gbmV3IEZsb2F0MzJBcnJheSgzICogc2l6ZSAqIHNpemUpOyAvLyB6ZXJvLXBhZGRlZFxuICBmb3IgKGxldCB5ID0gMDsgeSA8IG5ld0g7IHkrKykge1xuICAgIGNvbnN0IHN5ID0gTWF0aC5taW4oaGVpZ2h0IC0gMSwgeSAvIHNjYWxlKTtcbiAgICBjb25zdCB5MCA9IE1hdGguZmxvb3Ioc3kpO1xuICAgIGNvbnN0IGZ5ID0gc3kgLSB5MDtcbiAgICBjb25zdCB5MSA9IE1hdGgubWluKGhlaWdodCAtIDEsIHkwICsgMSk7XG4gICAgZm9yIChsZXQgeCA9IDA7IHggPCBuZXdXOyB4KyspIHtcbiAgICAgIGNvbnN0IHN4ID0gTWF0aC5taW4od2lkdGggLSAxLCB4IC8gc2NhbGUpO1xuICAgICAgY29uc3QgeDAgPSBNYXRoLmZsb29yKHN4KTtcbiAgICAgIGNvbnN0IGZ4ID0gc3ggLSB4MDtcbiAgICAgIGNvbnN0IHgxID0gTWF0aC5taW4od2lkdGggLSAxLCB4MCArIDEpO1xuICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCAzOyBjKyspIHtcbiAgICAgICAgY29uc3QgcDAwID0gZGF0YVsoeTAgKiB3aWR0aCArIHgwKSAqIDQgKyBjXTtcbiAgICAgICAgY29uc3QgcDAxID0gZGF0YVsoeTAgKiB3aWR0aCArIHgxKSAqIDQgKyBjXTtcbiAgICAgICAgY29uc3QgcDEwID0gZGF0YVsoeTEgKiB3aWR0aCArIHgwKSAqIDQgKyBjXTtcbiAgICAgICAgY29uc3QgcDExID0gZGF0YVsoeTEgKiB3aWR0aCArIHgxKSAqIDQgKyBjXTtcbiAgICAgICAgY29uc3QgdG9wID0gcDAwICsgKHAwMSAtIHAwMCkgKiBmeDtcbiAgICAgICAgY29uc3QgYm90ID0gcDEwICsgKHAxMSAtIHAxMCkgKiBmeDtcbiAgICAgICAgY29uc3QgdiA9IHRvcCArIChib3QgLSB0b3ApICogZnk7XG4gICAgICAgIGNod1tjICogc2l6ZSAqIHNpemUgKyB5ICogc2l6ZSArIHhdID0gKHYgLSBQSVhFTF9NRUFOW2NdKSAvIFBJWEVMX1NURFtjXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNodztcbn1cblxuLyoqIEFzc2VtYmxlIGRlY29kZXIgYHBvaW50X2Nvb3Jkc2AvYHBvaW50X2xhYmVsc2AgZnJvbSBhIHByb21wdCwgaW4gZW5jb2RlclxuICogIChyZXNpemVkKSBzcGFjZS4gQm94ID0gdHdvIHBvaW50cyBsYWJlbGxlZCAyLzM7IHBvaW50cyB1c2UgMS8wOyBhIHBvaW50cy1vbmx5XG4gKiAgcHJvbXB0IHBhZHMgdGhlIGFic2VudCBib3ggc2xvdCB3aXRoIGBbMCwwXWAgbGFiZWxsZWQgLTEuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGREZWNvZGVyUHJvbXB0KFxuICBwcm9tcHQ6IFNhbVByb21wdCwgc2NhbGU6IG51bWJlcixcbik6IHsgcG9pbnRDb29yZHM6IEZsb2F0MzJBcnJheTsgcG9pbnRMYWJlbHM6IEZsb2F0MzJBcnJheTsgbnVtUG9pbnRzOiBudW1iZXIgfSB7XG4gIGNvbnN0IGNvb3JkczogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgbGFiZWxzOiBudW1iZXJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHAgb2YgcHJvbXB0LnBvaW50cyA/PyBbXSkgeyBjb29yZHMucHVzaChwLnggKiBzY2FsZSwgcC55ICogc2NhbGUpOyBsYWJlbHMucHVzaChwLmxhYmVsKTsgfVxuICBpZiAocHJvbXB0LmJveCkge1xuICAgIGNvbnN0IGIgPSBwcm9tcHQuYm94O1xuICAgIGNvb3Jkcy5wdXNoKGIueDAgKiBzY2FsZSwgYi55MCAqIHNjYWxlKTsgbGFiZWxzLnB1c2goMik7XG4gICAgY29vcmRzLnB1c2goYi54MSAqIHNjYWxlLCBiLnkxICogc2NhbGUpOyBsYWJlbHMucHVzaCgzKTtcbiAgfSBlbHNlIGlmIChsYWJlbHMubGVuZ3RoID4gMCkge1xuICAgIGNvb3Jkcy5wdXNoKDAsIDApOyBsYWJlbHMucHVzaCgtMSk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBwb2ludENvb3JkczogRmxvYXQzMkFycmF5LmZyb20oY29vcmRzKSxcbiAgICBwb2ludExhYmVsczogRmxvYXQzMkFycmF5LmZyb20obGFiZWxzKSxcbiAgICBudW1Qb2ludHM6IGxhYmVscy5sZW5ndGgsXG4gIH07XG59XG5cbi8qKiBCaW5hcml6ZSBtYXNrIGxvZ2l0cyAoYD4gdGhyZXNob2xkYCkgaW50byBhIDAvMSBtYXNrLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmFyaXplTWFzayhsb2dpdHM6IEZsb2F0MzJBcnJheSwgdGhyZXNob2xkID0gMCk6IFVpbnQ4QXJyYXkge1xuICBjb25zdCBvdXQgPSBuZXcgVWludDhBcnJheShsb2dpdHMubGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2dpdHMubGVuZ3RoOyBpKyspIG91dFtpXSA9IGxvZ2l0c1tpXSA+IHRocmVzaG9sZCA/IDEgOiAwO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKiogSW5kZXggb2YgdGhlIGhpZ2hlc3Qtc2NvcmluZyBtYXNrIGluIGEgbXVsdGltYXNrIGRlY29kZXIgb3V0cHV0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJlc3RNYXNrSW5kZXgoaW91OiBGbG9hdDMyQXJyYXkgfCBudW1iZXJbXSk6IG51bWJlciB7XG4gIGxldCBiZXN0ID0gMDtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBpb3UubGVuZ3RoOyBpKyspIGlmIChpb3VbaV0gPiBpb3VbYmVzdF0pIGJlc3QgPSBpO1xuICByZXR1cm4gYmVzdDtcbn1cblxuLyoqIFJ1biB0aGUgZW5jb2RlciBvbiBhbiBSR0JBIGltYWdlIOKGkiBhIHJldXNhYmxlIGVtYmVkZGluZy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5FbmNvZGVyKFxuICBlbmNvZGVyOiBvcnQuSW5mZXJlbmNlU2Vzc2lvbiwgZGF0YTogVWludDhDbGFtcGVkQXJyYXksIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBpbnB1dFNpemU6IG51bWJlcixcbik6IFByb21pc2U8Q29yZUVtYmVkZGluZz4ge1xuICBjb25zdCBzY2FsZSA9IGlucHV0U2l6ZSAvIE1hdGgubWF4KHdpZHRoLCBoZWlnaHQpO1xuICBjb25zdCBpbnB1dCA9IHByZXByb2Nlc3MoZGF0YSwgd2lkdGgsIGhlaWdodCwgaW5wdXRTaXplLCBzY2FsZSk7XG4gIGNvbnN0IG91dCA9IGF3YWl0IGVuY29kZXIucnVuKHtcbiAgICBbZW5jb2Rlci5pbnB1dE5hbWVzWzBdXTogbmV3IG9ydC5UZW5zb3IoJ2Zsb2F0MzInLCBpbnB1dCwgWzEsIDMsIGlucHV0U2l6ZSwgaW5wdXRTaXplXSksXG4gIH0pO1xuICBjb25zdCBlbWIgPSBvdXRbZW5jb2Rlci5vdXRwdXROYW1lc1swXV07XG4gIHJldHVybiB7XG4gICAgZGF0YTogZW1iLmRhdGEgYXMgRmxvYXQzMkFycmF5LCBkaW1zOiBlbWIuZGltcyBhcyBudW1iZXJbXSxcbiAgICBzY2FsZSwgaW1hZ2VXaWR0aDogd2lkdGgsIGltYWdlSGVpZ2h0OiBoZWlnaHQsXG4gIH07XG59XG5cbi8qKiBSdW4gdGhlIGRlY29kZXIgZm9yIG9uZSBwcm9tcHQgYWdhaW5zdCBhIGNhY2hlZCBlbWJlZGRpbmcg4oaSIGEgYmluYXJ5IG1hc2suICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuRGVjb2RlcihcbiAgZGVjb2Rlcjogb3J0LkluZmVyZW5jZVNlc3Npb24sIGU6IENvcmVFbWJlZGRpbmcsIHByb21wdDogU2FtUHJvbXB0LFxuKTogUHJvbWlzZTxDb3JlTWFzaz4ge1xuICBjb25zdCB7IHBvaW50Q29vcmRzLCBwb2ludExhYmVscywgbnVtUG9pbnRzIH0gPSBidWlsZERlY29kZXJQcm9tcHQocHJvbXB0LCBlLnNjYWxlKTtcbiAgY29uc3Qgb3V0ID0gYXdhaXQgZGVjb2Rlci5ydW4oe1xuICAgIGltYWdlX2VtYmVkZGluZ3M6IG5ldyBvcnQuVGVuc29yKCdmbG9hdDMyJywgZS5kYXRhLCBlLmRpbXMpLFxuICAgIHBvaW50X2Nvb3JkczogbmV3IG9ydC5UZW5zb3IoJ2Zsb2F0MzInLCBwb2ludENvb3JkcywgWzEsIG51bVBvaW50cywgMl0pLFxuICAgIHBvaW50X2xhYmVsczogbmV3IG9ydC5UZW5zb3IoJ2Zsb2F0MzInLCBwb2ludExhYmVscywgWzEsIG51bVBvaW50c10pLFxuICAgIG1hc2tfaW5wdXQ6IG5ldyBvcnQuVGVuc29yKCdmbG9hdDMyJywgbmV3IEZsb2F0MzJBcnJheSgyNTYgKiAyNTYpLCBbMSwgMSwgMjU2LCAyNTZdKSxcbiAgICBoYXNfbWFza19pbnB1dDogbmV3IG9ydC5UZW5zb3IoJ2Zsb2F0MzInLCBGbG9hdDMyQXJyYXkuZnJvbShbMF0pLCBbMV0pLFxuICAgIG9yaWdfaW1fc2l6ZTogbmV3IG9ydC5UZW5zb3IoJ2Zsb2F0MzInLCBGbG9hdDMyQXJyYXkuZnJvbShbZS5pbWFnZUhlaWdodCwgZS5pbWFnZVdpZHRoXSksIFsyXSksXG4gIH0pO1xuICBjb25zdCBtYXNrcyA9IG91dFsnbWFza3MnXSA/PyBvdXRbZGVjb2Rlci5vdXRwdXROYW1lc1swXV07XG4gIGNvbnN0IGlvdSA9IChvdXRbJ2lvdV9wcmVkaWN0aW9ucyddPy5kYXRhIGFzIEZsb2F0MzJBcnJheSkgPz8gRmxvYXQzMkFycmF5LmZyb20oWzFdKTtcbiAgY29uc3QgWywgbSwgaCwgd10gPSBtYXNrcy5kaW1zIGFzIG51bWJlcltdO1xuICBjb25zdCBpZHggPSBiZXN0TWFza0luZGV4KGlvdS5zbGljZSgwLCBtKSk7XG4gIGNvbnN0IGxvZ2l0cyA9IChtYXNrcy5kYXRhIGFzIEZsb2F0MzJBcnJheSkuc3ViYXJyYXkoaWR4ICogaCAqIHcsIChpZHggKyAxKSAqIGggKiB3KTtcbiAgcmV0dXJuIHsgbWFzazogYmluYXJpemVNYXNrKGxvZ2l0cyksIHdpZHRoOiB3LCBoZWlnaHQ6IGgsIGlvdTogaW91W2lkeF0gPz8gMSB9O1xufVxuIl19
|
|
215
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FtLW9ubngtY29yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLW9ubngtY29yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssR0FBRyxNQUFNLGlCQUFpQixDQUFDO0FBSXZDOzs7Ozs7R0FNRztBQUVILHlFQUF5RTtBQUN6RSxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3BELHdGQUF3RjtBQUN4RixNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ2pEOzs7dUVBR3VFO0FBQ3ZFLE1BQU0sa0JBQWtCLEdBQUcsVUFBVSxDQUFDO0FBQ3RDLE1BQU0sV0FBVyxHQUFHLEdBQUcsa0JBQWtCLEtBQUssQ0FBQztBQUUvQyxJQUFJLGlCQUFpQixHQUF5QixJQUFJLENBQUM7QUFFbkQsd0VBQXdFO0FBQ3hFLFNBQVMscUJBQXFCO0lBQzVCLGlCQUFpQixLQUFLLE1BQU07U0FDekIsSUFBSSxFQUFFO1NBQ04sSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDZCxPQUFPLENBQUMsR0FBRyxDQUNULEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3hHLENBQ0Y7U0FDQSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDO1NBQ3JCLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FB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LENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDeEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzlCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7WUFDMUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMxQixNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ25CLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDdkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUMzQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDNUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQzVDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUM1QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDNUMsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FB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QUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUQsTUFBTSxHQUFHLEdBQUksR0FBRyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsSUFBcUIsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRixNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFnQixDQUFDO0lBQzNDLE1BQU0sR0FBRyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNDLE1BQU0sTUFBTSxHQUFJLEtBQUssQ0FBQyxJQUFxQixDQUFDLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDckYsT0FBTyxFQUFFLElBQUksRUFBRSxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDakYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIG9ydCBmcm9tICdvbm54cnVudGltZS13ZWInO1xuXG5pbXBvcnQgdHlwZSB7IFNhbVByb21wdCB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zYW0uY29udHJhY3QnO1xuXG4vKipcbiAqIFNoYXJlZCwgRE9NLWZyZWUgU0FNIGluZmVyZW5jZSBwcmltaXRpdmVzIHVzZWQgYnkgQk9USCBpbmZlcmVuY2UgYmFja2VuZHM6XG4gKiB0aGUgaW4tcHJvY2VzcyBzZXNzaW9uIChgT25ueFNhbVNlc3Npb25gLCBtYWluIHRocmVhZCkgYW5kIHRoZSBkZWRpY2F0ZWRcbiAqIFdlYiBXb3JrZXIgKGBvbm54LXNhbS53b3JrZXJgKS4gS2VlcGluZyB0aGVzZSBoZXJlIGF2b2lkcyBkdXBsaWNhdGluZyB0aGVcbiAqIHByZXByb2Nlc3NpbmcgLyBkZWNvZGVyLXByb21wdCBtYXRoOyBub3RoaW5nIGhlcmUgbWF5IGltcG9ydCBBbmd1bGFyIG9yIHRoZVxuICogRE9NLCBzaW5jZSB0aGUgd29ya2VyIGJ1bmRsZXMgaXQuXG4gKi9cblxuLyoqIFNBTSdzIHBlci1jaGFubmVsIChSR0IpIHBpeGVsIG1lYW4sIHN1YnRyYWN0ZWQgYmVmb3JlIHRoZSBlbmNvZGVyLiAqL1xuZXhwb3J0IGNvbnN0IFBJWEVMX01FQU4gPSBbMTIzLjY3NSwgMTE2LjI4LCAxMDMuNTNdO1xuLyoqIFNBTSdzIHBlci1jaGFubmVsIChSR0IpIHBpeGVsIHN0YW5kYXJkIGRldmlhdGlvbiwgZGl2aWRlZCBvdXQgYmVmb3JlIHRoZSBlbmNvZGVyLiAqL1xuZXhwb3J0IGNvbnN0IFBJWEVMX1NURCA9IFs1OC4zOTUsIDU3LjEyLCA1Ny4zNzVdO1xuLyoqIENhY2hlIEFQSSBzdG9yZSBmb3IgZG93bmxvYWRlZCBtb2RlbCBmaWxlcy4gQnVtcCB0aGUgdmVyc2lvbiBvbmx5IHdoZW4gdGhlIGNhY2hlXG4gKiAgTEFZT1VUIGNoYW5nZXMg4oCUIG9wZW5pbmcgdGhlIGNhY2hlIGRlbGV0ZXMgZXZlcnkgb2xkZXIgYHNhbS1vbm54KmAgc3RvcmUuIEEgbW9kZWxcbiAqICByZS1leHBvcnRlZCB1bmRlciB0aGUgc2FtZSBVUkxzIGJ1bXBzIGl0cyBvd24gYFNhbU1vZGVsRGVmLnJldmlzaW9uYCBpbnN0ZWFkLFxuICogIHdoaWNoIHJlLWRvd25sb2FkcyB0aGF0IG1vZGVsIGFsb25lIChzZWUge0BsaW5rIG1vZGVsQ2FjaGVLZXl9KS4gKi9cbmNvbnN0IE1PREVMX0NBQ0hFX1BSRUZJWCA9ICdzYW0tb25ueCc7XG5jb25zdCBNT0RFTF9DQUNIRSA9IGAke01PREVMX0NBQ0hFX1BSRUZJWH0tdjJgO1xuXG5sZXQgc3RhbGVDYWNoZXNQdXJnZWQ6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcblxuLyoqIERlbGV0ZSBtb2RlbCBjYWNoZXMgZnJvbSBlYXJsaWVyIHZlcnNpb25zIChvbmNlIHBlciBwYWdlL3dvcmtlcikuICovXG5mdW5jdGlvbiBwdXJnZVN0YWxlTW9kZWxDYWNoZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gIHN0YWxlQ2FjaGVzUHVyZ2VkID8/PSBjYWNoZXNcbiAgICAua2V5cygpXG4gICAgLnRoZW4oKG5hbWVzKSA9PlxuICAgICAgUHJvbWlzZS5hbGwoXG4gICAgICAgIG5hbWVzLmZpbHRlcigobikgPT4gbi5zdGFydHNXaXRoKE1PREVMX0NBQ0hFX1BSRUZJWCkgJiYgbiAhPT0gTU9ERUxfQ0FDSEUpLm1hcCgobikgPT4gY2FjaGVzLmRlbGV0ZShuKSksXG4gICAgICApLFxuICAgIClcbiAgICAudGhlbigoKSA9PiB1bmRlZmluZWQpXG4gICAgLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7IC8vIGJlc3QgZWZmb3J0OiBhIHN0YWxlIGNhY2hlIG9ubHkgd2FzdGVzIHNwYWNlXG4gIHJldHVybiBzdGFsZUNhY2hlc1B1cmdlZDtcbn1cblxuLyoqIE9wZW4gdGhlIGN1cnJlbnQgbW9kZWwgY2FjaGUsIG9yIG51bGwgd2hlcmUgdGhlIENhY2hlIEFQSSBpcyB1bmF2YWlsYWJsZS4gKi9cbmFzeW5jIGZ1bmN0aW9uIG9wZW5Nb2RlbENhY2hlKCk6IFByb21pc2U8Q2FjaGUgfCBudWxsPiB7XG4gIGlmICh0eXBlb2YgY2FjaGVzID09PSAndW5kZWZpbmVkJykgcmV0dXJuIG51bGw7XG4gIGF3YWl0IHB1cmdlU3RhbGVNb2RlbENhY2hlcygpO1xuICByZXR1cm4gY2FjaGVzLm9wZW4oTU9ERUxfQ0FDSEUpLmNhdGNoKCgpID0+IG51bGwpO1xufVxuXG4vKipcbiAqIERlbGV0ZSBldmVyeSBkb3dubG9hZGVkIFNBTSBtb2RlbCAoc2V2ZXJhbCBodW5kcmVkIE1CIHBlciBvcmlnaW4pLiBSZXNvbHZlc1xuICogdG8gdHJ1ZSB3aGVuIHNvbWV0aGluZyB3YXMgcmVtb3ZlZDsgZmFsc2Ugd2hlcmUgdGhlIENhY2hlIEFQSSBpcyB1bmF2YWlsYWJsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsZWFyU2FtTW9kZWxDYWNoZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKHR5cGVvZiBjYWNoZXMgPT09ICd1bmRlZmluZWQnKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IG5hbWVzID0gKGF3YWl0IGNhY2hlcy5rZXlzKCkpLmZpbHRlcigobikgPT4gbi5zdGFydHNXaXRoKE1PREVMX0NBQ0hFX1BSRUZJWCkpO1xuICBjb25zdCByZW1vdmVkID0gYXdhaXQgUHJvbWlzZS5hbGwobmFtZXMubWFwKChuKSA9PiBjYWNoZXMuZGVsZXRlKG4pKSk7XG4gIHJldHVybiByZW1vdmVkLnNvbWUoQm9vbGVhbik7XG59XG5cbi8qKiBFbmNvZGVyIG91dHB1dCBmb3Igb25lIGltYWdlLCByZXVzZWQgYWNyb3NzIHByb21wdHMuICovXG5leHBvcnQgaW50ZXJmYWNlIENvcmVFbWJlZGRpbmcge1xuICBkYXRhOiBGbG9hdDMyQXJyYXk7XG4gIGRpbXM6IG51bWJlcltdO1xuICBzY2FsZTogbnVtYmVyO1xuICBpbWFnZVdpZHRoOiBudW1iZXI7XG4gIGltYWdlSGVpZ2h0OiBudW1iZXI7XG59XG5cbi8qKiBEZWNvZGVyIG91dHB1dDogYSBiaW5hcnkgbWFzayBhdCBvcmlnaW5hbC1pbWFnZSByZXNvbHV0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3JlTWFzayB7XG4gIG1hc2s6IFVpbnQ4QXJyYXk7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICBpb3U6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgQ2FjaGUgQVBJIGtleSBhIG1vZGVsIGZpbGUgaXMgc3RvcmVkIHVuZGVyOiBpdHMgVVJMLCBwbHVzIHRoZSBtb2RlbCdzXG4gKiBgU2FtTW9kZWxEZWYucmV2aXNpb25gIGFzIGEgcXVlcnkgcGFyYW1ldGVyIHdoZW4gaXQgaGFzIG9uZSwgc28gYSBidW1wZWQgcmV2aXNpb25cbiAqIG1pc3NlcyB0aGUgY2FjaGUgYW5kIGRvd25sb2FkcyB0aGUgcmUtZXhwb3J0ZWQgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsQ2FjaGVLZXkodXJsOiBzdHJpbmcsIHJldmlzaW9uPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFyZXZpc2lvbikgcmV0dXJuIHVybDtcbiAgcmV0dXJuIGAke3VybH0ke3VybC5pbmNsdWRlcygnPycpID8gJyYnIDogJz8nfXNpdi1tb2RlbC1yZXY9JHtlbmNvZGVVUklDb21wb25lbnQocmV2aXNpb24pfWA7XG59XG5cbi8qKiBTdG9yZSBhIGRvd25sb2FkZWQgZmlsZSB1bmRlciBga2V5YCwgZmlyc3QgZHJvcHBpbmcgZXZlcnkgb3RoZXIgY29weSBvZiB0aGUgc2FtZSBmaWxlXG4gKiAgKG90aGVyIHJldmlzaW9ucywgb3IgdGhlIHNhbWUgcGF0aCB1bmRlciBhbm90aGVyIHF1ZXJ5KTogYSBtb2RlbCBpcyBzZXZlcmFsIGh1bmRyZWRcbiAqICBNQiwgYW5kIGEgc3VwZXJzZWRlZCBjb3B5IHdvdWxkIG90aGVyd2lzZSBzdGF5IG9uIGRpc2sgZm9yIGdvb2QuICovXG5hc3luYyBmdW5jdGlvbiBjYWNoZU1vZGVsKGNhY2hlOiBDYWNoZSwgdXJsOiBzdHJpbmcsIGtleTogc3RyaW5nLCBib2R5OiBSZXNwb25zZSk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBjYWNoZS5kZWxldGUodXJsLCB7IGlnbm9yZVNlYXJjaDogdHJ1ZSB9KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICBhd2FpdCBjYWNoZS5wdXQoa2V5LCBib2R5KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xufVxuXG4vKiogRmV0Y2ggYSBtb2RlbCBhcyBhbiBBcnJheUJ1ZmZlciwgc3RyZWFtaW5nIHByb2dyZXNzIGFuZCBjYWNoaW5nIGluIHRoZSBDYWNoZVxuICogIEFQSSAoc28gaXQgaXNuJ3QgcmUtZG93bmxvYWRlZCkgdW5kZXIge0BsaW5rIG1vZGVsQ2FjaGVLZXl9LiBDYWNoZSBoaXQg4oaSIHByb2dyZXNzXG4gKiAganVtcHMgdG8gMS4gV29ya3Mgb24gdGhlIG1haW4gdGhyZWFkIGFuZCBpbiBhIHdvcmtlciAoYm90aCBoYXZlIGBmZXRjaGAgKyBgY2FjaGVzYCkuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hNb2RlbChcbiAgdXJsOiBzdHJpbmcsXG4gIG9uUHJvZ3Jlc3M/OiAoZjogbnVtYmVyKSA9PiB2b2lkLFxuICByZXZpc2lvbj86IHN0cmluZyxcbik6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgY29uc3Qga2V5ID0gbW9kZWxDYWNoZUtleSh1cmwsIHJldmlzaW9uKTtcbiAgY29uc3QgY2FjaGUgPSBhd2FpdCBvcGVuTW9kZWxDYWNoZSgpO1xuICBjb25zdCBoaXQgPSBjYWNoZSA/IGF3YWl0IGNhY2hlLm1hdGNoKGtleSkgOiBudWxsO1xuICBpZiAoaGl0KSB7XG4gICAgb25Qcm9ncmVzcz8uKDEpO1xuICAgIHJldHVybiBhd2FpdCBoaXQuYXJyYXlCdWZmZXIoKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICBpZiAoIXJlc3Aub2spIHRocm93IG5ldyBFcnJvcihgZmV0Y2ggJHt1cmx9IGZhaWxlZDogSFRUUCAke3Jlc3Auc3RhdHVzfWApO1xuICBjb25zdCB0b3RhbCA9IE51bWJlcihyZXNwLmhlYWRlcnMuZ2V0KCdjb250ZW50LWxlbmd0aCcpKSB8fCAwO1xuICBpZiAoIXJlc3AuYm9keSB8fCAhdG90YWwpIHtcbiAgICBjb25zdCBidWYgPSBhd2FpdCByZXNwLmFycmF5QnVmZmVyKCk7XG4gICAgb25Qcm9ncmVzcz8uKDEpO1xuICAgIGlmIChjYWNoZSkgYXdhaXQgY2FjaGVNb2RlbChjYWNoZSwgdXJsLCBrZXksIG5ldyBSZXNwb25zZShidWYpKTtcbiAgICByZXR1cm4gYnVmO1xuICB9XG4gIGNvbnN0IHJlYWRlciA9IHJlc3AuYm9keS5nZXRSZWFkZXIoKTtcbiAgY29uc3QgY2h1bmtzOiBVaW50OEFycmF5W10gPSBbXTtcbiAgbGV0IHJlY2VpdmVkID0gMDtcbiAgZm9yICg7Oykge1xuICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgaWYgKGRvbmUpIGJyZWFrO1xuICAgIGNodW5rcy5wdXNoKHZhbHVlKTtcbiAgICByZWNlaXZlZCArPSB2YWx1ZS5sZW5ndGg7XG4gICAgb25Qcm9ncmVzcz8uKHJlY2VpdmVkIC8gdG90YWwpO1xuICB9XG4gIGNvbnN0IG91dCA9IG5ldyBVaW50OEFycmF5KHJlY2VpdmVkKTtcbiAgbGV0IG9mZiA9IDA7XG4gIGZvciAoY29uc3QgYyBvZiBjaHVua3MpIHtcbiAgICBvdXQuc2V0KGMsIG9mZik7XG4gICAgb2ZmICs9IGMubGVuZ3RoO1xuICB9XG4gIGlmIChjYWNoZSkge1xuICAgIC8vIFRoZSBSZXNwb25zZSBjb3BpZXMgaXRzIGJvZHksIHNvIG5vIGV4dHJhIGZ1bGwtc2l6ZSBjb3B5IG9mIHRoZSBtb2RlbCBoZXJlLlxuICAgIGF3YWl0IGNhY2hlTW9kZWwoY2FjaGUsIHVybCwga2V5LCBuZXcgUmVzcG9uc2Uob3V0LCB7IGhlYWRlcnM6IHsgJ2NvbnRlbnQtbGVuZ3RoJzogU3RyaW5nKHJlY2VpdmVkKSB9IH0pKTtcbiAgfVxuICBvblByb2dyZXNzPy4oMSk7XG4gIHJldHVybiBvdXQuYnVmZmVyO1xufVxuXG4vKiogUmVzaXplIChsb25nIHNpZGUg4oaSIHNpemUsIGJpbGluZWFyKSwgcGFkIHRvIHNpemXDl3NpemUsIFNBTS1ub3JtYWxpemUg4oaSIENIVyBmbG9hdDMyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZXByb2Nlc3MoXG4gIGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5LFxuICB3aWR0aDogbnVtYmVyLFxuICBoZWlnaHQ6IG51bWJlcixcbiAgc2l6ZTogbnVtYmVyLFxuICBzY2FsZTogbnVtYmVyLFxuKTogRmxvYXQzMkFycmF5IHtcbiAgY29uc3QgbmV3VyA9IE1hdGgucm91bmQod2lkdGggKiBzY2FsZSk7XG4gIGNvbnN0IG5ld0ggPSBNYXRoLnJvdW5kKGhlaWdodCAqIHNjYWxlKTtcbiAgY29uc3QgY2h3ID0gbmV3IEZsb2F0MzJBcnJheSgzICogc2l6ZSAqIHNpemUpOyAvLyB6ZXJvLXBhZGRlZFxuICBmb3IgKGxldCB5ID0gMDsgeSA8IG5ld0g7IHkrKykge1xuICAgIGNvbnN0IHN5ID0gTWF0aC5taW4oaGVpZ2h0IC0gMSwgeSAvIHNjYWxlKTtcbiAgICBjb25zdCB5MCA9IE1hdGguZmxvb3Ioc3kpO1xuICAgIGNvbnN0IGZ5ID0gc3kgLSB5MDtcbiAgICBjb25zdCB5MSA9IE1hdGgubWluKGhlaWdodCAtIDEsIHkwICsgMSk7XG4gICAgZm9yIChsZXQgeCA9IDA7IHggPCBuZXdXOyB4KyspIHtcbiAgICAgIGNvbnN0IHN4ID0gTWF0aC5taW4od2lkdGggLSAxLCB4IC8gc2NhbGUpO1xuICAgICAgY29uc3QgeDAgPSBNYXRoLmZsb29yKHN4KTtcbiAgICAgIGNvbnN0IGZ4ID0gc3ggLSB4MDtcbiAgICAgIGNvbnN0IHgxID0gTWF0aC5taW4od2lkdGggLSAxLCB4MCArIDEpO1xuICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCAzOyBjKyspIHtcbiAgICAgICAgY29uc3QgcDAwID0gZGF0YVsoeTAgKiB3aWR0aCArIHgwKSAqIDQgKyBjXTtcbiAgICAgICAgY29uc3QgcDAxID0gZGF0YVsoeTAgKiB3aWR0aCArIHgxKSAqIDQgKyBjXTtcbiAgICAgICAgY29uc3QgcDEwID0gZGF0YVsoeTEgKiB3aWR0aCArIHgwKSAqIDQgKyBjXTtcbiAgICAgICAgY29uc3QgcDExID0gZGF0YVsoeTEgKiB3aWR0aCArIHgxKSAqIDQgKyBjXTtcbiAgICAgICAgY29uc3QgdG9wID0gcDAwICsgKHAwMSAtIHAwMCkgKiBmeDtcbiAgICAgICAgY29uc3QgYm90ID0gcDEwICsgKHAxMSAtIHAxMCkgKiBmeDtcbiAgICAgICAgY29uc3QgdiA9IHRvcCArIChib3QgLSB0b3ApICogZnk7XG4gICAgICAgIGNod1tjICogc2l6ZSAqIHNpemUgKyB5ICogc2l6ZSArIHhdID0gKHYgLSBQSVhFTF9NRUFOW2NdKSAvIFBJWEVMX1NURFtjXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNodztcbn1cblxuLyoqIEFzc2VtYmxlIGRlY29kZXIgYHBvaW50X2Nvb3Jkc2AvYHBvaW50X2xhYmVsc2AgZnJvbSBhIHByb21wdCwgaW4gZW5jb2RlclxuICogIChyZXNpemVkKSBzcGFjZS4gQm94ID0gdHdvIHBvaW50cyBsYWJlbGxlZCAyLzM7IHBvaW50cyB1c2UgMS8wOyBhIHBvaW50cy1vbmx5XG4gKiAgcHJvbXB0IHBhZHMgdGhlIGFic2VudCBib3ggc2xvdCB3aXRoIGBbMCwwXWAgbGFiZWxsZWQgLTEuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGREZWNvZGVyUHJvbXB0KFxuICBwcm9tcHQ6IFNhbVByb21wdCxcbiAgc2NhbGU6IG51bWJlcixcbik6IHsgcG9pbnRDb29yZHM6IEZsb2F0MzJBcnJheTsgcG9pbnRMYWJlbHM6IEZsb2F0MzJBcnJheTsgbnVtUG9pbnRzOiBudW1iZXIgfSB7XG4gIGNvbnN0IGNvb3JkczogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgbGFiZWxzOiBudW1iZXJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHAgb2YgcHJvbXB0LnBvaW50cyA/PyBbXSkge1xuICAgIGNvb3Jkcy5wdXNoKHAueCAqIHNjYWxlLCBwLnkgKiBzY2FsZSk7XG4gICAgbGFiZWxzLnB1c2gocC5sYWJlbCk7XG4gIH1cbiAgaWYgKHByb21wdC5ib3gpIHtcbiAgICBjb25zdCBiID0gcHJvbXB0LmJveDtcbiAgICBjb29yZHMucHVzaChiLngwICogc2NhbGUsIGIueTAgKiBzY2FsZSk7XG4gICAgbGFiZWxzLnB1c2goMik7XG4gICAgY29vcmRzLnB1c2goYi54MSAqIHNjYWxlLCBiLnkxICogc2NhbGUpO1xuICAgIGxhYmVscy5wdXNoKDMpO1xuICB9IGVsc2UgaWYgKGxhYmVscy5sZW5ndGggPiAwKSB7XG4gICAgY29vcmRzLnB1c2goMCwgMCk7XG4gICAgbGFiZWxzLnB1c2goLTEpO1xuICB9XG4gIHJldHVybiB7XG4gICAgcG9pbnRDb29yZHM6IEZsb2F0MzJBcnJheS5mcm9tKGNvb3JkcyksXG4gICAgcG9pbnRMYWJlbHM6IEZsb2F0MzJBcnJheS5mcm9tKGxhYmVscyksXG4gICAgbnVtUG9pbnRzOiBsYWJlbHMubGVuZ3RoLFxuICB9O1xufVxuXG4vKiogQmluYXJpemUgbWFzayBsb2dpdHMgKGA+IHRocmVzaG9sZGApIGludG8gYSAwLzEgbWFzay4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaW5hcml6ZU1hc2sobG9naXRzOiBGbG9hdDMyQXJyYXksIHRocmVzaG9sZCA9IDApOiBVaW50OEFycmF5IHtcbiAgY29uc3Qgb3V0ID0gbmV3IFVpbnQ4QXJyYXkobG9naXRzLmxlbmd0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbG9naXRzLmxlbmd0aDsgaSsrKSBvdXRbaV0gPSBsb2dpdHNbaV0gPiB0aHJlc2hvbGQgPyAxIDogMDtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqIEluZGV4IG9mIHRoZSBoaWdoZXN0LXNjb3JpbmcgbWFzayBpbiBhIG11bHRpbWFzayBkZWNvZGVyIG91dHB1dC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiZXN0TWFza0luZGV4KGlvdTogRmxvYXQzMkFycmF5IHwgbnVtYmVyW10pOiBudW1iZXIge1xuICBsZXQgYmVzdCA9IDA7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgaW91Lmxlbmd0aDsgaSsrKSBpZiAoaW91W2ldID4gaW91W2Jlc3RdKSBiZXN0ID0gaTtcbiAgcmV0dXJuIGJlc3Q7XG59XG5cbi8qKiBSdW4gdGhlIGVuY29kZXIgb24gYW4gUkdCQSBpbWFnZSDihpIgYSByZXVzYWJsZSBlbWJlZGRpbmcuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuRW5jb2RlcihcbiAgZW5jb2Rlcjogb3J0LkluZmVyZW5jZVNlc3Npb24sXG4gIGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5LFxuICB3aWR0aDogbnVtYmVyLFxuICBoZWlnaHQ6IG51bWJlcixcbiAgaW5wdXRTaXplOiBudW1iZXIsXG4pOiBQcm9taXNlPENvcmVFbWJlZGRpbmc+IHtcbiAgY29uc3Qgc2NhbGUgPSBpbnB1dFNpemUgLyBNYXRoLm1heCh3aWR0aCwgaGVpZ2h0KTtcbiAgY29uc3QgaW5wdXQgPSBwcmVwcm9jZXNzKGRhdGEsIHdpZHRoLCBoZWlnaHQsIGlucHV0U2l6ZSwgc2NhbGUpO1xuICBjb25zdCBvdXQgPSBhd2FpdCBlbmNvZGVyLnJ1bih7XG4gICAgW2VuY29kZXIuaW5wdXROYW1lc1swXV06IG5ldyBvcnQuVGVuc29yKCdmbG9hdDMyJywgaW5wdXQsIFsxLCAzLCBpbnB1dFNpemUsIGlucHV0U2l6ZV0pLFxuICB9KTtcbiAgY29uc3QgZW1iID0gb3V0W2VuY29kZXIub3V0cHV0TmFtZXNbMF1dO1xuICByZXR1cm4ge1xuICAgIGRhdGE6IGVtYi5kYXRhIGFzIEZsb2F0MzJBcnJheSxcbiAgICBkaW1zOiBlbWIuZGltcyBhcyBudW1iZXJbXSxcbiAgICBzY2FsZSxcbiAgICBpbWFnZVdpZHRoOiB3aWR0aCxcbiAgICBpbWFnZUhlaWdodDogaGVpZ2h0LFxuICB9O1xufVxuXG4vKiogUnVuIHRoZSBkZWNvZGVyIGZvciBvbmUgcHJvbXB0IGFnYWluc3QgYSBjYWNoZWQgZW1iZWRkaW5nIOKGkiBhIGJpbmFyeSBtYXNrLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkRlY29kZXIoXG4gIGRlY29kZXI6IG9ydC5JbmZlcmVuY2VTZXNzaW9uLFxuICBlOiBDb3JlRW1iZWRkaW5nLFxuICBwcm9tcHQ6IFNhbVByb21wdCxcbik6IFByb21pc2U8Q29yZU1hc2s+IHtcbiAgY29uc3QgeyBwb2ludENvb3JkcywgcG9pbnRMYWJlbHMsIG51bVBvaW50cyB9ID0gYnVpbGREZWNvZGVyUHJvbXB0KHByb21wdCwgZS5zY2FsZSk7XG4gIGNvbnN0IG91dCA9IGF3YWl0IGRlY29kZXIucnVuKHtcbiAgICBpbWFnZV9lbWJlZGRpbmdzOiBuZXcgb3J0LlRlbnNvcignZmxvYXQzMicsIGUuZGF0YSwgZS5kaW1zKSxcbiAgICBwb2ludF9jb29yZHM6IG5ldyBvcnQuVGVuc29yKCdmbG9hdDMyJywgcG9pbnRDb29yZHMsIFsxLCBudW1Qb2ludHMsIDJdKSxcbiAgICBwb2ludF9sYWJlbHM6IG5ldyBvcnQuVGVuc29yKCdmbG9hdDMyJywgcG9pbnRMYWJlbHMsIFsxLCBudW1Qb2ludHNdKSxcbiAgICBtYXNrX2lucHV0OiBuZXcgb3J0LlRlbnNvcignZmxvYXQzMicsIG5ldyBGbG9hdDMyQXJyYXkoMjU2ICogMjU2KSwgWzEsIDEsIDI1NiwgMjU2XSksXG4gICAgaGFzX21hc2tfaW5wdXQ6IG5ldyBvcnQuVGVuc29yKCdmbG9hdDMyJywgRmxvYXQzMkFycmF5LmZyb20oWzBdKSwgWzFdKSxcbiAgICBvcmlnX2ltX3NpemU6IG5ldyBvcnQuVGVuc29yKCdmbG9hdDMyJywgRmxvYXQzMkFycmF5LmZyb20oW2UuaW1hZ2VIZWlnaHQsIGUuaW1hZ2VXaWR0aF0pLCBbMl0pLFxuICB9KTtcbiAgY29uc3QgbWFza3MgPSBvdXRbJ21hc2tzJ10gPz8gb3V0W2RlY29kZXIub3V0cHV0TmFtZXNbMF1dO1xuICBjb25zdCBpb3UgPSAob3V0Wydpb3VfcHJlZGljdGlvbnMnXT8uZGF0YSBhcyBGbG9hdDMyQXJyYXkpID8/IEZsb2F0MzJBcnJheS5mcm9tKFsxXSk7XG4gIGNvbnN0IFssIG0sIGgsIHddID0gbWFza3MuZGltcyBhcyBudW1iZXJbXTtcbiAgY29uc3QgaWR4ID0gYmVzdE1hc2tJbmRleChpb3Uuc2xpY2UoMCwgbSkpO1xuICBjb25zdCBsb2dpdHMgPSAobWFza3MuZGF0YSBhcyBGbG9hdDMyQXJyYXkpLnN1YmFycmF5KGlkeCAqIGggKiB3LCAoaWR4ICsgMSkgKiBoICogdyk7XG4gIHJldHVybiB7IG1hc2s6IGJpbmFyaXplTWFzayhsb2dpdHMpLCB3aWR0aDogdywgaGVpZ2h0OiBoLCBpb3U6IGlvdVtpZHhdID8/IDEgfTtcbn1cbiJdfQ==
|