@jax-data-science/sci-image-visualizer 0.8.3 → 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.
Files changed (525) hide show
  1. package/README.md +201 -460
  2. package/esm2022/index.mjs +28 -15
  3. package/esm2022/lib/channel-histogram/channel-histogram.component.mjs +163 -91
  4. package/esm2022/lib/contracts/capabilities.contract.mjs +4 -3
  5. package/esm2022/lib/contracts/cell-segmenter.contract.mjs +1 -1
  6. package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +5 -1
  7. package/esm2022/lib/contracts/color.mjs +60 -0
  8. package/esm2022/lib/contracts/colormap-lut.mjs +213 -57
  9. package/esm2022/lib/contracts/coordinate-transform.contract.mjs +1 -1
  10. package/esm2022/lib/contracts/display-types.mjs +11 -1
  11. package/esm2022/lib/contracts/instance-segmenter.contract.mjs +1 -1
  12. package/esm2022/lib/contracts/intensity.mjs +48 -5
  13. package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
  14. package/esm2022/lib/contracts/plot-type.mjs +134 -17
  15. package/esm2022/lib/contracts/ports/image-state.port.mjs +4 -1
  16. package/esm2022/lib/contracts/ports/preferences.port.mjs +5 -1
  17. package/esm2022/lib/contracts/ports/region-io.port.mjs +2 -1
  18. package/esm2022/lib/contracts/ports/spatial-data.port.mjs +5 -1
  19. package/esm2022/lib/contracts/ports/tile-access.port.mjs +2 -1
  20. package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
  21. package/esm2022/lib/contracts/region-overlay.contract.mjs +1 -1
  22. package/esm2022/lib/contracts/sam.contract.mjs +1 -1
  23. package/esm2022/lib/contracts/semantic-segmenter.contract.mjs +1 -1
  24. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +3 -1
  25. package/esm2022/lib/contracts/toolbar-tool.contract.mjs +6 -4
  26. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  27. package/esm2022/lib/contracts/viz-config.mjs +2 -1
  28. package/esm2022/lib/geometry/contour.mjs +63 -0
  29. package/esm2022/lib/geometry/raster.mjs +98 -0
  30. package/esm2022/lib/geometry/ring.mjs +201 -0
  31. package/esm2022/lib/hex-color-picker/hex-color-picker.component.mjs +202 -102
  32. package/esm2022/lib/implementations/base-store-visualizer.mjs +201 -48
  33. package/esm2022/lib/implementations/napari-js/napari-axes-gizmo.mjs +65 -0
  34. package/esm2022/lib/implementations/napari-js/napari-display-state.mjs +136 -0
  35. package/esm2022/lib/implementations/napari-js/napari-helpers.mjs +199 -0
  36. package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +602 -0
  37. package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +3 -4
  38. package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +66 -0
  39. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +157 -591
  40. package/esm2022/lib/implementations/napari-js/napari-scene.mjs +2 -0
  41. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +614 -0
  42. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +769 -0
  43. package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +199 -0
  44. package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +263 -0
  45. package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +159 -0
  46. package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +106 -1408
  47. package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +2 -2
  48. package/esm2022/lib/implementations/napari-js/napari-surface-scene.mjs +271 -0
  49. package/esm2022/lib/implementations/napari-js/napari-tile-client.mjs +562 -0
  50. package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +344 -0
  51. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +358 -4218
  52. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +439 -0
  53. package/esm2022/lib/implementations/napari-js/napari-volume-z-handle.mjs +6 -6
  54. package/esm2022/lib/implementations/napari-js/region-overlay/overlay-projection.mjs +96 -0
  55. package/esm2022/lib/implementations/napari-js/region-overlay/region-edit.mjs +35 -0
  56. package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +182 -0
  57. package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +30 -0
  58. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +274 -0
  59. package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +144 -0
  60. package/esm2022/lib/implementations/napari-js/spatial-tiles/layer-groups.mjs +165 -0
  61. package/esm2022/lib/implementations/napari-js/spatial-tiles/plan-context.mjs +78 -0
  62. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +182 -0
  63. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +369 -0
  64. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +306 -0
  65. package/esm2022/lib/implementations/osd/display-pipeline.mjs +102 -40
  66. package/esm2022/lib/implementations/osd/histogram-sampler.mjs +56 -31
  67. package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +128 -0
  68. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +333 -1685
  69. package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +1 -1
  70. package/esm2022/lib/implementations/osd/osd-coords.mjs +5 -6
  71. package/esm2022/lib/implementations/osd/osd-export.mjs +122 -0
  72. package/esm2022/lib/implementations/osd/osd-lib.mjs +15 -1
  73. package/esm2022/lib/implementations/osd/osd-navigator-chrome.mjs +205 -0
  74. package/esm2022/lib/implementations/osd/osd-pixel-readback.mjs +68 -0
  75. package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +153 -0
  76. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +185 -718
  77. package/esm2022/lib/implementations/osd/osd-scale-bar.mjs +52 -60
  78. package/esm2022/lib/implementations/osd/osd-tile-source.mjs +105 -0
  79. package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +2 -0
  80. package/esm2022/lib/implementations/osd/osd-viewer-mount.mjs +44 -0
  81. package/esm2022/lib/implementations/osd/osd-viewport.mjs +184 -0
  82. package/esm2022/lib/implementations/osd/osd-zoom.mjs +7 -1
  83. package/esm2022/lib/implementations/osd/simple-source.mjs +395 -0
  84. package/esm2022/lib/implementations/osd/slice-cache.mjs +53 -48
  85. package/esm2022/lib/implementations/osd/tile-client.mjs +32 -11
  86. package/esm2022/lib/implementations/osd/tile-recolor.mjs +330 -0
  87. package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +161 -73
  88. package/esm2022/lib/implementations/plotly/plotly-coordinate-transform.mjs +1 -1
  89. package/esm2022/lib/implementations/plotly/plotly-image-loader.mjs +112 -0
  90. package/esm2022/lib/implementations/plotly/plotly-image-recolor.mjs +178 -0
  91. package/esm2022/lib/implementations/plotly/plotly-intensity-inset.mjs +33 -0
  92. package/esm2022/lib/implementations/plotly/plotly-isosurface-controls.mjs +83 -0
  93. package/esm2022/lib/implementations/plotly/plotly-layouts.mjs +121 -0
  94. package/esm2022/lib/implementations/plotly/plotly-readback.mjs +117 -0
  95. package/esm2022/lib/implementations/plotly/plotly-region-overlay.mjs +19 -10
  96. package/esm2022/lib/implementations/plotly/plotly-shape-projection.mjs +223 -0
  97. package/esm2022/lib/implementations/plotly/plotly-trace-builders.mjs +79 -19
  98. package/esm2022/lib/implementations/plotly/plotly-zoom-controller.mjs +223 -0
  99. package/esm2022/lib/implementations/plotly/plotly.service.mjs +439 -1655
  100. package/esm2022/lib/implementations/region-centroids.mjs +47 -0
  101. package/esm2022/lib/implementations/simple-slice-access.service.mjs +22 -12
  102. package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +172 -92
  103. package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +103 -22
  104. package/esm2022/lib/implementations/tile-server/index.mjs +6 -0
  105. package/esm2022/lib/implementations/tile-server/native-histogram.mjs +30 -0
  106. package/esm2022/lib/implementations/tile-server/poll-descriptor.mjs +65 -0
  107. package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +42 -0
  108. package/esm2022/lib/implementations/tile-server/transport.mjs +135 -0
  109. package/esm2022/lib/intensity/intensity-profile.mjs +107 -0
  110. package/esm2022/lib/intensity/intensity-profile.service.mjs +223 -0
  111. package/esm2022/lib/intensity-inset/intensity-inset.component.mjs +133 -0
  112. package/esm2022/lib/models/bezier.mjs +1 -11
  113. package/esm2022/lib/models/class-preset.mjs +41 -3
  114. package/esm2022/lib/models/geometry.mjs +27 -164
  115. package/esm2022/lib/models/polygon-edit.mjs +254 -0
  116. package/esm2022/lib/models/polygon-factory.mjs +118 -0
  117. package/esm2022/lib/models/region-clone.mjs +68 -0
  118. package/esm2022/lib/models/region-geojson.mjs +373 -0
  119. package/esm2022/lib/models/region.mjs +34 -33
  120. package/esm2022/lib/models/shape.mjs +18 -16
  121. package/esm2022/lib/plot-mode/contribution-host.mjs +297 -0
  122. package/esm2022/lib/plot-mode/plot-mode-controller.mjs +9 -6
  123. package/esm2022/lib/plot-mode/plot-type-menu.mjs +85 -0
  124. package/esm2022/lib/plot-mode/tool-params-model.mjs +87 -0
  125. package/esm2022/lib/plot.utilities.mjs +296 -473
  126. package/esm2022/lib/processing/image-crop.mjs +1 -1
  127. package/esm2022/lib/processing/processing-image.mjs +28 -15
  128. package/esm2022/lib/provide-visualization.mjs +40 -14
  129. package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +99 -0
  130. package/esm2022/lib/region-editor/file-stem.mjs +13 -0
  131. package/esm2022/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.mjs +118 -0
  132. package/esm2022/lib/region-editor/mask-export.service.mjs +98 -0
  133. package/esm2022/lib/region-editor/mask-raster.mjs +11 -5
  134. package/esm2022/lib/region-editor/region-color-dialog/region-color-dialog.component.mjs +56 -0
  135. package/esm2022/lib/region-editor/region-editor-help/region-editor-help.component.mjs +28 -0
  136. package/esm2022/lib/region-editor/region-editor.component.mjs +402 -651
  137. package/esm2022/lib/region-editor/region-metrics.mjs +68 -0
  138. package/esm2022/lib/region-editor/region-persistence.service.mjs +134 -0
  139. package/esm2022/lib/region-editor/region-table/region-table.component.mjs +153 -0
  140. package/esm2022/lib/region-editor/save-mask-dialog/save-mask-dialog.component.mjs +91 -0
  141. package/esm2022/lib/region-editor/save-regions-dialog/save-regions-dialog.component.mjs +92 -0
  142. package/esm2022/lib/region-ops.service.mjs +28 -70
  143. package/esm2022/lib/region-overlay/region-geometry.mjs +360 -0
  144. package/esm2022/lib/region-overlay/region-hit-test.mjs +103 -0
  145. package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
  146. package/esm2022/lib/render-orchestrator.mjs +14 -11
  147. package/esm2022/lib/render-session.mjs +207 -0
  148. package/esm2022/lib/routing-visualizer.service.mjs +459 -411
  149. package/esm2022/lib/spatial/density-raster.mjs +14 -0
  150. package/esm2022/lib/spatial/embedding-compute-coordinator.mjs +239 -0
  151. package/esm2022/lib/spatial/embedding-compute.mjs +43 -10
  152. package/esm2022/lib/spatial/gene-search.mjs +1 -1
  153. package/esm2022/lib/spatial/glyphs.mjs +97 -0
  154. package/esm2022/lib/spatial/lod.mjs +187 -0
  155. package/esm2022/lib/spatial/spatial-controls.facade.mjs +200 -0
  156. package/esm2022/lib/spatial/spatial-density.mjs +25 -16
  157. package/esm2022/lib/spatial/spatial-encoding.mjs +26 -82
  158. package/esm2022/lib/spatial/spatial-expression.mjs +43 -42
  159. package/esm2022/lib/spatial/spatial-framing.mjs +1 -1
  160. package/esm2022/lib/spatial/spatial-heatmap.mjs +6 -3
  161. package/esm2022/lib/spatial/spatial-hover.mjs +5 -33
  162. package/esm2022/lib/spatial/spatial-panel-model.mjs +282 -0
  163. package/esm2022/lib/spatial/spatial-sections.mjs +1 -1
  164. package/esm2022/lib/spatial/spatial-selection.mjs +33 -46
  165. package/esm2022/lib/spatial/spatial-tile-merge.mjs +219 -0
  166. package/esm2022/lib/spatial/spatial-tiles.mjs +12 -648
  167. package/esm2022/lib/spatial/spatial-volume-image.mjs +2 -4
  168. package/esm2022/lib/spatial/stats.mjs +71 -0
  169. package/esm2022/lib/spatial/transcript-grouping.mjs +307 -0
  170. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +150 -0
  171. package/esm2022/lib/spatial-controls/spatial-charts/chart-data-model.mjs +309 -0
  172. package/esm2022/lib/spatial-controls/spatial-charts/chart-help.mjs +145 -0
  173. package/esm2022/lib/spatial-controls/spatial-charts/plotly-chart-host.mjs +158 -0
  174. package/esm2022/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.mjs +47 -0
  175. package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +297 -802
  176. package/esm2022/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.mjs +89 -0
  177. package/esm2022/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.mjs +52 -0
  178. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +143 -1238
  179. package/esm2022/lib/spatial-controls/spatial-gene-picker.mjs +153 -0
  180. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +241 -0
  181. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +193 -0
  182. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +132 -0
  183. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.model.mjs +67 -0
  184. package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +147 -0
  185. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +300 -0
  186. package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +370 -0
  187. package/esm2022/lib/store/class-color.util.mjs +46 -3
  188. package/esm2022/lib/store/region-history.mjs +146 -0
  189. package/esm2022/lib/store/region-scope-cache.mjs +140 -0
  190. package/esm2022/lib/store/region-selection.mjs +82 -0
  191. package/esm2022/lib/store/region-store.service.mjs +279 -675
  192. package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
  193. package/esm2022/lib/store/visualizer-store.service.mjs +49 -71
  194. package/esm2022/lib/toast-outlets.mjs +5 -4
  195. package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +92 -434
  196. package/esm2022/lib/toolbar/canvas-tools.mjs +20 -0
  197. package/esm2022/lib/toolbar/crop/slide-crop.mjs +26 -42
  198. package/esm2022/lib/toolbar/plot-type-selector/plot-type-selector.component.mjs +85 -0
  199. package/esm2022/lib/toolbar/region-tools/region-tool-buttons.mjs +74 -0
  200. package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +114 -0
  201. package/esm2022/lib/toolbar/segmentation/cell-segment-tool.service.mjs +74 -78
  202. package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +50 -8
  203. package/esm2022/lib/toolbar/segmentation/onnx-sam-session.mjs +61 -42
  204. package/esm2022/lib/toolbar/segmentation/pending-calls.mjs +47 -0
  205. package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +12 -4
  206. package/esm2022/lib/toolbar/segmentation/sam-onnx-core.mjs +70 -14
  207. package/esm2022/lib/toolbar/segmentation/sam-point-tool.service.mjs +135 -172
  208. package/esm2022/lib/toolbar/segmentation/sam-prompt.mjs +9 -90
  209. package/esm2022/lib/toolbar/segmentation/sam-session.service.mjs +183 -0
  210. package/esm2022/lib/toolbar/segmentation/sam-tool.service.mjs +95 -150
  211. package/esm2022/lib/toolbar/segmentation/segmentation-commit.mjs +12 -0
  212. package/esm2022/lib/toolbar/segmentation/segmentation-runner.mjs +108 -0
  213. package/esm2022/lib/toolbar/segmentation-tools/segmentation-tools.component.mjs +155 -0
  214. package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +81 -0
  215. package/esm2022/lib/toolbar/tool-kit/async-tool-status.mjs +37 -0
  216. package/esm2022/lib/toolbar/tool-kit/canvas-tool-manager.mjs +63 -0
  217. package/esm2022/lib/toolbar/tool-kit/canvas-tool.mjs +2 -0
  218. package/esm2022/lib/toolbar/tool-kit/frame-pixels.mjs +108 -0
  219. package/esm2022/lib/toolbar/tool-kit/mask-stroke-editor.mjs +306 -0
  220. package/esm2022/lib/toolbar/tool-kit/matrix-frame.mjs +61 -0
  221. package/esm2022/lib/toolbar/tool-kit/tool-overlay.mjs +140 -0
  222. package/esm2022/lib/toolbar/tool-kit/undo-gesture.mjs +24 -0
  223. package/esm2022/lib/toolbar/tool-slider/tool-slider.component.mjs +63 -0
  224. package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +50 -0
  225. package/esm2022/lib/toolbar/toolbar.component.mjs +68 -117
  226. package/esm2022/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.mjs +93 -115
  227. package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +107 -0
  228. package/esm2022/lib/toolbar/wand/wand-region-grow.mjs +321 -0
  229. package/esm2022/lib/toolbar/wand/wand-tool.service.mjs +121 -416
  230. package/esm2022/lib/toolbar/wand/wand.service.mjs +30 -894
  231. package/esm2022/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.mjs +48 -90
  232. package/esm2022/lib/util/mark-for-check.mjs +17 -0
  233. package/esm2022/lib/util/supersede.mjs +56 -0
  234. package/esm2022/lib/visualization.module.mjs +39 -141
  235. package/esm2022/lib/visualizer/floating-drag.directive.mjs +58 -0
  236. package/esm2022/lib/visualizer/region-actions.mjs +149 -0
  237. package/esm2022/lib/visualizer/region-load.mjs +60 -0
  238. package/esm2022/lib/visualizer/spatial-dataset-binder.mjs +163 -0
  239. package/esm2022/lib/visualizer/tool-modes.mjs +113 -0
  240. package/esm2022/lib/visualizer/viewer-shortcuts.mjs +167 -0
  241. package/esm2022/lib/visualizer/visualizer-context-menu.mjs +119 -0
  242. package/esm2022/lib/visualizer.component.mjs +480 -1902
  243. package/esm2022/lib/workers/spatial-math-ops.mjs +43 -0
  244. package/esm2022/lib/workers/spatial-math-worker.mjs +10 -0
  245. package/esm2022/lib/workers/spatial-math.mjs +190 -0
  246. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs +41083 -0
  247. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs.map +1 -0
  248. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs +238 -0
  249. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs.map +1 -0
  250. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs +12 -0
  251. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs.map +1 -0
  252. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +41 -34467
  253. package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
  254. package/fesm2022/mask.worker.js +36 -917
  255. package/fesm2022/onnx-sam.worker.js +52 -16
  256. package/fesm2022/spatial-math.worker.js +471 -0
  257. package/fesm2022/tsne.worker.js +32 -15
  258. package/index.d.ts +13 -10
  259. package/lib/channel-histogram/channel-histogram.component.d.ts +53 -43
  260. package/lib/contracts/capabilities.contract.d.ts +4 -2
  261. package/lib/contracts/cell-segmenter.contract.d.ts +1 -0
  262. package/lib/contracts/channel-histogram-api.contract.d.ts +4 -0
  263. package/lib/contracts/color.d.ts +27 -0
  264. package/lib/contracts/colormap-lut.d.ts +19 -4
  265. package/lib/contracts/coordinate-transform.contract.d.ts +3 -3
  266. package/lib/contracts/display-types.d.ts +21 -0
  267. package/lib/contracts/instance-segmenter.contract.d.ts +5 -0
  268. package/lib/contracts/intensity.d.ts +13 -2
  269. package/lib/contracts/plot-type.d.ts +3 -1
  270. package/lib/contracts/ports/image-state.port.d.ts +6 -2
  271. package/lib/contracts/ports/preferences.port.d.ts +4 -0
  272. package/lib/contracts/ports/region-io.port.d.ts +1 -0
  273. package/lib/contracts/ports/spatial-data.port.d.ts +4 -10
  274. package/lib/contracts/ports/tile-access.port.d.ts +1 -0
  275. package/lib/contracts/region-editor-api.contract.d.ts +1 -1
  276. package/lib/contracts/region-overlay.contract.d.ts +5 -0
  277. package/lib/contracts/sam.contract.d.ts +7 -0
  278. package/lib/contracts/semantic-segmenter.contract.d.ts +6 -0
  279. package/lib/contracts/spatial-dataset.contract.d.ts +19 -6
  280. package/lib/contracts/toolbar-tool.contract.d.ts +1 -0
  281. package/lib/contracts/visualizer.contract.d.ts +221 -54
  282. package/lib/contracts/viz-config.d.ts +1 -0
  283. package/lib/geometry/contour.d.ts +24 -0
  284. package/lib/geometry/raster.d.ts +42 -0
  285. package/lib/geometry/ring.d.ts +67 -0
  286. package/lib/hex-color-picker/hex-color-picker.component.d.ts +61 -27
  287. package/lib/implementations/base-store-visualizer.d.ts +61 -15
  288. package/lib/implementations/napari-js/napari-axes-gizmo.d.ts +36 -0
  289. package/lib/implementations/napari-js/napari-display-state.d.ts +76 -0
  290. package/lib/implementations/napari-js/napari-helpers.d.ts +129 -0
  291. package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +162 -0
  292. package/lib/implementations/napari-js/napari-loading-badge.d.ts +0 -1
  293. package/lib/implementations/napari-js/napari-loading-state.d.ts +30 -0
  294. package/lib/implementations/napari-js/napari-region-overlay.d.ts +62 -70
  295. package/lib/implementations/napari-js/napari-scene.d.ts +93 -0
  296. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +163 -0
  297. package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +212 -0
  298. package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +114 -0
  299. package/lib/implementations/napari-js/napari-spatial-hover.d.ts +89 -0
  300. package/lib/implementations/napari-js/napari-spatial-scene.d.ts +118 -0
  301. package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +56 -263
  302. package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +1 -1
  303. package/lib/implementations/napari-js/napari-surface-scene.d.ts +76 -0
  304. package/lib/implementations/napari-js/napari-tile-client.d.ts +214 -0
  305. package/lib/implementations/napari-js/napari-tool-bridge.d.ts +179 -0
  306. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +121 -883
  307. package/lib/implementations/napari-js/napari-volume-scene.d.ts +104 -0
  308. package/lib/implementations/napari-js/napari-volume-z-handle.d.ts +8 -12
  309. package/lib/implementations/napari-js/region-overlay/overlay-projection.d.ts +59 -0
  310. package/lib/implementations/napari-js/region-overlay/region-edit.d.ts +15 -0
  311. package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +54 -0
  312. package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +26 -0
  313. package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +70 -0
  314. package/lib/implementations/napari-js/spatial-tiles/density-layer.d.ts +61 -0
  315. package/lib/implementations/napari-js/spatial-tiles/layer-groups.d.ts +67 -0
  316. package/lib/implementations/napari-js/spatial-tiles/plan-context.d.ts +38 -0
  317. package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +71 -0
  318. package/lib/implementations/napari-js/spatial-tiles/transcript-jobs.d.ts +105 -0
  319. package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +56 -0
  320. package/lib/implementations/osd/display-pipeline.d.ts +38 -9
  321. package/lib/implementations/osd/histogram-sampler.d.ts +22 -12
  322. package/lib/implementations/osd/openseadragon-viewer-options.d.ts +35 -0
  323. package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +78 -354
  324. package/lib/implementations/osd/osd-coordinate-transform.d.ts +2 -1
  325. package/lib/implementations/osd/osd-coords.d.ts +6 -4
  326. package/lib/implementations/osd/osd-export.d.ts +36 -0
  327. package/lib/implementations/osd/osd-lib.d.ts +7 -0
  328. package/lib/implementations/osd/osd-navigator-chrome.d.ts +69 -0
  329. package/lib/implementations/osd/osd-pixel-readback.d.ts +22 -0
  330. package/lib/implementations/osd/osd-region-overlay-draw.d.ts +37 -0
  331. package/lib/implementations/osd/osd-region-overlay.d.ts +36 -48
  332. package/lib/implementations/osd/osd-scale-bar.d.ts +8 -6
  333. package/lib/implementations/osd/osd-tile-source.d.ts +49 -0
  334. package/lib/implementations/osd/osd-viewer-like.d.ts +100 -0
  335. package/lib/implementations/osd/osd-viewer-mount.d.ts +14 -0
  336. package/lib/implementations/osd/osd-viewport.d.ts +77 -0
  337. package/lib/implementations/osd/osd-zoom.d.ts +6 -0
  338. package/lib/implementations/osd/simple-source.d.ts +161 -0
  339. package/lib/implementations/osd/slice-cache.d.ts +12 -3
  340. package/lib/implementations/osd/tile-client.d.ts +11 -14
  341. package/lib/implementations/osd/tile-recolor.d.ts +141 -0
  342. package/lib/implementations/plotly/omics-trace-builders.d.ts +32 -20
  343. package/lib/implementations/plotly/plotly-image-loader.d.ts +49 -0
  344. package/lib/implementations/plotly/plotly-image-recolor.d.ts +75 -0
  345. package/lib/implementations/plotly/plotly-intensity-inset.d.ts +8 -0
  346. package/lib/implementations/plotly/plotly-isosurface-controls.d.ts +38 -0
  347. package/lib/implementations/plotly/plotly-layouts.d.ts +188 -0
  348. package/lib/implementations/plotly/plotly-readback.d.ts +41 -0
  349. package/lib/implementations/plotly/plotly-region-overlay.d.ts +2 -2
  350. package/lib/implementations/plotly/plotly-shape-projection.d.ts +92 -0
  351. package/lib/implementations/plotly/plotly-trace-builders.d.ts +23 -12
  352. package/lib/implementations/plotly/plotly-zoom-controller.d.ts +86 -0
  353. package/lib/implementations/plotly/plotly.service.d.ts +136 -401
  354. package/lib/implementations/region-centroids.d.ts +14 -0
  355. package/lib/implementations/simple-slice-access.service.d.ts +7 -4
  356. package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +42 -18
  357. package/lib/implementations/spatial-data-http/spatial-wire.d.ts +34 -9
  358. package/lib/implementations/tile-server/index.d.ts +5 -0
  359. package/lib/implementations/tile-server/native-histogram.d.ts +25 -0
  360. package/lib/implementations/tile-server/poll-descriptor.d.ts +39 -0
  361. package/lib/implementations/tile-server/tile-protocol.d.ts +80 -0
  362. package/lib/implementations/tile-server/transport.d.ts +62 -0
  363. package/lib/intensity/intensity-profile.d.ts +66 -0
  364. package/lib/intensity/intensity-profile.service.d.ts +108 -0
  365. package/lib/intensity-inset/intensity-inset.component.d.ts +58 -0
  366. package/lib/models/bezier.d.ts +0 -5
  367. package/lib/models/class-preset.d.ts +18 -0
  368. package/lib/models/geometry.d.ts +14 -48
  369. package/lib/models/polygon-edit.d.ts +72 -0
  370. package/lib/models/polygon-factory.d.ts +40 -0
  371. package/lib/models/region-clone.d.ts +20 -0
  372. package/lib/models/region-geojson.d.ts +17 -0
  373. package/lib/models/region.d.ts +40 -4
  374. package/lib/models/shape.d.ts +8 -0
  375. package/lib/plot-mode/contribution-host.d.ts +125 -0
  376. package/lib/plot-mode/plot-type-menu.d.ts +60 -0
  377. package/lib/plot-mode/tool-params-model.d.ts +49 -0
  378. package/lib/plot.utilities.d.ts +19 -30
  379. package/lib/processing/processing-image.d.ts +5 -2
  380. package/lib/provide-visualization.d.ts +19 -2
  381. package/lib/region-editor/classes-panel/classes-panel.component.d.ts +56 -0
  382. package/lib/region-editor/file-stem.d.ts +7 -0
  383. package/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.d.ts +45 -0
  384. package/lib/region-editor/mask-export.service.d.ts +54 -0
  385. package/lib/region-editor/mask-raster.d.ts +2 -8
  386. package/lib/region-editor/region-color-dialog/region-color-dialog.component.d.ts +29 -0
  387. package/lib/region-editor/region-editor-help/region-editor-help.component.d.ts +11 -0
  388. package/lib/region-editor/region-editor.component.d.ts +166 -199
  389. package/lib/region-editor/region-metrics.d.ts +26 -0
  390. package/lib/region-editor/region-persistence.service.d.ts +69 -0
  391. package/lib/region-editor/region-table/region-table.component.d.ts +83 -0
  392. package/lib/region-editor/save-mask-dialog/save-mask-dialog.component.d.ts +36 -0
  393. package/lib/region-editor/save-regions-dialog/save-regions-dialog.component.d.ts +37 -0
  394. package/lib/region-ops.service.d.ts +1 -7
  395. package/lib/region-overlay/region-geometry.d.ts +157 -0
  396. package/lib/region-overlay/region-hit-test.d.ts +38 -0
  397. package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
  398. package/lib/render-orchestrator.d.ts +6 -2
  399. package/lib/render-session.d.ts +75 -0
  400. package/lib/routing-visualizer.service.d.ts +110 -58
  401. package/lib/spatial/density-raster.d.ts +6 -0
  402. package/lib/spatial/embedding-compute-coordinator.d.ts +123 -0
  403. package/lib/spatial/embedding-compute.d.ts +21 -2
  404. package/lib/spatial/glyphs.d.ts +16 -0
  405. package/lib/spatial/lod.d.ts +94 -0
  406. package/lib/spatial/spatial-controls.facade.d.ts +64 -0
  407. package/lib/spatial/spatial-density.d.ts +15 -5
  408. package/lib/spatial/spatial-encoding.d.ts +11 -44
  409. package/lib/spatial/spatial-expression.d.ts +40 -22
  410. package/lib/spatial/spatial-framing.d.ts +1 -0
  411. package/lib/spatial/spatial-heatmap.d.ts +2 -0
  412. package/lib/spatial/spatial-hover.d.ts +4 -16
  413. package/lib/spatial/spatial-panel-model.d.ts +135 -0
  414. package/lib/spatial/spatial-selection.d.ts +21 -26
  415. package/lib/spatial/spatial-tile-merge.d.ts +41 -0
  416. package/lib/spatial/spatial-tiles.d.ts +9 -256
  417. package/lib/spatial/stats.d.ts +38 -0
  418. package/lib/spatial/transcript-grouping.d.ts +119 -0
  419. package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +64 -0
  420. package/lib/spatial-controls/spatial-charts/chart-data-model.d.ts +153 -0
  421. package/lib/spatial-controls/spatial-charts/chart-help.d.ts +69 -0
  422. package/lib/spatial-controls/spatial-charts/plotly-chart-host.d.ts +98 -0
  423. package/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.d.ts +26 -0
  424. package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +101 -260
  425. package/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.d.ts +43 -0
  426. package/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.d.ts +27 -0
  427. package/lib/spatial-controls/spatial-controls.component.d.ts +68 -448
  428. package/lib/spatial-controls/spatial-gene-picker.d.ts +86 -0
  429. package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +102 -0
  430. package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +72 -0
  431. package/lib/spatial-controls/spatial-key/spatial-key.component.d.ts +66 -0
  432. package/lib/spatial-controls/spatial-key/spatial-key.model.d.ts +33 -0
  433. package/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.d.ts +64 -0
  434. package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +117 -0
  435. package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +142 -0
  436. package/lib/store/class-color.util.d.ts +35 -1
  437. package/lib/store/region-history.d.ts +66 -0
  438. package/lib/store/region-scope-cache.d.ts +63 -0
  439. package/lib/store/region-selection.d.ts +36 -0
  440. package/lib/store/region-store.service.d.ts +104 -112
  441. package/lib/store/visualizer-store.service.d.ts +22 -33
  442. package/lib/toast-outlets.d.ts +4 -3
  443. package/lib/toolbar/brush/brush-tool.service.d.ts +31 -98
  444. package/lib/toolbar/canvas-tools.d.ts +20 -0
  445. package/lib/toolbar/crop/slide-crop.d.ts +10 -4
  446. package/lib/toolbar/plot-type-selector/plot-type-selector.component.d.ts +38 -0
  447. package/lib/toolbar/region-tools/region-tool-buttons.d.ts +21 -0
  448. package/lib/toolbar/region-tools/region-tools.component.d.ts +60 -0
  449. package/lib/toolbar/segmentation/cell-segment-tool.service.d.ts +10 -14
  450. package/lib/toolbar/segmentation/cellpose-segmenter.service.d.ts +12 -2
  451. package/lib/toolbar/segmentation/onnx-sam-session.d.ts +22 -3
  452. package/lib/toolbar/segmentation/pending-calls.d.ts +31 -0
  453. package/lib/toolbar/segmentation/sam-model-registry.d.ts +9 -3
  454. package/lib/toolbar/segmentation/sam-onnx-core.d.ts +18 -5
  455. package/lib/toolbar/segmentation/sam-point-tool.service.d.ts +46 -32
  456. package/lib/toolbar/segmentation/sam-prompt.d.ts +7 -31
  457. package/lib/toolbar/segmentation/sam-session.service.d.ts +74 -0
  458. package/lib/toolbar/segmentation/sam-tool.service.d.ts +23 -30
  459. package/lib/toolbar/segmentation/segmentation-commit.d.ts +8 -0
  460. package/lib/toolbar/segmentation/segmentation-runner.d.ts +52 -0
  461. package/lib/toolbar/segmentation-tools/segmentation-tools.component.d.ts +87 -0
  462. package/lib/toolbar/stack-controls/stack-controls.component.d.ts +40 -0
  463. package/lib/toolbar/tool-kit/async-tool-status.d.ts +21 -0
  464. package/lib/toolbar/tool-kit/canvas-tool-manager.d.ts +36 -0
  465. package/lib/toolbar/tool-kit/canvas-tool.d.ts +86 -0
  466. package/lib/toolbar/tool-kit/frame-pixels.d.ts +45 -0
  467. package/lib/toolbar/tool-kit/mask-stroke-editor.d.ts +125 -0
  468. package/lib/toolbar/tool-kit/matrix-frame.d.ts +40 -0
  469. package/lib/toolbar/tool-kit/tool-overlay.d.ts +60 -0
  470. package/lib/toolbar/tool-kit/undo-gesture.d.ts +17 -0
  471. package/lib/toolbar/tool-slider/tool-slider.component.d.ts +33 -0
  472. package/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.d.ts +24 -0
  473. package/lib/toolbar/toolbar.component.d.ts +47 -83
  474. package/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.d.ts +33 -40
  475. package/lib/toolbar/view-controls/view-controls.component.d.ts +54 -0
  476. package/lib/toolbar/wand/wand-region-grow.d.ts +49 -0
  477. package/lib/toolbar/wand/wand-tool.service.d.ts +39 -124
  478. package/lib/toolbar/wand/wand.service.d.ts +22 -116
  479. package/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.d.ts +17 -37
  480. package/lib/util/mark-for-check.d.ts +11 -0
  481. package/lib/util/supersede.d.ts +53 -0
  482. package/lib/visualization.module.d.ts +18 -39
  483. package/lib/visualizer/floating-drag.directive.d.ts +30 -0
  484. package/lib/visualizer/region-actions.d.ts +54 -0
  485. package/lib/visualizer/region-load.d.ts +27 -0
  486. package/lib/visualizer/spatial-dataset-binder.d.ts +74 -0
  487. package/lib/visualizer/tool-modes.d.ts +49 -0
  488. package/lib/visualizer/viewer-shortcuts.d.ts +71 -0
  489. package/lib/visualizer/visualizer-context-menu.d.ts +55 -0
  490. package/lib/visualizer.component.d.ts +201 -447
  491. package/lib/workers/spatial-math-ops.d.ts +65 -0
  492. package/lib/workers/spatial-math-worker.d.ts +7 -0
  493. package/lib/workers/spatial-math.d.ts +74 -0
  494. package/package.json +12 -3
  495. package/src/lib/styles/_viz-icons-rules.scss +73 -0
  496. package/src/lib/styles/viz-icons.scss +14 -0
  497. package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +0 -97
  498. package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +0 -195
  499. package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +0 -92
  500. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs +0 -329
  501. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map +0 -1
  502. package/lib/implementations/napari-js/napari-axes-labels.d.ts +0 -49
  503. package/lib/implementations/napari-js/napari-navigator.d.ts +0 -72
  504. package/lib/implementations/napari-js/napari-scale-bar.d.ts +0 -35
  505. package/src/lib/assets/cell-detection.svg +0 -37
  506. package/src/lib/assets/click.svg +0 -1
  507. package/src/lib/assets/colormap-luts.json +0 -1
  508. package/src/lib/assets/edit-selection-white.svg +0 -47
  509. package/src/lib/assets/icons/colormap-earth.png +0 -0
  510. package/src/lib/assets/icons/colormap-placeholder.png +0 -0
  511. package/src/lib/assets/icons/colormap-pubu.png +0 -0
  512. package/src/lib/assets/interactive-segmentation-cursor.svg +0 -1
  513. package/src/lib/assets/picture-segmentation.svg +0 -43
  514. package/src/lib/assets/test/download-379.svg +0 -1
  515. package/src/lib/assets/test/download-98.svg +0 -1
  516. package/src/lib/assets/test/json-1.svg +0 -1
  517. package/src/lib/assets/test/load-53.svg +0 -1
  518. package/src/lib/assets/test/mask-44.svg +0 -1
  519. package/src/lib/assets/test/mask-download-44.svg +0 -15
  520. package/src/lib/assets/test/mask-save-44.svg +0 -11
  521. package/src/lib/assets/test/overlay-1.svg +0 -1
  522. package/src/lib/assets/test/overlay-4.svg +0 -1
  523. package/src/lib/assets/test/region-26.svg +0 -1
  524. package/src/lib/assets/test/save-56.svg +0 -1
  525. package/src/lib/assets/test/upload-43.svg +0 -1
@@ -1,10 +1,12 @@
1
1
  import { Injectable } from '@angular/core';
2
- import { BehaviorSubject } from 'rxjs';
3
- import { WandService } from '../wand/wand.service';
4
2
  import { cropImageRegion } from '../crop/slide-crop';
5
- import { Region, Polygon, Rectangle } from '../../models/region';
3
+ import { Region, Rectangle } from '../../models/region';
4
+ import { makePolygon } from '../../models/polygon-factory';
5
+ import { labelsToPolygons } from '../../geometry/contour';
6
+ import { MatrixFrame } from '../tool-kit/matrix-frame';
7
+ import { AsyncToolStatus } from '../tool-kit/async-tool-status';
8
+ import { withoutRegions } from './segmentation-commit';
6
9
  import * as i0 from "@angular/core";
7
- import * as i1 from "../wand/wand.service";
8
10
  /** Yield to the event loop (a macrotask) so the toast can repaint the latest
9
11
  * status / animate the spinner before the next main-thread-blocking step. */
10
12
  const tick = () => new Promise((r) => setTimeout(r, 0));
@@ -19,97 +21,91 @@ const tick = () => new Promise((r) => setTimeout(r, 0));
19
21
  * box prompt, so the box just bounds the crop it segments automatically.
20
22
  */
21
23
  export class CellSegmentToolService {
22
- constructor(wandService) {
23
- this.wandService = wandService;
24
- this.status$ = new BehaviorSubject('');
25
- this.busy$ = new BehaviorSubject(false);
26
- this.progress$ = new BehaviorSubject(-1);
24
+ constructor() {
25
+ this.state = new AsyncToolStatus();
26
+ this.status$ = this.state.status$;
27
+ this.busy$ = this.state.busy$;
28
+ this.progress$ = this.state.progress$;
27
29
  }
28
- bindHost(host) { this.host = host; }
29
30
  /**
30
- * Crop + cellpose-segment every rectangle; append the cell regions and drop
31
- * the prompt rectangles that produced cells. Returns the number of regions added.
31
+ * Crop + cellpose-segment every rectangle of the backend behind `host`; append
32
+ * the cell regions and drop the prompt rectangles that produced cells. Returns
33
+ * the number of regions added; 0 (ignored) while a previous run is still going.
34
+ * The host is passed per run, so no backend's host outlives its call.
32
35
  */
33
- async segmentBoxes(segmenter) {
34
- if (!this.host)
36
+ async segmentBoxes(host, segmenter) {
37
+ if (this.state.busy)
35
38
  return 0;
36
- const cached = this.host.getCachedImageData();
39
+ const cached = host.getCachedImageData();
37
40
  if (!cached || cached.frames.length === 0) {
38
41
  this.status$.next('No image loaded.');
39
42
  return 0;
40
43
  }
41
- const regions = this.host.getRegions();
42
- const rects = regions.filter((r) => r.bounds instanceof Rectangle);
44
+ const rects = host.getRegions().filter((r) => r.bounds instanceof Rectangle);
43
45
  if (rects.length === 0) {
44
46
  this.status$.next('Draw one or more rectangles, then run Cellpose.');
45
47
  return 0;
46
48
  }
47
- const rx = cached.ratios[0] || 1;
48
- const ry = cached.ratios[0] || 1;
49
- const ox = cached.originX ?? 0;
50
- const oy = cached.originY ?? 0;
51
- const frameIdx = this.host.getActiveFrameIndex();
52
- this.busy$.next(true);
53
- try {
54
- const masks = [];
55
- const consumed = new Set();
56
- let added = 0;
57
- for (let i = 0; i < rects.length; i++) {
58
- const b = rects[i].bounds;
59
- // Prefix each phase with the box index when there's more than one.
60
- const prefix = rects.length > 1 ? `Box ${i + 1}/${rects.length}: ` : '';
61
- this.status$.next(`${prefix}Cropping…`);
62
- await tick(); // let the status paint before the (main-thread) crop
63
- const crop = cropImageRegion(cached, frameIdx, { x0: b.x, y0: b.y, x1: b.x + b.width, y1: b.y + b.height });
64
- if (!crop)
65
- continue;
66
- const seg = await segmenter.segmentCells({ data: crop.data, width: crop.width, height: crop.height }, { onProgress: (f) => this.progress$.next(f), onStatus: (s) => this.status$.next(prefix + s) });
67
- this.status$.next(`${prefix}Tracing cells…`);
68
- await tick(); // paint before the (main-thread) contour tracing
69
- const polys = this.wandService.labelsToPolygons(seg.labels, seg.width, seg.height, seg.width, seg.height, 0, 0);
70
- if (polys.length === 0)
71
- continue;
72
- for (const poly of polys) {
73
- // crop-pixel → frame-matrix (offset by crop origin) → data coords.
74
- const xData = poly.xpoints.map((x) => ox + (crop.matrixX0 + x) * rx);
75
- const yData = poly.ypoints.map((y) => oy + (crop.matrixY0 + y) * ry);
76
- masks.push(this.makeRegion(xData, yData, rects[i].color)); // inherit the box's color
77
- added++;
49
+ const frame = MatrixFrame.from(cached);
50
+ const frameIdx = host.getActiveFrameIndex();
51
+ const added = await this.state.run(async () => {
52
+ try {
53
+ const cells = [];
54
+ const consumed = [];
55
+ for (let i = 0; i < rects.length; i++) {
56
+ const b = rects[i].bounds;
57
+ // Prefix each phase with the box index when there's more than one.
58
+ const prefix = rects.length > 1 ? `Box ${i + 1}/${rects.length}: ` : '';
59
+ this.status$.next(`${prefix}Cropping…`);
60
+ await tick(); // let the status paint before the (main-thread) crop
61
+ const crop = cropImageRegion(cached, frameIdx, {
62
+ x0: b.x,
63
+ y0: b.y,
64
+ x1: b.x + b.width,
65
+ y1: b.y + b.height,
66
+ });
67
+ if (!crop)
68
+ continue;
69
+ const seg = await segmenter.segmentCells({ data: crop.data, width: crop.width, height: crop.height }, { onProgress: (f) => this.progress$.next(f), onStatus: (s) => this.status$.next(prefix + s) });
70
+ this.status$.next(`${prefix}Tracing cells…`);
71
+ await tick(); // paint before the (main-thread) contour tracing
72
+ // Crop-pixel → frame-matrix (offset by the crop origin) → data coords.
73
+ const polys = labelsToPolygons(seg.labels, seg.width, seg.height, crop.matrixX0, crop.matrixY0);
74
+ if (polys.length === 0)
75
+ continue;
76
+ for (const poly of polys) {
77
+ const ring = frame.ringToData(poly.xpoints, poly.ypoints);
78
+ const color = rects[i].color || host.getShapeColor();
79
+ cells.push(makeCellRegion(ring.xs, ring.ys, frame.holesToData(poly.holes), color));
80
+ }
81
+ consumed.push(rects[i]);
78
82
  }
79
- consumed.add(rects[i]);
83
+ // Commit against the regions as they are NOW (the run takes a while and
84
+ // the user may have edited meanwhile): drop the consumed prompts by id.
85
+ host.setRegions(withoutRegions(host.getRegions(), consumed).concat(cells));
86
+ this.status$.next(cells.length > 0 ? `Added ${cells.length} cell region(s).` : 'No cells found.');
87
+ return cells.length;
80
88
  }
81
- this.host.setRegions(regions.filter((r) => !consumed.has(r)).concat(masks));
82
- this.status$.next(added > 0 ? `Added ${added} cell region(s).` : 'No cells found.');
83
- return added;
84
- }
85
- catch (err) {
86
- this.status$.next(err instanceof Error ? err.message : 'Cellpose segmentation failed.');
87
- return 0;
88
- }
89
- finally {
90
- this.busy$.next(false);
91
- this.progress$.next(-1);
92
- }
93
- }
94
- makeRegion(xData, yData, color) {
95
- const poly = new Polygon();
96
- poly.npoints = xData.length;
97
- poly.xpoints = xData;
98
- poly.ypoints = yData;
99
- poly.coordinates = xData.map((x, i) => [x, yData[i]]);
100
- poly.closed = true;
101
- const region = new Region();
102
- region.bounds = poly;
103
- // Inherit the source box's color; fall back to the host default.
104
- region.color = color || this.host.getShapeColor();
105
- region.label = 'cell';
106
- return region;
89
+ catch (err) {
90
+ this.status$.next(err instanceof Error ? err.message : 'Cellpose segmentation failed.');
91
+ return 0;
92
+ }
93
+ });
94
+ return added ?? 0;
107
95
  }
108
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: CellSegmentToolService, deps: [{ token: i1.WandService }], target: i0.ɵɵFactoryTarget.Injectable }); }
96
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: CellSegmentToolService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
109
97
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: CellSegmentToolService, providedIn: 'root' }); }
110
98
  }
111
99
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: CellSegmentToolService, decorators: [{
112
100
  type: Injectable,
113
101
  args: [{ providedIn: 'root' }]
114
- }], ctorParameters: () => [{ type: i1.WandService }] });
115
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VsbC1zZWdtZW50LXRvb2wuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdG9vbGJhci9zZWdtZW50YXRpb24vY2VsbC1zZWdtZW50LXRvb2wuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFdkMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVyRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7O0FBRWpFOzhFQUM4RTtBQUM5RSxNQUFNLElBQUksR0FBRyxHQUFrQixFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUV2RTs7Ozs7Ozs7O0dBU0c7QUFFSCxNQUFNLE9BQU8sc0JBQXNCO0lBT2pDLFlBQW9CLFdBQXdCO1FBQXhCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBSm5DLFlBQU8sR0FBRyxJQUFJLGVBQWUsQ0FBUyxFQUFFLENBQUMsQ0FBQztRQUMxQyxVQUFLLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDNUMsY0FBUyxHQUFHLElBQUksZUFBZSxDQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFTixDQUFDO0lBRWhELFFBQVEsQ0FBQyxJQUFrQixJQUFVLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUV4RDs7O09BR0c7SUFDSCxLQUFLLENBQUMsWUFBWSxDQUFDLFNBQXlCO1FBQzFDLElBQUks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QyxNQUFNLENBQUM7UUFDNUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzVCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLGlFQUFpRTtRQUNqRSxNQUFNLENBQUMsS0FBSyxHQUFHLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ2xELE1BQU0sQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO1FBQ3RCLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7OEdBNUZVLHNCQUFzQjtrSEFBdEIsc0JBQXNCLGNBRFQsTUFBTTs7MkZBQ25CLHNCQUFzQjtrQkFEbEMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgV2FuZFNlcnZpY2UgfSBmcm9tICcuLi93YW5kL3dhbmQuc2VydmljZSc7XG5pbXBvcnQgeyBXYW5kVG9vbEhvc3QgfSBmcm9tICcuLi93YW5kL3dhbmQtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IGNyb3BJbWFnZVJlZ2lvbiB9IGZyb20gJy4uL2Nyb3Avc2xpZGUtY3JvcCc7XG5pbXBvcnQgeyBJQ2VsbFNlZ21lbnRlciB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jZWxsLXNlZ21lbnRlci5jb250cmFjdCc7XG5pbXBvcnQgeyBSZWdpb24sIFBvbHlnb24sIFJlY3RhbmdsZSB9IGZyb20gJy4uLy4uL21vZGVscy9yZWdpb24nO1xuXG4vKiogWWllbGQgdG8gdGhlIGV2ZW50IGxvb3AgKGEgbWFjcm90YXNrKSBzbyB0aGUgdG9hc3QgY2FuIHJlcGFpbnQgdGhlIGxhdGVzdFxuICogIHN0YXR1cyAvIGFuaW1hdGUgdGhlIHNwaW5uZXIgYmVmb3JlIHRoZSBuZXh0IG1haW4tdGhyZWFkLWJsb2NraW5nIHN0ZXAuICovXG5jb25zdCB0aWNrID0gKCk6IFByb21pc2U8dm9pZD4gPT4gbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgMCkpO1xuXG4vKipcbiAqIEF1dG9tYXRpYyBjZWxsIHNlZ21lbnRhdGlvbiBpbnNpZGUgZHJhd24gYm94ZXMgKGppdC11aSM5MCkuIEZvciBlYWNoIHJlY3RhbmdsZVxuICogaXQgY2xpZW50IHNsaWRlLWNyb3BzIHRoZSBib3ggZnJvbSB0aGUgbG9hZGVkIGltYWdlLCBydW5zIGFuIGF1dG9tYXRpY1xuICogc2VnbWVudGVyIChjZWxscG9zZS1TQU0sIHN1cHBsaWVkIGJ5IHRoZSBob3N0IHZpYSB7QGxpbmsgSUNlbGxTZWdtZW50ZXJ9KSBvblxuICogdGhlIGNyb3AsIGFuZCB0dXJucyBldmVyeSBjZWxsIGluc3RhbmNlIGludG8gYSByZWdpb24g4oCUIG9mZnNldCBiYWNrIG9udG8gdGhlXG4gKiBmcmFtZS4gVGhlIHByb21wdCByZWN0YW5nbGUgaXMgcmVwbGFjZWQgYnkgaXRzIGNlbGwgcmVnaW9ucy5cbiAqXG4gKiBUaGlzIGlzIHRoZSBjb21wbGVtZW50IHRvIHRoZSBwcm9tcHRhYmxlIFNBTSB0b29sOiBjZWxscG9zZS1TQU0gY2FuJ3QgdGFrZSBhXG4gKiBib3ggcHJvbXB0LCBzbyB0aGUgYm94IGp1c3QgYm91bmRzIHRoZSBjcm9wIGl0IHNlZ21lbnRzIGF1dG9tYXRpY2FsbHkuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgQ2VsbFNlZ21lbnRUb29sU2VydmljZSB7XG4gIHByaXZhdGUgaG9zdCE6IFdhbmRUb29sSG9zdDtcblxuICByZWFkb25seSBzdGF0dXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcbiAgcmVhZG9ubHkgYnVzeSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgcHJvZ3Jlc3MkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KC0xKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHdhbmRTZXJ2aWNlOiBXYW5kU2VydmljZSkge31cblxuICBiaW5kSG9zdChob3N0OiBXYW5kVG9vbEhvc3QpOiB2b2lkIHsgdGhpcy5ob3N0ID0gaG9zdDsgfVxuXG4gIC8qKlxuICAgKiBDcm9wICsgY2VsbHBvc2Utc2VnbWVudCBldmVyeSByZWN0YW5nbGU7IGFwcGVuZCB0aGUgY2VsbCByZWdpb25zIGFuZCBkcm9wXG4gICAqIHRoZSBwcm9tcHQgcmVjdGFuZ2xlcyB0aGF0IHByb2R1Y2VkIGNlbGxzLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVnaW9ucyBhZGRlZC5cbiAgICovXG4gIGFzeW5jIHNlZ21lbnRCb3hlcyhzZWdtZW50ZXI6IElDZWxsU2VnbWVudGVyKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAoIXRoaXMuaG9zdCkgcmV0dXJuIDA7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5ob3N0LmdldENhY2hlZEltYWdlRGF0YSgpO1xuICAgIGlmICghY2FjaGVkIHx8IGNhY2hlZC5mcmFtZXMubGVuZ3RoID09PSAwKSB7IHRoaXMuc3RhdHVzJC5uZXh0KCdObyBpbWFnZSBsb2FkZWQuJyk7IHJldHVybiAwOyB9XG5cbiAgICBjb25zdCByZWdpb25zID0gdGhpcy5ob3N0LmdldFJlZ2lvbnMoKTtcbiAgICBjb25zdCByZWN0cyA9IHJlZ2lvbnMuZmlsdGVyKChyKSA9PiByLmJvdW5kcyBpbnN0YW5jZW9mIFJlY3RhbmdsZSk7XG4gICAgaWYgKHJlY3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5zdGF0dXMkLm5leHQoJ0RyYXcgb25lIG9yIG1vcmUgcmVjdGFuZ2xlcywgdGhlbiBydW4gQ2VsbHBvc2UuJyk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBjb25zdCByeCA9IGNhY2hlZC5yYXRpb3NbMF0gfHwgMTtcbiAgICBjb25zdCByeSA9IGNhY2hlZC5yYXRpb3NbMF0gfHwgMTtcbiAgICBjb25zdCBveCA9IGNhY2hlZC5vcmlnaW5YID8/IDA7XG4gICAgY29uc3Qgb3kgPSBjYWNoZWQub3JpZ2luWSA/PyAwO1xuICAgIGNvbnN0IGZyYW1lSWR4ID0gdGhpcy5ob3N0LmdldEFjdGl2ZUZyYW1lSW5kZXgoKTtcblxuICAgIHRoaXMuYnVzeSQubmV4dCh0cnVlKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbWFza3M6IFJlZ2lvbltdID0gW107XG4gICAgICBjb25zdCBjb25zdW1lZCA9IG5ldyBTZXQ8UmVnaW9uPigpO1xuICAgICAgbGV0IGFkZGVkID0gMDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYiA9IHJlY3RzW2ldLmJvdW5kcyBhcyBSZWN0YW5nbGU7XG4gICAgICAgIC8vIFByZWZpeCBlYWNoIHBoYXNlIHdpdGggdGhlIGJveCBpbmRleCB3aGVuIHRoZXJlJ3MgbW9yZSB0aGFuIG9uZS5cbiAgICAgICAgY29uc3QgcHJlZml4ID0gcmVjdHMubGVuZ3RoID4gMSA/IGBCb3ggJHtpICsgMX0vJHtyZWN0cy5sZW5ndGh9OiBgIDogJyc7XG4gICAgICAgIHRoaXMuc3RhdHVzJC5uZXh0KGAke3ByZWZpeH1Dcm9wcGluZ+KApmApO1xuICAgICAgICBhd2FpdCB0aWNrKCk7IC8vIGxldCB0aGUgc3RhdHVzIHBhaW50IGJlZm9yZSB0aGUgKG1haW4tdGhyZWFkKSBjcm9wXG4gICAgICAgIGNvbnN0IGNyb3AgPSBjcm9wSW1hZ2VSZWdpb24oXG4gICAgICAgICAgY2FjaGVkLCBmcmFtZUlkeCwgeyB4MDogYi54LCB5MDogYi55LCB4MTogYi54ICsgYi53aWR0aCwgeTE6IGIueSArIGIuaGVpZ2h0IH0sXG4gICAgICAgICk7XG4gICAgICAgIGlmICghY3JvcCkgY29udGludWU7XG4gICAgICAgIGNvbnN0IHNlZyA9IGF3YWl0IHNlZ21lbnRlci5zZWdtZW50Q2VsbHMoXG4gICAgICAgICAgeyBkYXRhOiBjcm9wLmRhdGEsIHdpZHRoOiBjcm9wLndpZHRoLCBoZWlnaHQ6IGNyb3AuaGVpZ2h0IH0sXG4gICAgICAgICAgeyBvblByb2dyZXNzOiAoZikgPT4gdGhpcy5wcm9ncmVzcyQubmV4dChmKSwgb25TdGF0dXM6IChzKSA9PiB0aGlzLnN0YXR1cyQubmV4dChwcmVmaXggKyBzKSB9LFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnN0YXR1cyQubmV4dChgJHtwcmVmaXh9VHJhY2luZyBjZWxsc+KApmApO1xuICAgICAgICBhd2FpdCB0aWNrKCk7IC8vIHBhaW50IGJlZm9yZSB0aGUgKG1haW4tdGhyZWFkKSBjb250b3VyIHRyYWNpbmdcbiAgICAgICAgY29uc3QgcG9seXMgPSB0aGlzLndhbmRTZXJ2aWNlLmxhYmVsc1RvUG9seWdvbnMoXG4gICAgICAgICAgc2VnLmxhYmVscywgc2VnLndpZHRoLCBzZWcuaGVpZ2h0LCBzZWcud2lkdGgsIHNlZy5oZWlnaHQsIDAsIDAsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChwb2x5cy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuICAgICAgICBmb3IgKGNvbnN0IHBvbHkgb2YgcG9seXMpIHtcbiAgICAgICAgICAvLyBjcm9wLXBpeGVsIOKGkiBmcmFtZS1tYXRyaXggKG9mZnNldCBieSBjcm9wIG9yaWdpbikg4oaSIGRhdGEgY29vcmRzLlxuICAgICAgICAgIGNvbnN0IHhEYXRhID0gcG9seS54cG9pbnRzLm1hcCgoeCkgPT4gb3ggKyAoY3JvcC5tYXRyaXhYMCArIHgpICogcngpO1xuICAgICAgICAgIGNvbnN0IHlEYXRhID0gcG9seS55cG9pbnRzLm1hcCgoeSkgPT4gb3kgKyAoY3JvcC5tYXRyaXhZMCArIHkpICogcnkpO1xuICAgICAgICAgIG1hc2tzLnB1c2godGhpcy5tYWtlUmVnaW9uKHhEYXRhLCB5RGF0YSwgcmVjdHNbaV0uY29sb3IpKTsgLy8gaW5oZXJpdCB0aGUgYm94J3MgY29sb3JcbiAgICAgICAgICBhZGRlZCsrO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN1bWVkLmFkZChyZWN0c1tpXSk7XG4gICAgICB9XG4gICAgICB0aGlzLmhvc3Quc2V0UmVnaW9ucyhyZWdpb25zLmZpbHRlcigocikgPT4gIWNvbnN1bWVkLmhhcyhyKSkuY29uY2F0KG1hc2tzKSk7XG4gICAgICB0aGlzLnN0YXR1cyQubmV4dChhZGRlZCA+IDAgPyBgQWRkZWQgJHthZGRlZH0gY2VsbCByZWdpb24ocykuYCA6ICdObyBjZWxscyBmb3VuZC4nKTtcbiAgICAgIHJldHVybiBhZGRlZDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuc3RhdHVzJC5uZXh0KGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiAnQ2VsbHBvc2Ugc2VnbWVudGF0aW9uIGZhaWxlZC4nKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmJ1c3kkLm5leHQoZmFsc2UpO1xuICAgICAgdGhpcy5wcm9ncmVzcyQubmV4dCgtMSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtYWtlUmVnaW9uKHhEYXRhOiBudW1iZXJbXSwgeURhdGE6IG51bWJlcltdLCBjb2xvcj86IHN0cmluZyk6IFJlZ2lvbiB7XG4gICAgY29uc3QgcG9seSA9IG5ldyBQb2x5Z29uKCk7XG4gICAgcG9seS5ucG9pbnRzID0geERhdGEubGVuZ3RoO1xuICAgIHBvbHkueHBvaW50cyA9IHhEYXRhO1xuICAgIHBvbHkueXBvaW50cyA9IHlEYXRhO1xuICAgIHBvbHkuY29vcmRpbmF0ZXMgPSB4RGF0YS5tYXAoKHgsIGkpID0+IFt4LCB5RGF0YVtpXV0pO1xuICAgIHBvbHkuY2xvc2VkID0gdHJ1ZTtcbiAgICBjb25zdCByZWdpb24gPSBuZXcgUmVnaW9uKCk7XG4gICAgcmVnaW9uLmJvdW5kcyA9IHBvbHk7XG4gICAgLy8gSW5oZXJpdCB0aGUgc291cmNlIGJveCdzIGNvbG9yOyBmYWxsIGJhY2sgdG8gdGhlIGhvc3QgZGVmYXVsdC5cbiAgICByZWdpb24uY29sb3IgPSBjb2xvciB8fCB0aGlzLmhvc3QuZ2V0U2hhcGVDb2xvcigpO1xuICAgIHJlZ2lvbi5sYWJlbCA9ICdjZWxsJztcbiAgICByZXR1cm4gcmVnaW9uO1xuICB9XG59XG4iXX0=
102
+ }] });
103
+ function makeCellRegion(xData, yData, holes, color) {
104
+ const region = new Region();
105
+ region.bounds = makePolygon(xData, yData, { holes });
106
+ // The source box's color, else the host default.
107
+ region.color = color;
108
+ region.label = 'cell';
109
+ return region;
110
+ }
111
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VsbC1zZWdtZW50LXRvb2wuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdG9vbGJhci9zZWdtZW50YXRpb24vY2VsbC1zZWdtZW50LXRvb2wuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVyRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7QUFFdkQ7OEVBQzhFO0FBQzlFLE1BQU0sSUFBSSxHQUFHLEdBQWtCLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRXZFOzs7Ozs7Ozs7R0FTRztBQUVILE1BQU0sT0FBTyxzQkFBc0I7SUFEbkM7UUFFbUIsVUFBSyxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7UUFFdEMsWUFBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQzdCLFVBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUN6QixjQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUM7S0FzRTNDO0lBcEVDOzs7OztP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QUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEtBQUssQ0FBQyxNQUFNLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUNsRyxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDdEIsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsK0JBQStCLENBQUMsQ0FBQztnQkFDeEYsT0FBTyxDQUFDLENBQUM7WUFDWCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDcEIsQ0FBQzs4R0ExRVUsc0JBQXNCO2tIQUF0QixzQkFBc0IsY0FEVCxNQUFNOzsyRkFDbkIsc0JBQXNCO2tCQURsQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTs7QUE4RWxDLFNBQVMsY0FBYyxDQUFDLEtBQWUsRUFBRSxLQUFlLEVBQUUsS0FBK0IsRUFBRSxLQUFhO0lBQ3RHLE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7SUFDNUIsTUFBTSxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDckQsaURBQWlEO0lBQ2pELE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO0lBQ3RCLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IENhbnZhc1Rvb2xIb3N0IH0gZnJvbSAnLi4vdG9vbC1raXQvY2FudmFzLXRvb2wnO1xuaW1wb3J0IHsgY3JvcEltYWdlUmVnaW9uIH0gZnJvbSAnLi4vY3JvcC9zbGlkZS1jcm9wJztcbmltcG9ydCB7IElDZWxsU2VnbWVudGVyIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NlbGwtc2VnbWVudGVyLmNvbnRyYWN0JztcbmltcG9ydCB7IFJlZ2lvbiwgUmVjdGFuZ2xlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3JlZ2lvbic7XG5pbXBvcnQgeyBtYWtlUG9seWdvbiB9IGZyb20gJy4uLy4uL21vZGVscy9wb2x5Z29uLWZhY3RvcnknO1xuaW1wb3J0IHsgbGFiZWxzVG9Qb2x5Z29ucyB9IGZyb20gJy4uLy4uL2dlb21ldHJ5L2NvbnRvdXInO1xuaW1wb3J0IHsgTWF0cml4RnJhbWUgfSBmcm9tICcuLi90b29sLWtpdC9tYXRyaXgtZnJhbWUnO1xuaW1wb3J0IHsgQXN5bmNUb29sU3RhdHVzIH0gZnJvbSAnLi4vdG9vbC1raXQvYXN5bmMtdG9vbC1zdGF0dXMnO1xuaW1wb3J0IHsgd2l0aG91dFJlZ2lvbnMgfSBmcm9tICcuL3NlZ21lbnRhdGlvbi1jb21taXQnO1xuXG4vKiogWWllbGQgdG8gdGhlIGV2ZW50IGxvb3AgKGEgbWFjcm90YXNrKSBzbyB0aGUgdG9hc3QgY2FuIHJlcGFpbnQgdGhlIGxhdGVzdFxuICogIHN0YXR1cyAvIGFuaW1hdGUgdGhlIHNwaW5uZXIgYmVmb3JlIHRoZSBuZXh0IG1haW4tdGhyZWFkLWJsb2NraW5nIHN0ZXAuICovXG5jb25zdCB0aWNrID0gKCk6IFByb21pc2U8dm9pZD4gPT4gbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgMCkpO1xuXG4vKipcbiAqIEF1dG9tYXRpYyBjZWxsIHNlZ21lbnRhdGlvbiBpbnNpZGUgZHJhd24gYm94ZXMgKGppdC11aSM5MCkuIEZvciBlYWNoIHJlY3RhbmdsZVxuICogaXQgY2xpZW50IHNsaWRlLWNyb3BzIHRoZSBib3ggZnJvbSB0aGUgbG9hZGVkIGltYWdlLCBydW5zIGFuIGF1dG9tYXRpY1xuICogc2VnbWVudGVyIChjZWxscG9zZS1TQU0sIHN1cHBsaWVkIGJ5IHRoZSBob3N0IHZpYSB7QGxpbmsgSUNlbGxTZWdtZW50ZXJ9KSBvblxuICogdGhlIGNyb3AsIGFuZCB0dXJucyBldmVyeSBjZWxsIGluc3RhbmNlIGludG8gYSByZWdpb24g4oCUIG9mZnNldCBiYWNrIG9udG8gdGhlXG4gKiBmcmFtZS4gVGhlIHByb21wdCByZWN0YW5nbGUgaXMgcmVwbGFjZWQgYnkgaXRzIGNlbGwgcmVnaW9ucy5cbiAqXG4gKiBUaGlzIGlzIHRoZSBjb21wbGVtZW50IHRvIHRoZSBwcm9tcHRhYmxlIFNBTSB0b29sOiBjZWxscG9zZS1TQU0gY2FuJ3QgdGFrZSBhXG4gKiBib3ggcHJvbXB0LCBzbyB0aGUgYm94IGp1c3QgYm91bmRzIHRoZSBjcm9wIGl0IHNlZ21lbnRzIGF1dG9tYXRpY2FsbHkuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgQ2VsbFNlZ21lbnRUb29sU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhdGUgPSBuZXcgQXN5bmNUb29sU3RhdHVzKCk7XG5cbiAgcmVhZG9ubHkgc3RhdHVzJCA9IHRoaXMuc3RhdGUuc3RhdHVzJDtcbiAgcmVhZG9ubHkgYnVzeSQgPSB0aGlzLnN0YXRlLmJ1c3kkO1xuICByZWFkb25seSBwcm9ncmVzcyQgPSB0aGlzLnN0YXRlLnByb2dyZXNzJDtcblxuICAvKipcbiAgICogQ3JvcCArIGNlbGxwb3NlLXNlZ21lbnQgZXZlcnkgcmVjdGFuZ2xlIG9mIHRoZSBiYWNrZW5kIGJlaGluZCBgaG9zdGA7IGFwcGVuZFxuICAgKiB0aGUgY2VsbCByZWdpb25zIGFuZCBkcm9wIHRoZSBwcm9tcHQgcmVjdGFuZ2xlcyB0aGF0IHByb2R1Y2VkIGNlbGxzLiBSZXR1cm5zXG4gICAqIHRoZSBudW1iZXIgb2YgcmVnaW9ucyBhZGRlZDsgMCAoaWdub3JlZCkgd2hpbGUgYSBwcmV2aW91cyBydW4gaXMgc3RpbGwgZ29pbmcuXG4gICAqIFRoZSBob3N0IGlzIHBhc3NlZCBwZXIgcnVuLCBzbyBubyBiYWNrZW5kJ3MgaG9zdCBvdXRsaXZlcyBpdHMgY2FsbC5cbiAgICovXG4gIGFzeW5jIHNlZ21lbnRCb3hlcyhob3N0OiBDYW52YXNUb29sSG9zdCwgc2VnbWVudGVyOiBJQ2VsbFNlZ21lbnRlcik6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKHRoaXMuc3RhdGUuYnVzeSkgcmV0dXJuIDA7XG4gICAgY29uc3QgY2FjaGVkID0gaG9zdC5nZXRDYWNoZWRJbWFnZURhdGEoKTtcbiAgICBpZiAoIWNhY2hlZCB8fCBjYWNoZWQuZnJhbWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5zdGF0dXMkLm5leHQoJ05vIGltYWdlIGxvYWRlZC4nKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IHJlY3RzID0gaG9zdC5nZXRSZWdpb25zKCkuZmlsdGVyKChyKSA9PiByLmJvdW5kcyBpbnN0YW5jZW9mIFJlY3RhbmdsZSk7XG4gICAgaWYgKHJlY3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5zdGF0dXMkLm5leHQoJ0RyYXcgb25lIG9yIG1vcmUgcmVjdGFuZ2xlcywgdGhlbiBydW4gQ2VsbHBvc2UuJyk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBjb25zdCBmcmFtZSA9IE1hdHJpeEZyYW1lLmZyb20oY2FjaGVkKTtcbiAgICBjb25zdCBmcmFtZUlkeCA9IGhvc3QuZ2V0QWN0aXZlRnJhbWVJbmRleCgpO1xuXG4gICAgY29uc3QgYWRkZWQgPSBhd2FpdCB0aGlzLnN0YXRlLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjZWxsczogUmVnaW9uW10gPSBbXTtcbiAgICAgICAgY29uc3QgY29uc3VtZWQ6IFJlZ2lvbltdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBiID0gcmVjdHNbaV0uYm91bmRzIGFzIFJlY3RhbmdsZTtcbiAgICAgICAgICAvLyBQcmVmaXggZWFjaCBwaGFzZSB3aXRoIHRoZSBib3ggaW5kZXggd2hlbiB0aGVyZSdzIG1vcmUgdGhhbiBvbmUuXG4gICAgICAgICAgY29uc3QgcHJlZml4ID0gcmVjdHMubGVuZ3RoID4gMSA/IGBCb3ggJHtpICsgMX0vJHtyZWN0cy5sZW5ndGh9OiBgIDogJyc7XG4gICAgICAgICAgdGhpcy5zdGF0dXMkLm5leHQoYCR7cHJlZml4fUNyb3BwaW5n4oCmYCk7XG4gICAgICAgICAgYXdhaXQgdGljaygpOyAvLyBsZXQgdGhlIHN0YXR1cyBwYWludCBiZWZvcmUgdGhlIChtYWluLXRocmVhZCkgY3JvcFxuICAgICAgICAgIGNvbnN0IGNyb3AgPSBjcm9wSW1hZ2VSZWdpb24oY2FjaGVkLCBmcmFtZUlkeCwge1xuICAgICAgICAgICAgeDA6IGIueCxcbiAgICAgICAgICAgIHkwOiBiLnksXG4gICAgICAgICAgICB4MTogYi54ICsgYi53aWR0aCxcbiAgICAgICAgICAgIHkxOiBiLnkgKyBiLmhlaWdodCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoIWNyb3ApIGNvbnRpbnVlO1xuICAgICAgICAgIGNvbnN0IHNlZyA9IGF3YWl0IHNlZ21lbnRlci5zZWdtZW50Q2VsbHMoXG4gICAgICAgICAgICB7IGRhdGE6IGNyb3AuZGF0YSwgd2lkdGg6IGNyb3Aud2lkdGgsIGhlaWdodDogY3JvcC5oZWlnaHQgfSxcbiAgICAgICAgICAgIHsgb25Qcm9ncmVzczogKGYpID0+IHRoaXMucHJvZ3Jlc3MkLm5leHQoZiksIG9uU3RhdHVzOiAocykgPT4gdGhpcy5zdGF0dXMkLm5leHQocHJlZml4ICsgcykgfSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuc3RhdHVzJC5uZXh0KGAke3ByZWZpeH1UcmFjaW5nIGNlbGxz4oCmYCk7XG4gICAgICAgICAgYXdhaXQgdGljaygpOyAvLyBwYWludCBiZWZvcmUgdGhlIChtYWluLXRocmVhZCkgY29udG91ciB0cmFjaW5nXG4gICAgICAgICAgLy8gQ3JvcC1waXhlbCDihpIgZnJhbWUtbWF0cml4IChvZmZzZXQgYnkgdGhlIGNyb3Agb3JpZ2luKSDihpIgZGF0YSBjb29yZHMuXG4gICAgICAgICAgY29uc3QgcG9seXMgPSBsYWJlbHNUb1BvbHlnb25zKHNlZy5sYWJlbHMsIHNlZy53aWR0aCwgc2VnLmhlaWdodCwgY3JvcC5tYXRyaXhYMCwgY3JvcC5tYXRyaXhZMCk7XG4gICAgICAgICAgaWYgKHBvbHlzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG4gICAgICAgICAgZm9yIChjb25zdCBwb2x5IG9mIHBvbHlzKSB7XG4gICAgICAgICAgICBjb25zdCByaW5nID0gZnJhbWUucmluZ1RvRGF0YShwb2x5Lnhwb2ludHMsIHBvbHkueXBvaW50cyk7XG4gICAgICAgICAgICBjb25zdCBjb2xvciA9IHJlY3RzW2ldLmNvbG9yIHx8IGhvc3QuZ2V0U2hhcGVDb2xvcigpO1xuICAgICAgICAgICAgY2VsbHMucHVzaChtYWtlQ2VsbFJlZ2lvbihyaW5nLnhzLCByaW5nLnlzLCBmcmFtZS5ob2xlc1RvRGF0YShwb2x5LmhvbGVzKSwgY29sb3IpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3VtZWQucHVzaChyZWN0c1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ29tbWl0IGFnYWluc3QgdGhlIHJlZ2lvbnMgYXMgdGhleSBhcmUgTk9XICh0aGUgcnVuIHRha2VzIGEgd2hpbGUgYW5kXG4gICAgICAgIC8vIHRoZSB1c2VyIG1heSBoYXZlIGVkaXRlZCBtZWFud2hpbGUpOiBkcm9wIHRoZSBjb25zdW1lZCBwcm9tcHRzIGJ5IGlkLlxuICAgICAgICBob3N0LnNldFJlZ2lvbnMod2l0aG91dFJlZ2lvbnMoaG9zdC5nZXRSZWdpb25zKCksIGNvbnN1bWVkKS5jb25jYXQoY2VsbHMpKTtcbiAgICAgICAgdGhpcy5zdGF0dXMkLm5leHQoY2VsbHMubGVuZ3RoID4gMCA/IGBBZGRlZCAke2NlbGxzLmxlbmd0aH0gY2VsbCByZWdpb24ocykuYCA6ICdObyBjZWxscyBmb3VuZC4nKTtcbiAgICAgICAgcmV0dXJuIGNlbGxzLmxlbmd0aDtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLnN0YXR1cyQubmV4dChlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogJ0NlbGxwb3NlIHNlZ21lbnRhdGlvbiBmYWlsZWQuJyk7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBhZGRlZCA/PyAwO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1ha2VDZWxsUmVnaW9uKHhEYXRhOiBudW1iZXJbXSwgeURhdGE6IG51bWJlcltdLCBob2xlczogbnVtYmVyW11bXVtdIHwgdW5kZWZpbmVkLCBjb2xvcjogc3RyaW5nKTogUmVnaW9uIHtcbiAgY29uc3QgcmVnaW9uID0gbmV3IFJlZ2lvbigpO1xuICByZWdpb24uYm91bmRzID0gbWFrZVBvbHlnb24oeERhdGEsIHlEYXRhLCB7IGhvbGVzIH0pO1xuICAvLyBUaGUgc291cmNlIGJveCdzIGNvbG9yLCBlbHNlIHRoZSBob3N0IGRlZmF1bHQuXG4gIHJlZ2lvbi5jb2xvciA9IGNvbG9yO1xuICByZWdpb24ubGFiZWwgPSAnY2VsbCc7XG4gIHJldHVybiByZWdpb247XG59XG4iXX0=
@@ -20,11 +20,27 @@ export class CellposeSegmenterService {
20
20
  constructor() {
21
21
  this.instance = null;
22
22
  this.loading = null;
23
+ /** Bumped by {@link setModelUrl}, so a load of the previous URL is discarded. */
24
+ this.generation = 0;
23
25
  this.modelUrl = DEFAULT_MODEL_URL;
26
+ /** Every in-flight caller's callbacks: one shared load reports to all of them. */
27
+ this.progressListeners = new Set();
28
+ this.statusListeners = new Set();
24
29
  }
25
- /** Point the segmenter at a different hosted CPSAM ONNX (before first use). */
30
+ /**
31
+ * Point the segmenter at a different hosted CPSAM ONNX. Changing the URL after
32
+ * the model loaded (or while it loads) disposes it, so the next run loads the
33
+ * new model instead of silently keeping the old one.
34
+ */
26
35
  setModelUrl(url) {
36
+ if (url === this.modelUrl)
37
+ return;
27
38
  this.modelUrl = url;
39
+ this.generation++;
40
+ this.loading = null;
41
+ const old = this.instance;
42
+ this.instance = null;
43
+ old?.dispose().catch((err) => console.warn('Cellpose: disposing the previous model failed', err));
28
44
  }
29
45
  async segmentCells(image, progress) {
30
46
  let announcedDownload = false;
@@ -47,7 +63,8 @@ export class CellposeSegmenterService {
47
63
  }
48
64
  /**
49
65
  * The shared Cellpose instance, lazily created on first use and reused
50
- * thereafter (deduped across concurrent callers). Exposed so a host pipeline
66
+ * thereafter (deduped across concurrent callers, each of which receives the
67
+ * load's progress). A failed load is retried on the next call. Exposed so a host pipeline
51
68
  * engine can run richer `segment()` options on the same instance. `onProgress`
52
69
  * reports raw downloaded/total bytes (`total` is null when unknown); `onStatus`
53
70
  * reports worker-init phase strings.
@@ -55,21 +72,46 @@ export class CellposeSegmenterService {
55
72
  getModel(onProgress, onStatus) {
56
73
  if (this.instance)
57
74
  return Promise.resolve(this.instance);
75
+ if (onProgress)
76
+ this.progressListeners.add(onProgress);
77
+ if (onStatus)
78
+ this.statusListeners.add(onStatus);
58
79
  if (!this.loading) {
59
- this.loading = (async () => {
80
+ const generation = this.generation;
81
+ const url = this.modelUrl;
82
+ const load = (async () => {
60
83
  // Lazy: keep cellpose-js + its ORT runtime out of the initial bundle.
61
84
  const { Cellpose, configureOrt } = await import('cellpose-js');
62
85
  configureOrt({ wasmPaths: getOrtWasmBase() });
63
- const cp = await Cellpose.fromPretrained(this.modelUrl, {
86
+ const cp = await Cellpose.fromPretrained(url, {
64
87
  preload: true,
65
- onProgress: ({ loaded, total }) => onProgress?.(loaded, total),
66
- onStatus: (s) => onStatus?.(s),
88
+ onProgress: ({ loaded, total }) => this.progressListeners.forEach((l) => l(loaded, total)),
89
+ onStatus: (s) => this.statusListeners.forEach((l) => l(s)),
67
90
  });
91
+ if (generation !== this.generation) {
92
+ // The URL changed while this loaded: drop it and load the current one.
93
+ cp.dispose().catch(() => undefined);
94
+ return this.getModel();
95
+ }
68
96
  this.instance = cp;
69
97
  return cp;
70
98
  })();
99
+ this.loading = load;
100
+ // A failed load is not cached: the next call retries (a network blip or a
101
+ // WebGPU init failure must not need a page reload).
102
+ load
103
+ .catch(() => undefined)
104
+ .finally(() => {
105
+ if (this.loading === load)
106
+ this.loading = null;
107
+ });
71
108
  }
72
- return this.loading;
109
+ return this.loading.finally(() => {
110
+ if (onProgress)
111
+ this.progressListeners.delete(onProgress);
112
+ if (onStatus)
113
+ this.statusListeners.delete(onStatus);
114
+ });
73
115
  }
74
116
  /** Whether the shared model is already loaded (warm). */
75
117
  isLoaded() {
@@ -82,4 +124,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
82
124
  type: Injectable,
83
125
  args: [{ providedIn: 'root' }]
84
126
  }] });
85
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VsbHBvc2Utc2VnbWVudGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rvb2xiYXIvc2VnbWVudGF0aW9uL2NlbGxwb3NlLXNlZ21lbnRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDOztBQUt0RCxnRkFBZ0Y7QUFDaEYsTUFBTSxpQkFBaUIsR0FDckIsdUZBQXVGLENBQUM7QUFFMUY7Ozs7Ozs7Ozs7OztHQVlHO0FBRUgsTUFBTSxPQUFPLHdCQUF3QjtJQURyQztRQUVVLGFBQVEsR0FBb0IsSUFBSSxDQUFDO1FBQ2pDLFlBQU8sR0FBNkIsSUFBSSxDQUFDO1FBQ3pDLGFBQVEsR0FBRyxpQkFBaUIsQ0FBQztLQXNFdEM7SUFwRUMsK0VBQStFO0lBQy9FLFdBQVcsQ0FBQyxHQUFXO1FBQ3JCLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxLQUFLLENBQUMsWUFBWSxDQUNoQixLQUFpRSxFQUNqRSxRQUE4QjtRQUU5QixJQUFJLGlCQUFpQixHQUFHLEtBQUssQ0FBQztRQUM5QixNQUFNLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQzVCLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ2hCLElBQUksS0FBSztnQkFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDO1lBQ2xELElBQUksTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQ3JDLGlCQUFpQixHQUFHLElBQUksQ0FBQztnQkFDekIsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDLGlDQUFpQyxDQUFDLENBQUM7WUFDMUQsQ0FBQztRQUNILENBQUMsRUFDRCxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUN6QyxDQUFDO1FBQ0YsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDN0MsTUFBTSxHQUFHLEdBQUcsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUMxQixFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFDM0U7WUFDRSwwRUFBMEU7WUFDMUUseUVBQXlFO1lBQ3pFLDBDQUEwQztZQUMxQyxjQUFjLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQ25ELElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLDJCQUEyQixJQUFJLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLDBCQUEwQixDQUN6RjtTQUNGLENBQ0YsQ0FBQztRQUNGLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3ZGLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxRQUFRLENBQ04sVUFBMkQsRUFDM0QsUUFBbUM7UUFFbkMsSUFBSSxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUU7Z0JBQ3pCLHNFQUFzRTtnQkFDdEUsTUFBTSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDL0QsWUFBWSxDQUFDLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDOUMsTUFBTSxFQUFFLEdBQUcsTUFBTSxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7b0JBQ3RELE9BQU8sRUFBRSxJQUFJO29CQUNiLFVBQVUsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDO29CQUM5RCxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDL0IsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO2dCQUNuQixPQUFPLEVBQUUsQ0FBQztZQUNaLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRCx5REFBeUQ7SUFDekQsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUM7SUFDaEMsQ0FBQzs4R0F4RVUsd0JBQXdCO2tIQUF4Qix3QkFBd0IsY0FEWCxNQUFNOzsyRkFDbkIsd0JBQXdCO2tCQURwQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGdldE9ydFdhc21CYXNlIH0gZnJvbSAnLi9vcnQtcnVudGltZS1jb25maWcnO1xuXG5pbXBvcnQgdHlwZSB7IElDZWxsU2VnbWVudGVyLCBDZWxsU2VnbWVudGF0aW9uLCBDZWxsU2VnbWVudFByb2dyZXNzIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NlbGwtc2VnbWVudGVyLmNvbnRyYWN0JztcbmltcG9ydCB0eXBlIHsgQ2VsbHBvc2UgfSBmcm9tICdjZWxscG9zZS1qcyc7XG5cbi8qKiBIb3N0ZWQgY2VsbHBvc2UtU0FNIE9OTlggKENQU0FNLCBmcDE2KS4gT3ZlcnJpZGUgdmlhIHtAbGluayBzZXRNb2RlbFVybH0uICovXG5jb25zdCBERUZBVUxUX01PREVMX1VSTCA9XG4gICdodHRwczovL2h1Z2dpbmdmYWNlLmNvL2pheC1pbWFnZS10b29scy9jZWxscG9zZS1zYW0tb25ueC9yZXNvbHZlL21haW4vY3BzYW1fZnAxNi5vbm54JztcblxuLyoqXG4gKiBEZWZhdWx0IGluLWxpYnJhcnkge0BsaW5rIElDZWxsU2VnbWVudGVyfSBiYWNrZWQgYnkgY2VsbHBvc2UtanMgKFdlYkdQVS9XQVNNXG4gKiBPTk5YKSDigJQgc28gdGhlIHRvb2xiYXIncyBhdXRvbWF0aWMgKipDZWxscG9zZSoqIHRvb2wgd29ya3Mgb3V0IG9mIHRoZSBib3ggaW5cbiAqIGFueSBhcHAsIHdpdGggbm8gaG9zdCB3aXJpbmcgKGppdC11aSM5MCkuIGBjZWxscG9zZS1qc2AgaXMgYSByZWd1bGFyXG4gKiBkZXBlbmRlbmN5IOKAlCBpbnN0YWxsZWQgYXV0b21hdGljYWxseSwgbGlrZSBgbmFwYXJpLWpzYCDigJQgYnV0IGl0IGlzXG4gKiAqKmxhenktaW1wb3J0ZWQqKiBvbiBmaXJzdCB1c2UsIHNvIGFwcHMgdGhhdCBuZXZlciBydW4gQ2VsbHBvc2UgcGF5IG5vdGhpbmdcbiAqIGZvciBpdCBpbiB0aGUgYnVuZGxlLiBBIGhvc3QgY2FuIHN0aWxsIG92ZXJyaWRlIHRoZSB7QGxpbmsgQ0VMTF9TRUdNRU5URVJ9XG4gKiB0b2tlbiB0byBzdXBwbHkgYSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24uXG4gKlxuICogT3ducyBhIHNpbmdsZSBzaGFyZWQge0BsaW5rIENlbGxwb3NlfSBpbnN0YW5jZSAob25lIG1vZGVsIGxvYWQsIG9uZSBXZWJHUFVcbiAqIHNlc3Npb24sIG9uZSB3b3JrZXIpLiB7QGxpbmsgZ2V0TW9kZWx9IGV4cG9zZXMgdGhhdCBpbnN0YW5jZSBzbyBhIGhvc3Qnc1xuICogcHJvY2Vzc2luZyBwaXBlbGluZSBjYW4gcmV1c2UgaXQgaW5zdGVhZCBvZiBsb2FkaW5nIHRoZSB+NTg4IE1CIG1vZGVsIHR3aWNlLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIENlbGxwb3NlU2VnbWVudGVyU2VydmljZSBpbXBsZW1lbnRzIElDZWxsU2VnbWVudGVyIHtcbiAgcHJpdmF0ZSBpbnN0YW5jZTogQ2VsbHBvc2UgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsb2FkaW5nOiBQcm9taXNlPENlbGxwb3NlPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG1vZGVsVXJsID0gREVGQVVMVF9NT0RFTF9VUkw7XG5cbiAgLyoqIFBvaW50IHRoZSBzZWdtZW50ZXIgYXQgYSBkaWZmZXJlbnQgaG9zdGVkIENQU0FNIE9OTlggKGJlZm9yZSBmaXJzdCB1c2UpLiAqL1xuICBzZXRNb2RlbFVybCh1cmw6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubW9kZWxVcmwgPSB1cmw7XG4gIH1cblxuICBhc3luYyBzZWdtZW50Q2VsbHMoXG4gICAgaW1hZ2U6IHsgZGF0YTogVWludDhDbGFtcGVkQXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0sXG4gICAgcHJvZ3Jlc3M/OiBDZWxsU2VnbWVudFByb2dyZXNzLFxuICApOiBQcm9taXNlPENlbGxTZWdtZW50YXRpb24+IHtcbiAgICBsZXQgYW5ub3VuY2VkRG93bmxvYWQgPSBmYWxzZTtcbiAgICBjb25zdCBjcCA9IGF3YWl0IHRoaXMuZ2V0TW9kZWwoXG4gICAgICAobG9hZGVkLCB0b3RhbCkgPT4ge1xuICAgICAgICBpZiAodG90YWwpIHByb2dyZXNzPy5vblByb2dyZXNzPy4obG9hZGVkIC8gdG90YWwpO1xuICAgICAgICBpZiAobG9hZGVkID4gMCAmJiAhYW5ub3VuY2VkRG93bmxvYWQpIHtcbiAgICAgICAgICBhbm5vdW5jZWREb3dubG9hZCA9IHRydWU7XG4gICAgICAgICAgcHJvZ3Jlc3M/Lm9uU3RhdHVzPy4oJ0Rvd25sb2FkaW5nIENlbGxwb3NlLVNBTSBtb2RlbOKApicpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgKHN0YXR1cykgPT4gcHJvZ3Jlc3M/Lm9uU3RhdHVzPy4oc3RhdHVzKSxcbiAgICApO1xuICAgIHByb2dyZXNzPy5vblN0YXR1cz8uKCdQcmVwcm9jZXNzaW5nIGltYWdl4oCmJyk7XG4gICAgY29uc3Qgb3V0ID0gYXdhaXQgY3Auc2VnbWVudChcbiAgICAgIHsgZGF0YTogaW1hZ2UuZGF0YSwgd2lkdGg6IGltYWdlLndpZHRoLCBoZWlnaHQ6IGltYWdlLmhlaWdodCwgY2hhbm5lbHM6IDQgfSxcbiAgICAgIHtcbiAgICAgICAgLy8gY2VsbHBvc2UtanMgcnVucyBpbmZlcmVuY2UgaW4gaXRzIHdvcmtlciAodGhlc2UgZmlyZSBiZXR3ZWVuIHRpbGVzKSBhbmRcbiAgICAgICAgLy8gYXZlcmFnaW5nL2R5bmFtaWNzIG9uIHRoZSBtYWluIHRocmVhZDsgc3VyZmFjZSBib3RoIHNvIHRoZSB0b2FzdCBzaG93c1xuICAgICAgICAvLyByZWFsIHByb2dyZXNzIGluc3RlYWQgb2YgbG9va2luZyBzdHVjay5cbiAgICAgICAgb25UaWxlUHJvZ3Jlc3M6IChkb25lLCB0b3RhbCkgPT4gcHJvZ3Jlc3M/Lm9uU3RhdHVzPy4oXG4gICAgICAgICAgZG9uZSA8IHRvdGFsID8gYFJ1bm5pbmcgaW5mZXJlbmNlICh0aWxlICR7ZG9uZX0vJHt0b3RhbH0p4oCmYCA6ICdDb21wdXRpbmcgZmxvdyBkeW5hbWljc+KApicsXG4gICAgICAgICksXG4gICAgICB9LFxuICAgICk7XG4gICAgcmV0dXJuIHsgbGFiZWxzOiBvdXQubWFza3MsIHdpZHRoOiBvdXQud2lkdGgsIGhlaWdodDogb3V0LmhlaWdodCwgY291bnQ6IG91dC5jb3VudCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzaGFyZWQgQ2VsbHBvc2UgaW5zdGFuY2UsIGxhemlseSBjcmVhdGVkIG9uIGZpcnN0IHVzZSBhbmQgcmV1c2VkXG4gICAqIHRoZXJlYWZ0ZXIgKGRlZHVwZWQgYWNyb3NzIGNvbmN1cnJlbnQgY2FsbGVycykuIEV4cG9zZWQgc28gYSBob3N0IHBpcGVsaW5lXG4gICAqIGVuZ2luZSBjYW4gcnVuIHJpY2hlciBgc2VnbWVudCgpYCBvcHRpb25zIG9uIHRoZSBzYW1lIGluc3RhbmNlLiBgb25Qcm9ncmVzc2BcbiAgICogcmVwb3J0cyByYXcgZG93bmxvYWRlZC90b3RhbCBieXRlcyAoYHRvdGFsYCBpcyBudWxsIHdoZW4gdW5rbm93bik7IGBvblN0YXR1c2BcbiAgICogcmVwb3J0cyB3b3JrZXItaW5pdCBwaGFzZSBzdHJpbmdzLlxuICAgKi9cbiAgZ2V0TW9kZWwoXG4gICAgb25Qcm9ncmVzcz86IChsb2FkZWQ6IG51bWJlciwgdG90YWw6IG51bWJlciB8IG51bGwpID0+IHZvaWQsXG4gICAgb25TdGF0dXM/OiAoc3RhdHVzOiBzdHJpbmcpID0+IHZvaWQsXG4gICk6IFByb21pc2U8Q2VsbHBvc2U+IHtcbiAgICBpZiAodGhpcy5pbnN0YW5jZSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmluc3RhbmNlKTtcbiAgICBpZiAoIXRoaXMubG9hZGluZykge1xuICAgICAgdGhpcy5sb2FkaW5nID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gTGF6eToga2VlcCBjZWxscG9zZS1qcyArIGl0cyBPUlQgcnVudGltZSBvdXQgb2YgdGhlIGluaXRpYWwgYnVuZGxlLlxuICAgICAgICBjb25zdCB7IENlbGxwb3NlLCBjb25maWd1cmVPcnQgfSA9IGF3YWl0IGltcG9ydCgnY2VsbHBvc2UtanMnKTtcbiAgICAgICAgY29uZmlndXJlT3J0KHsgd2FzbVBhdGhzOiBnZXRPcnRXYXNtQmFzZSgpIH0pO1xuICAgICAgICBjb25zdCBjcCA9IGF3YWl0IENlbGxwb3NlLmZyb21QcmV0cmFpbmVkKHRoaXMubW9kZWxVcmwsIHtcbiAgICAgICAgICBwcmVsb2FkOiB0cnVlLFxuICAgICAgICAgIG9uUHJvZ3Jlc3M6ICh7IGxvYWRlZCwgdG90YWwgfSkgPT4gb25Qcm9ncmVzcz8uKGxvYWRlZCwgdG90YWwpLFxuICAgICAgICAgIG9uU3RhdHVzOiAocykgPT4gb25TdGF0dXM/LihzKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaW5zdGFuY2UgPSBjcDtcbiAgICAgICAgcmV0dXJuIGNwO1xuICAgICAgfSkoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubG9hZGluZztcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZSBzaGFyZWQgbW9kZWwgaXMgYWxyZWFkeSBsb2FkZWQgKHdhcm0pLiAqL1xuICBpc0xvYWRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW5jZSAhPT0gbnVsbDtcbiAgfVxufVxuIl19
127
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VsbHBvc2Utc2VnbWVudGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rvb2xiYXIvc2VnbWVudGF0aW9uL2NlbGxwb3NlLXNlZ21lbnRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDOztBQVN0RCxnRkFBZ0Y7QUFDaEYsTUFBTSxpQkFBaUIsR0FBRyx1RkFBdUYsQ0FBQztBQUVsSDs7Ozs7Ozs7Ozs7O0dBWUc7QUFFSCxNQUFNLE9BQU8sd0JBQXdCO0lBRHJDO1FBRVUsYUFBUSxHQUFvQixJQUFJLENBQUM7UUFDakMsWUFBTyxHQUE2QixJQUFJLENBQUM7UUFDakQsaUZBQWlGO1FBQ3pFLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFDZixhQUFRLEdBQUcsaUJBQWlCLENBQUM7UUFDckMsa0ZBQWtGO1FBQ2pFLHNCQUFpQixHQUFHLElBQUksR0FBRyxFQUFrRCxDQUFDO1FBQzlFLG9CQUFlLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7S0FzR3hFO0lBcEdDOzs7O09BSUc7SUFDSCxXQUFXLENBQUMsR0FBVztRQUNyQixJQUFJLEdBQUcsS0FBSyxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU87UUFDbEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUM7UUFDcEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDMUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENB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QyxlQUFlLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELHlEQUF5RDtJQUN6RCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQztJQUNoQyxDQUFDOzhHQTdHVSx3QkFBd0I7a0hBQXhCLHdCQUF3QixjQURYLE1BQU07OzJGQUNuQix3QkFBd0I7a0JBRHBDLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZ2V0T3J0V2FzbUJhc2UgfSBmcm9tICcuL29ydC1ydW50aW1lLWNvbmZpZyc7XG5cbmltcG9ydCB0eXBlIHtcbiAgSUNlbGxTZWdtZW50ZXIsXG4gIENlbGxTZWdtZW50YXRpb24sXG4gIENlbGxTZWdtZW50UHJvZ3Jlc3MsXG59IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jZWxsLXNlZ21lbnRlci5jb250cmFjdCc7XG5pbXBvcnQgdHlwZSB7IENlbGxwb3NlIH0gZnJvbSAnY2VsbHBvc2UtanMnO1xuXG4vKiogSG9zdGVkIGNlbGxwb3NlLVNBTSBPTk5YIChDUFNBTSwgZnAxNikuIE92ZXJyaWRlIHZpYSB7QGxpbmsgc2V0TW9kZWxVcmx9LiAqL1xuY29uc3QgREVGQVVMVF9NT0RFTF9VUkwgPSAnaHR0cHM6Ly9odWdnaW5nZmFjZS5jby9qYXgtaW1hZ2UtdG9vbHMvY2VsbHBvc2Utc2FtLW9ubngvcmVzb2x2ZS9tYWluL2Nwc2FtX2ZwMTYub25ueCc7XG5cbi8qKlxuICogRGVmYXVsdCBpbi1saWJyYXJ5IHtAbGluayBJQ2VsbFNlZ21lbnRlcn0gYmFja2VkIGJ5IGNlbGxwb3NlLWpzIChXZWJHUFUvV0FTTVxuICogT05OWCkg4oCUIHNvIHRoZSB0b29sYmFyJ3MgYXV0b21hdGljICoqQ2VsbHBvc2UqKiB0b29sIHdvcmtzIG91dCBvZiB0aGUgYm94IGluXG4gKiBhbnkgYXBwLCB3aXRoIG5vIGhvc3Qgd2lyaW5nIChqaXQtdWkjOTApLiBgY2VsbHBvc2UtanNgIGlzIGEgcmVndWxhclxuICogZGVwZW5kZW5jeSDigJQgaW5zdGFsbGVkIGF1dG9tYXRpY2FsbHksIGxpa2UgYG5hcGFyaS1qc2Ag4oCUIGJ1dCBpdCBpc1xuICogKipsYXp5LWltcG9ydGVkKiogb24gZmlyc3QgdXNlLCBzbyBhcHBzIHRoYXQgbmV2ZXIgcnVuIENlbGxwb3NlIHBheSBub3RoaW5nXG4gKiBmb3IgaXQgaW4gdGhlIGJ1bmRsZS4gQSBob3N0IGNhbiBzdGlsbCBvdmVycmlkZSB0aGUge0BsaW5rIENFTExfU0VHTUVOVEVSfVxuICogdG9rZW4gdG8gc3VwcGx5IGEgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uLlxuICpcbiAqIE93bnMgYSBzaW5nbGUgc2hhcmVkIHtAbGluayBDZWxscG9zZX0gaW5zdGFuY2UgKG9uZSBtb2RlbCBsb2FkLCBvbmUgV2ViR1BVXG4gKiBzZXNzaW9uLCBvbmUgd29ya2VyKS4ge0BsaW5rIGdldE1vZGVsfSBleHBvc2VzIHRoYXQgaW5zdGFuY2Ugc28gYSBob3N0J3NcbiAqIHByb2Nlc3NpbmcgcGlwZWxpbmUgY2FuIHJldXNlIGl0IGluc3RlYWQgb2YgbG9hZGluZyB0aGUgfjU4OCBNQiBtb2RlbCB0d2ljZS5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBDZWxscG9zZVNlZ21lbnRlclNlcnZpY2UgaW1wbGVtZW50cyBJQ2VsbFNlZ21lbnRlciB7XG4gIHByaXZhdGUgaW5zdGFuY2U6IENlbGxwb3NlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbG9hZGluZzogUHJvbWlzZTxDZWxscG9zZT4gfCBudWxsID0gbnVsbDtcbiAgLyoqIEJ1bXBlZCBieSB7QGxpbmsgc2V0TW9kZWxVcmx9LCBzbyBhIGxvYWQgb2YgdGhlIHByZXZpb3VzIFVSTCBpcyBkaXNjYXJkZWQuICovXG4gIHByaXZhdGUgZ2VuZXJhdGlvbiA9IDA7XG4gIHByaXZhdGUgbW9kZWxVcmwgPSBERUZBVUxUX01PREVMX1VSTDtcbiAgLyoqIEV2ZXJ5IGluLWZsaWdodCBjYWxsZXIncyBjYWxsYmFja3M6IG9uZSBzaGFyZWQgbG9hZCByZXBvcnRzIHRvIGFsbCBvZiB0aGVtLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHByb2dyZXNzTGlzdGVuZXJzID0gbmV3IFNldDwobG9hZGVkOiBudW1iZXIsIHRvdGFsOiBudW1iZXIgfCBudWxsKSA9PiB2b2lkPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YXR1c0xpc3RlbmVycyA9IG5ldyBTZXQ8KHN0YXR1czogc3RyaW5nKSA9PiB2b2lkPigpO1xuXG4gIC8qKlxuICAgKiBQb2ludCB0aGUgc2VnbWVudGVyIGF0IGEgZGlmZmVyZW50IGhvc3RlZCBDUFNBTSBPTk5YLiBDaGFuZ2luZyB0aGUgVVJMIGFmdGVyXG4gICAqIHRoZSBtb2RlbCBsb2FkZWQgKG9yIHdoaWxlIGl0IGxvYWRzKSBkaXNwb3NlcyBpdCwgc28gdGhlIG5leHQgcnVuIGxvYWRzIHRoZVxuICAgKiBuZXcgbW9kZWwgaW5zdGVhZCBvZiBzaWxlbnRseSBrZWVwaW5nIHRoZSBvbGQgb25lLlxuICAgKi9cbiAgc2V0TW9kZWxVcmwodXJsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodXJsID09PSB0aGlzLm1vZGVsVXJsKSByZXR1cm47XG4gICAgdGhpcy5tb2RlbFVybCA9IHVybDtcbiAgICB0aGlzLmdlbmVyYXRpb24rKztcbiAgICB0aGlzLmxvYWRpbmcgPSBudWxsO1xuICAgIGNvbnN0IG9sZCA9IHRoaXMuaW5zdGFuY2U7XG4gICAgdGhpcy5pbnN0YW5jZSA9IG51bGw7XG4gICAgb2xkPy5kaXNwb3NlKCkuY2F0Y2goKGVycikgPT4gY29uc29sZS53YXJuKCdDZWxscG9zZTogZGlzcG9zaW5nIHRoZSBwcmV2aW91cyBtb2RlbCBmYWlsZWQnLCBlcnIpKTtcbiAgfVxuXG4gIGFzeW5jIHNlZ21lbnRDZWxscyhcbiAgICBpbWFnZTogeyBkYXRhOiBVaW50OENsYW1wZWRBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSxcbiAgICBwcm9ncmVzcz86IENlbGxTZWdtZW50UHJvZ3Jlc3MsXG4gICk6IFByb21pc2U8Q2VsbFNlZ21lbnRhdGlvbj4ge1xuICAgIGxldCBhbm5vdW5jZWREb3dubG9hZCA9IGZhbHNlO1xuICAgIGNvbnN0IGNwID0gYXdhaXQgdGhpcy5nZXRNb2RlbChcbiAgICAgIChsb2FkZWQsIHRvdGFsKSA9PiB7XG4gICAgICAgIGlmICh0b3RhbCkgcHJvZ3Jlc3M/Lm9uUHJvZ3Jlc3M/Lihsb2FkZWQgLyB0b3RhbCk7XG4gICAgICAgIGlmIChsb2FkZWQgPiAwICYmICFhbm5vdW5jZWREb3dubG9hZCkge1xuICAgICAgICAgIGFubm91bmNlZERvd25sb2FkID0gdHJ1ZTtcbiAgICAgICAgICBwcm9ncmVzcz8ub25TdGF0dXM/LignRG93bmxvYWRpbmcgQ2VsbHBvc2UtU0FNIG1vZGVs4oCmJyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAoc3RhdHVzKSA9PiBwcm9ncmVzcz8ub25TdGF0dXM/LihzdGF0dXMpLFxuICAgICk7XG4gICAgcHJvZ3Jlc3M/Lm9uU3RhdHVzPy4oJ1ByZXByb2Nlc3NpbmcgaW1hZ2XigKYnKTtcbiAgICBjb25zdCBvdXQgPSBhd2FpdCBjcC5zZWdtZW50KFxuICAgICAgeyBkYXRhOiBpbWFnZS5kYXRhLCB3aWR0aDogaW1hZ2Uud2lkdGgsIGhlaWdodDogaW1hZ2UuaGVpZ2h0LCBjaGFubmVsczogNCB9LFxuICAgICAge1xuICAgICAgICAvLyBjZWxscG9zZS1qcyBydW5zIGluZmVyZW5jZSBpbiBpdHMgd29ya2VyICh0aGVzZSBmaXJlIGJldHdlZW4gdGlsZXMpIGFuZFxuICAgICAgICAvLyBhdmVyYWdpbmcvZHluYW1pY3Mgb24gdGhlIG1haW4gdGhyZWFkOyBzdXJmYWNlIGJvdGggc28gdGhlIHRvYXN0IHNob3dzXG4gICAgICAgIC8vIHJlYWwgcHJvZ3Jlc3MgaW5zdGVhZCBvZiBsb29raW5nIHN0dWNrLlxuICAgICAgICBvblRpbGVQcm9ncmVzczogKGRvbmUsIHRvdGFsKSA9PlxuICAgICAgICAgIHByb2dyZXNzPy5vblN0YXR1cz8uKFxuICAgICAgICAgICAgZG9uZSA8IHRvdGFsID8gYFJ1bm5pbmcgaW5mZXJlbmNlICh0aWxlICR7ZG9uZX0vJHt0b3RhbH0p4oCmYCA6ICdDb21wdXRpbmcgZmxvdyBkeW5hbWljc+KApicsXG4gICAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4geyBsYWJlbHM6IG91dC5tYXNrcywgd2lkdGg6IG91dC53aWR0aCwgaGVpZ2h0OiBvdXQuaGVpZ2h0LCBjb3VudDogb3V0LmNvdW50IH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNoYXJlZCBDZWxscG9zZSBpbnN0YW5jZSwgbGF6aWx5IGNyZWF0ZWQgb24gZmlyc3QgdXNlIGFuZCByZXVzZWRcbiAgICogdGhlcmVhZnRlciAoZGVkdXBlZCBhY3Jvc3MgY29uY3VycmVudCBjYWxsZXJzLCBlYWNoIG9mIHdoaWNoIHJlY2VpdmVzIHRoZVxuICAgKiBsb2FkJ3MgcHJvZ3Jlc3MpLiBBIGZhaWxlZCBsb2FkIGlzIHJldHJpZWQgb24gdGhlIG5leHQgY2FsbC4gRXhwb3NlZCBzbyBhIGhvc3QgcGlwZWxpbmVcbiAgICogZW5naW5lIGNhbiBydW4gcmljaGVyIGBzZWdtZW50KClgIG9wdGlvbnMgb24gdGhlIHNhbWUgaW5zdGFuY2UuIGBvblByb2dyZXNzYFxuICAgKiByZXBvcnRzIHJhdyBkb3dubG9hZGVkL3RvdGFsIGJ5dGVzIChgdG90YWxgIGlzIG51bGwgd2hlbiB1bmtub3duKTsgYG9uU3RhdHVzYFxuICAgKiByZXBvcnRzIHdvcmtlci1pbml0IHBoYXNlIHN0cmluZ3MuXG4gICAqL1xuICBnZXRNb2RlbChcbiAgICBvblByb2dyZXNzPzogKGxvYWRlZDogbnVtYmVyLCB0b3RhbDogbnVtYmVyIHwgbnVsbCkgPT4gdm9pZCxcbiAgICBvblN0YXR1cz86IChzdGF0dXM6IHN0cmluZykgPT4gdm9pZCxcbiAgKTogUHJvbWlzZTxDZWxscG9zZT4ge1xuICAgIGlmICh0aGlzLmluc3RhbmNlKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuaW5zdGFuY2UpO1xuICAgIGlmIChvblByb2dyZXNzKSB0aGlzLnByb2dyZXNzTGlzdGVuZXJzLmFkZChvblByb2dyZXNzKTtcbiAgICBpZiAob25TdGF0dXMpIHRoaXMuc3RhdHVzTGlzdGVuZXJzLmFkZChvblN0YXR1cyk7XG4gICAgaWYgKCF0aGlzLmxvYWRpbmcpIHtcbiAgICAgIGNvbnN0IGdlbmVyYXRpb24gPSB0aGlzLmdlbmVyYXRpb247XG4gICAgICBjb25zdCB1cmwgPSB0aGlzLm1vZGVsVXJsO1xuICAgICAgY29uc3QgbG9hZCA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIExhenk6IGtlZXAgY2VsbHBvc2UtanMgKyBpdHMgT1JUIHJ1bnRpbWUgb3V0IG9mIHRoZSBpbml0aWFsIGJ1bmRsZS5cbiAgICAgICAgY29uc3QgeyBDZWxscG9zZSwgY29uZmlndXJlT3J0IH0gPSBhd2FpdCBpbXBvcnQoJ2NlbGxwb3NlLWpzJyk7XG4gICAgICAgIGNvbmZpZ3VyZU9ydCh7IHdhc21QYXRoczogZ2V0T3J0V2FzbUJhc2UoKSB9KTtcbiAgICAgICAgY29uc3QgY3AgPSBhd2FpdCBDZWxscG9zZS5mcm9tUHJldHJhaW5lZCh1cmwsIHtcbiAgICAgICAgICBwcmVsb2FkOiB0cnVlLFxuICAgICAgICAgIG9uUHJvZ3Jlc3M6ICh7IGxvYWRlZCwgdG90YWwgfSkgPT4gdGhpcy5wcm9ncmVzc0xpc3RlbmVycy5mb3JFYWNoKChsKSA9PiBsKGxvYWRlZCwgdG90YWwpKSxcbiAgICAgICAgICBvblN0YXR1czogKHMpID0+IHRoaXMuc3RhdHVzTGlzdGVuZXJzLmZvckVhY2goKGwpID0+IGwocykpLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGdlbmVyYXRpb24gIT09IHRoaXMuZ2VuZXJhdGlvbikge1xuICAgICAgICAgIC8vIFRoZSBVUkwgY2hhbmdlZCB3aGlsZSB0aGlzIGxvYWRlZDogZHJvcCBpdCBhbmQgbG9hZCB0aGUgY3VycmVudCBvbmUuXG4gICAgICAgICAgY3AuZGlzcG9zZSgpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TW9kZWwoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluc3RhbmNlID0gY3A7XG4gICAgICAgIHJldHVybiBjcDtcbiAgICAgIH0pKCk7XG4gICAgICB0aGlzLmxvYWRpbmcgPSBsb2FkO1xuICAgICAgLy8gQSBmYWlsZWQgbG9hZCBpcyBub3QgY2FjaGVkOiB0aGUgbmV4dCBjYWxsIHJldHJpZXMgKGEgbmV0d29yayBibGlwIG9yIGFcbiAgICAgIC8vIFdlYkdQVSBpbml0IGZhaWx1cmUgbXVzdCBub3QgbmVlZCBhIHBhZ2UgcmVsb2FkKS5cbiAgICAgIGxvYWRcbiAgICAgICAgLmNhdGNoKCgpID0+IHVuZGVmaW5lZClcbiAgICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmxvYWRpbmcgPT09IGxvYWQpIHRoaXMubG9hZGluZyA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgaWYgKG9uUHJvZ3Jlc3MpIHRoaXMucHJvZ3Jlc3NMaXN0ZW5lcnMuZGVsZXRlKG9uUHJvZ3Jlc3MpO1xuICAgICAgaWYgKG9uU3RhdHVzKSB0aGlzLnN0YXR1c0xpc3RlbmVycy5kZWxldGUob25TdGF0dXMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHNoYXJlZCBtb2RlbCBpcyBhbHJlYWR5IGxvYWRlZCAod2FybSkuICovXG4gIGlzTG9hZGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmluc3RhbmNlICE9PSBudWxsO1xuICB9XG59XG4iXX0=