@jax-data-science/sci-image-visualizer 0.8.3 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (579) hide show
  1. package/README.md +201 -460
  2. package/esm2022/index.mjs +34 -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/image.contract.mjs +1 -1
  12. package/esm2022/lib/contracts/instance-segmenter.contract.mjs +1 -1
  13. package/esm2022/lib/contracts/intensity.mjs +48 -5
  14. package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
  15. package/esm2022/lib/contracts/plot-type.mjs +134 -17
  16. package/esm2022/lib/contracts/ports/image-state.port.mjs +4 -1
  17. package/esm2022/lib/contracts/ports/preferences.port.mjs +5 -1
  18. package/esm2022/lib/contracts/ports/region-io.port.mjs +2 -1
  19. package/esm2022/lib/contracts/ports/spatial-data.port.mjs +5 -1
  20. package/esm2022/lib/contracts/ports/tile-access.port.mjs +2 -1
  21. package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
  22. package/esm2022/lib/contracts/region-overlay.contract.mjs +1 -1
  23. package/esm2022/lib/contracts/region-store.contract.mjs +1 -1
  24. package/esm2022/lib/contracts/sam.contract.mjs +1 -1
  25. package/esm2022/lib/contracts/section-view.contract.mjs +2 -0
  26. package/esm2022/lib/contracts/semantic-segmenter.contract.mjs +1 -1
  27. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +3 -1
  28. package/esm2022/lib/contracts/toolbar-tool.contract.mjs +6 -4
  29. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  30. package/esm2022/lib/contracts/viz-config.mjs +2 -1
  31. package/esm2022/lib/geometry/contour.mjs +63 -0
  32. package/esm2022/lib/geometry/loft.mjs +128 -0
  33. package/esm2022/lib/geometry/polylabel.mjs +156 -0
  34. package/esm2022/lib/geometry/raster.mjs +98 -0
  35. package/esm2022/lib/geometry/reconstruct.mjs +315 -0
  36. package/esm2022/lib/geometry/reslice-image.mjs +57 -0
  37. package/esm2022/lib/geometry/ring.mjs +201 -0
  38. package/esm2022/lib/geometry/section.mjs +215 -0
  39. package/esm2022/lib/hex-color-picker/hex-color-picker.component.mjs +202 -102
  40. package/esm2022/lib/implementations/base-store-visualizer.mjs +201 -48
  41. package/esm2022/lib/implementations/napari-js/napari-axes-gizmo.mjs +65 -0
  42. package/esm2022/lib/implementations/napari-js/napari-display-state.mjs +136 -0
  43. package/esm2022/lib/implementations/napari-js/napari-helpers.mjs +199 -0
  44. package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +602 -0
  45. package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +12 -9
  46. package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +83 -0
  47. package/esm2022/lib/implementations/napari-js/napari-region-mesh-pointer.mjs +100 -0
  48. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +180 -591
  49. package/esm2022/lib/implementations/napari-js/napari-scene.mjs +2 -0
  50. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +614 -0
  51. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +769 -0
  52. package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +199 -0
  53. package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +270 -0
  54. package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +159 -0
  55. package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +106 -1408
  56. package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +2 -2
  57. package/esm2022/lib/implementations/napari-js/napari-surface-scene.mjs +271 -0
  58. package/esm2022/lib/implementations/napari-js/napari-tile-client.mjs +562 -0
  59. package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +347 -0
  60. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +427 -4207
  61. package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +129 -0
  62. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +550 -0
  63. package/esm2022/lib/implementations/napari-js/napari-volume-slice-planes.mjs +103 -0
  64. package/esm2022/lib/implementations/napari-js/napari-volume-z-handle.mjs +6 -6
  65. package/esm2022/lib/implementations/napari-js/region-overlay/overlay-projection.mjs +96 -0
  66. package/esm2022/lib/implementations/napari-js/region-overlay/region-edit.mjs +35 -0
  67. package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +194 -0
  68. package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +30 -0
  69. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +274 -0
  70. package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +144 -0
  71. package/esm2022/lib/implementations/napari-js/spatial-tiles/layer-groups.mjs +165 -0
  72. package/esm2022/lib/implementations/napari-js/spatial-tiles/plan-context.mjs +78 -0
  73. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +182 -0
  74. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +369 -0
  75. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +306 -0
  76. package/esm2022/lib/implementations/osd/display-pipeline.mjs +102 -40
  77. package/esm2022/lib/implementations/osd/histogram-sampler.mjs +56 -31
  78. package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +128 -0
  79. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +333 -1685
  80. package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +1 -1
  81. package/esm2022/lib/implementations/osd/osd-coords.mjs +5 -6
  82. package/esm2022/lib/implementations/osd/osd-export.mjs +122 -0
  83. package/esm2022/lib/implementations/osd/osd-lib.mjs +15 -1
  84. package/esm2022/lib/implementations/osd/osd-navigator-chrome.mjs +205 -0
  85. package/esm2022/lib/implementations/osd/osd-pixel-readback.mjs +68 -0
  86. package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +164 -0
  87. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +213 -716
  88. package/esm2022/lib/implementations/osd/osd-scale-bar.mjs +52 -60
  89. package/esm2022/lib/implementations/osd/osd-tile-source.mjs +105 -0
  90. package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +2 -0
  91. package/esm2022/lib/implementations/osd/osd-viewer-mount.mjs +44 -0
  92. package/esm2022/lib/implementations/osd/osd-viewport.mjs +184 -0
  93. package/esm2022/lib/implementations/osd/osd-zoom.mjs +7 -1
  94. package/esm2022/lib/implementations/osd/simple-source.mjs +395 -0
  95. package/esm2022/lib/implementations/osd/slice-cache.mjs +53 -48
  96. package/esm2022/lib/implementations/osd/tile-client.mjs +32 -11
  97. package/esm2022/lib/implementations/osd/tile-recolor.mjs +330 -0
  98. package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +161 -73
  99. package/esm2022/lib/implementations/plotly/plotly-coordinate-transform.mjs +1 -1
  100. package/esm2022/lib/implementations/plotly/plotly-image-loader.mjs +112 -0
  101. package/esm2022/lib/implementations/plotly/plotly-image-recolor.mjs +178 -0
  102. package/esm2022/lib/implementations/plotly/plotly-intensity-inset.mjs +33 -0
  103. package/esm2022/lib/implementations/plotly/plotly-isosurface-controls.mjs +83 -0
  104. package/esm2022/lib/implementations/plotly/plotly-layouts.mjs +121 -0
  105. package/esm2022/lib/implementations/plotly/plotly-readback.mjs +117 -0
  106. package/esm2022/lib/implementations/plotly/plotly-region-overlay.mjs +19 -10
  107. package/esm2022/lib/implementations/plotly/plotly-shape-projection.mjs +223 -0
  108. package/esm2022/lib/implementations/plotly/plotly-trace-builders.mjs +79 -19
  109. package/esm2022/lib/implementations/plotly/plotly-zoom-controller.mjs +223 -0
  110. package/esm2022/lib/implementations/plotly/plotly.service.mjs +439 -1655
  111. package/esm2022/lib/implementations/region-centroids.mjs +47 -0
  112. package/esm2022/lib/implementations/simple-slice-access.service.mjs +22 -12
  113. package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +172 -92
  114. package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +103 -22
  115. package/esm2022/lib/implementations/tile-server/index.mjs +6 -0
  116. package/esm2022/lib/implementations/tile-server/native-histogram.mjs +30 -0
  117. package/esm2022/lib/implementations/tile-server/poll-descriptor.mjs +65 -0
  118. package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +42 -0
  119. package/esm2022/lib/implementations/tile-server/transport.mjs +135 -0
  120. package/esm2022/lib/intensity/intensity-profile.mjs +107 -0
  121. package/esm2022/lib/intensity/intensity-profile.service.mjs +223 -0
  122. package/esm2022/lib/intensity-inset/intensity-inset.component.mjs +133 -0
  123. package/esm2022/lib/models/bezier.mjs +1 -11
  124. package/esm2022/lib/models/class-preset.mjs +41 -3
  125. package/esm2022/lib/models/geometry.mjs +27 -164
  126. package/esm2022/lib/models/polygon-edit.mjs +254 -0
  127. package/esm2022/lib/models/polygon-factory.mjs +134 -0
  128. package/esm2022/lib/models/region-clone.mjs +68 -0
  129. package/esm2022/lib/models/region-geojson.mjs +411 -0
  130. package/esm2022/lib/models/region.mjs +34 -33
  131. package/esm2022/lib/models/shape.mjs +18 -16
  132. package/esm2022/lib/plot-mode/contribution-host.mjs +297 -0
  133. package/esm2022/lib/plot-mode/plot-mode-controller.mjs +9 -6
  134. package/esm2022/lib/plot-mode/plot-type-menu.mjs +85 -0
  135. package/esm2022/lib/plot-mode/tool-params-model.mjs +87 -0
  136. package/esm2022/lib/plot.utilities.mjs +296 -473
  137. package/esm2022/lib/processing/image-crop.mjs +1 -1
  138. package/esm2022/lib/processing/processing-image.mjs +28 -15
  139. package/esm2022/lib/provide-visualization.mjs +40 -14
  140. package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +156 -0
  141. package/esm2022/lib/region-editor/class-tree/class-tree.mjs +108 -0
  142. package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +163 -0
  143. package/esm2022/lib/region-editor/file-stem.mjs +13 -0
  144. package/esm2022/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.mjs +118 -0
  145. package/esm2022/lib/region-editor/mask-export.service.mjs +98 -0
  146. package/esm2022/lib/region-editor/mask-raster.mjs +11 -5
  147. package/esm2022/lib/region-editor/region-color-dialog/region-color-dialog.component.mjs +56 -0
  148. package/esm2022/lib/region-editor/region-editor-help/region-editor-help.component.mjs +28 -0
  149. package/esm2022/lib/region-editor/region-editor.component.mjs +896 -660
  150. package/esm2022/lib/region-editor/region-metrics.mjs +86 -0
  151. package/esm2022/lib/region-editor/region-persistence.service.mjs +160 -0
  152. package/esm2022/lib/region-editor/region-table/region-table.component.mjs +169 -0
  153. package/esm2022/lib/region-editor/save-mask-dialog/save-mask-dialog.component.mjs +91 -0
  154. package/esm2022/lib/region-editor/save-regions-dialog/save-regions-dialog.component.mjs +92 -0
  155. package/esm2022/lib/region-ops.service.mjs +28 -70
  156. package/esm2022/lib/region-overlay/region-geometry.mjs +360 -0
  157. package/esm2022/lib/region-overlay/region-hit-test.mjs +103 -0
  158. package/esm2022/lib/region-overlay/region-source-layer.mjs +378 -0
  159. package/esm2022/lib/region-overlay/region-style.mjs +97 -0
  160. package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
  161. package/esm2022/lib/region-source/http-region-source.mjs +104 -0
  162. package/esm2022/lib/region-source/region-source-ops.mjs +53 -0
  163. package/esm2022/lib/region-source/region-source-worker.mjs +10 -0
  164. package/esm2022/lib/region-source/region-source.mjs +67 -0
  165. package/esm2022/lib/region-source/region-tiles.mjs +708 -0
  166. package/esm2022/lib/region-source/worker-region-source.mjs +229 -0
  167. package/esm2022/lib/render-orchestrator.mjs +14 -11
  168. package/esm2022/lib/render-session.mjs +207 -0
  169. package/esm2022/lib/routing-visualizer.service.mjs +858 -414
  170. package/esm2022/lib/section-pane/section-pane.component.mjs +299 -0
  171. package/esm2022/lib/spatial/density-raster.mjs +14 -0
  172. package/esm2022/lib/spatial/embedding-compute-coordinator.mjs +239 -0
  173. package/esm2022/lib/spatial/embedding-compute.mjs +43 -10
  174. package/esm2022/lib/spatial/gene-search.mjs +1 -1
  175. package/esm2022/lib/spatial/glyphs.mjs +97 -0
  176. package/esm2022/lib/spatial/lod.mjs +187 -0
  177. package/esm2022/lib/spatial/spatial-controls.facade.mjs +200 -0
  178. package/esm2022/lib/spatial/spatial-density.mjs +25 -16
  179. package/esm2022/lib/spatial/spatial-encoding.mjs +26 -82
  180. package/esm2022/lib/spatial/spatial-expression.mjs +43 -42
  181. package/esm2022/lib/spatial/spatial-framing.mjs +1 -1
  182. package/esm2022/lib/spatial/spatial-heatmap.mjs +6 -3
  183. package/esm2022/lib/spatial/spatial-hover.mjs +5 -33
  184. package/esm2022/lib/spatial/spatial-panel-model.mjs +282 -0
  185. package/esm2022/lib/spatial/spatial-sections.mjs +1 -1
  186. package/esm2022/lib/spatial/spatial-selection.mjs +33 -46
  187. package/esm2022/lib/spatial/spatial-tile-merge.mjs +219 -0
  188. package/esm2022/lib/spatial/spatial-tiles.mjs +12 -648
  189. package/esm2022/lib/spatial/spatial-volume-image.mjs +2 -4
  190. package/esm2022/lib/spatial/stats.mjs +71 -0
  191. package/esm2022/lib/spatial/transcript-grouping.mjs +307 -0
  192. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +150 -0
  193. package/esm2022/lib/spatial-controls/spatial-charts/chart-data-model.mjs +309 -0
  194. package/esm2022/lib/spatial-controls/spatial-charts/chart-help.mjs +145 -0
  195. package/esm2022/lib/spatial-controls/spatial-charts/plotly-chart-host.mjs +158 -0
  196. package/esm2022/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.mjs +47 -0
  197. package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +297 -802
  198. package/esm2022/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.mjs +89 -0
  199. package/esm2022/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.mjs +52 -0
  200. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +143 -1238
  201. package/esm2022/lib/spatial-controls/spatial-gene-picker.mjs +153 -0
  202. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +241 -0
  203. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +193 -0
  204. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +132 -0
  205. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.model.mjs +67 -0
  206. package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +147 -0
  207. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +300 -0
  208. package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +370 -0
  209. package/esm2022/lib/store/class-color.util.mjs +53 -5
  210. package/esm2022/lib/store/class-signatures.mjs +63 -0
  211. package/esm2022/lib/store/region-history.mjs +146 -0
  212. package/esm2022/lib/store/region-scope-cache.mjs +144 -0
  213. package/esm2022/lib/store/region-selection.mjs +82 -0
  214. package/esm2022/lib/store/region-source-scope.mjs +171 -0
  215. package/esm2022/lib/store/region-store.service.mjs +986 -670
  216. package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
  217. package/esm2022/lib/store/visualizer-store.service.mjs +81 -76
  218. package/esm2022/lib/toast-outlets.mjs +5 -4
  219. package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +92 -434
  220. package/esm2022/lib/toolbar/canvas-tools.mjs +20 -0
  221. package/esm2022/lib/toolbar/crop/slide-crop.mjs +26 -42
  222. package/esm2022/lib/toolbar/plot-type-selector/plot-type-selector.component.mjs +85 -0
  223. package/esm2022/lib/toolbar/region-tools/region-tool-buttons.mjs +74 -0
  224. package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +120 -0
  225. package/esm2022/lib/toolbar/segmentation/cell-segment-tool.service.mjs +74 -78
  226. package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +50 -8
  227. package/esm2022/lib/toolbar/segmentation/onnx-sam-session.mjs +61 -42
  228. package/esm2022/lib/toolbar/segmentation/pending-calls.mjs +47 -0
  229. package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +12 -4
  230. package/esm2022/lib/toolbar/segmentation/sam-onnx-core.mjs +70 -14
  231. package/esm2022/lib/toolbar/segmentation/sam-point-tool.service.mjs +135 -172
  232. package/esm2022/lib/toolbar/segmentation/sam-prompt.mjs +9 -90
  233. package/esm2022/lib/toolbar/segmentation/sam-session.service.mjs +183 -0
  234. package/esm2022/lib/toolbar/segmentation/sam-tool.service.mjs +95 -150
  235. package/esm2022/lib/toolbar/segmentation/segmentation-commit.mjs +12 -0
  236. package/esm2022/lib/toolbar/segmentation/segmentation-runner.mjs +108 -0
  237. package/esm2022/lib/toolbar/segmentation-tools/segmentation-tools.component.mjs +155 -0
  238. package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +121 -0
  239. package/esm2022/lib/toolbar/tool-kit/async-tool-status.mjs +37 -0
  240. package/esm2022/lib/toolbar/tool-kit/canvas-tool-manager.mjs +63 -0
  241. package/esm2022/lib/toolbar/tool-kit/canvas-tool.mjs +2 -0
  242. package/esm2022/lib/toolbar/tool-kit/frame-pixels.mjs +108 -0
  243. package/esm2022/lib/toolbar/tool-kit/mask-stroke-editor.mjs +306 -0
  244. package/esm2022/lib/toolbar/tool-kit/matrix-frame.mjs +61 -0
  245. package/esm2022/lib/toolbar/tool-kit/tool-overlay.mjs +140 -0
  246. package/esm2022/lib/toolbar/tool-kit/undo-gesture.mjs +24 -0
  247. package/esm2022/lib/toolbar/tool-slider/tool-slider.component.mjs +63 -0
  248. package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +50 -0
  249. package/esm2022/lib/toolbar/toolbar.component.mjs +84 -119
  250. package/esm2022/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.mjs +93 -115
  251. package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +107 -0
  252. package/esm2022/lib/toolbar/wand/wand-region-grow.mjs +321 -0
  253. package/esm2022/lib/toolbar/wand/wand-tool.service.mjs +121 -416
  254. package/esm2022/lib/toolbar/wand/wand.service.mjs +30 -894
  255. package/esm2022/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.mjs +48 -90
  256. package/esm2022/lib/util/mark-for-check.mjs +17 -0
  257. package/esm2022/lib/util/supersede.mjs +56 -0
  258. package/esm2022/lib/visualization.module.mjs +39 -141
  259. package/esm2022/lib/visualizer/floating-drag.directive.mjs +58 -0
  260. package/esm2022/lib/visualizer/region-actions.mjs +149 -0
  261. package/esm2022/lib/visualizer/region-load.mjs +123 -0
  262. package/esm2022/lib/visualizer/spatial-dataset-binder.mjs +163 -0
  263. package/esm2022/lib/visualizer/tool-modes.mjs +113 -0
  264. package/esm2022/lib/visualizer/viewer-shortcuts.mjs +167 -0
  265. package/esm2022/lib/visualizer/visualizer-context-menu.mjs +119 -0
  266. package/esm2022/lib/visualizer/volume-sections.mjs +175 -0
  267. package/esm2022/lib/visualizer.component.mjs +602 -1902
  268. package/esm2022/lib/workers/spatial-math-ops.mjs +43 -0
  269. package/esm2022/lib/workers/spatial-math-worker.mjs +10 -0
  270. package/esm2022/lib/workers/spatial-math.mjs +190 -0
  271. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs +47169 -0
  272. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs.map +1 -0
  273. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs +238 -0
  274. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs.map +1 -0
  275. package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs +12 -0
  276. package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs.map +1 -0
  277. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs +12 -0
  278. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs.map +1 -0
  279. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +41 -34467
  280. package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
  281. package/fesm2022/mask.worker.js +36 -917
  282. package/fesm2022/onnx-sam.worker.js +52 -16
  283. package/fesm2022/region-source.worker.js +1067 -0
  284. package/fesm2022/spatial-math.worker.js +471 -0
  285. package/fesm2022/tsne.worker.js +32 -15
  286. package/index.d.ts +19 -10
  287. package/lib/channel-histogram/channel-histogram.component.d.ts +53 -43
  288. package/lib/contracts/capabilities.contract.d.ts +4 -2
  289. package/lib/contracts/cell-segmenter.contract.d.ts +1 -0
  290. package/lib/contracts/channel-histogram-api.contract.d.ts +4 -0
  291. package/lib/contracts/color.d.ts +27 -0
  292. package/lib/contracts/colormap-lut.d.ts +19 -4
  293. package/lib/contracts/coordinate-transform.contract.d.ts +3 -3
  294. package/lib/contracts/display-types.d.ts +21 -0
  295. package/lib/contracts/image.contract.d.ts +4 -0
  296. package/lib/contracts/instance-segmenter.contract.d.ts +5 -0
  297. package/lib/contracts/intensity.d.ts +13 -2
  298. package/lib/contracts/plot-type.d.ts +3 -1
  299. package/lib/contracts/ports/image-state.port.d.ts +6 -2
  300. package/lib/contracts/ports/preferences.port.d.ts +4 -0
  301. package/lib/contracts/ports/region-io.port.d.ts +1 -0
  302. package/lib/contracts/ports/spatial-data.port.d.ts +4 -10
  303. package/lib/contracts/ports/tile-access.port.d.ts +1 -0
  304. package/lib/contracts/region-editor-api.contract.d.ts +85 -1
  305. package/lib/contracts/region-overlay.contract.d.ts +5 -0
  306. package/lib/contracts/region-store.contract.d.ts +22 -0
  307. package/lib/contracts/sam.contract.d.ts +7 -0
  308. package/lib/contracts/section-view.contract.d.ts +44 -0
  309. package/lib/contracts/semantic-segmenter.contract.d.ts +6 -0
  310. package/lib/contracts/spatial-dataset.contract.d.ts +19 -6
  311. package/lib/contracts/toolbar-tool.contract.d.ts +1 -0
  312. package/lib/contracts/visualizer.contract.d.ts +231 -54
  313. package/lib/contracts/viz-config.d.ts +9 -0
  314. package/lib/geometry/contour.d.ts +24 -0
  315. package/lib/geometry/loft.d.ts +22 -0
  316. package/lib/geometry/polylabel.d.ts +23 -0
  317. package/lib/geometry/raster.d.ts +42 -0
  318. package/lib/geometry/reconstruct.d.ts +54 -0
  319. package/lib/geometry/reslice-image.d.ts +33 -0
  320. package/lib/geometry/ring.d.ts +67 -0
  321. package/lib/geometry/section.d.ts +52 -0
  322. package/lib/hex-color-picker/hex-color-picker.component.d.ts +61 -27
  323. package/lib/implementations/base-store-visualizer.d.ts +61 -15
  324. package/lib/implementations/napari-js/napari-axes-gizmo.d.ts +36 -0
  325. package/lib/implementations/napari-js/napari-display-state.d.ts +76 -0
  326. package/lib/implementations/napari-js/napari-helpers.d.ts +129 -0
  327. package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +162 -0
  328. package/lib/implementations/napari-js/napari-loading-badge.d.ts +4 -3
  329. package/lib/implementations/napari-js/napari-loading-state.d.ts +37 -0
  330. package/lib/implementations/napari-js/napari-region-mesh-pointer.d.ts +32 -0
  331. package/lib/implementations/napari-js/napari-region-overlay.d.ts +68 -71
  332. package/lib/implementations/napari-js/napari-scene.d.ts +126 -0
  333. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +163 -0
  334. package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +212 -0
  335. package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +114 -0
  336. package/lib/implementations/napari-js/napari-spatial-hover.d.ts +91 -0
  337. package/lib/implementations/napari-js/napari-spatial-scene.d.ts +118 -0
  338. package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +56 -263
  339. package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +1 -1
  340. package/lib/implementations/napari-js/napari-surface-scene.d.ts +76 -0
  341. package/lib/implementations/napari-js/napari-tile-client.d.ts +214 -0
  342. package/lib/implementations/napari-js/napari-tool-bridge.d.ts +179 -0
  343. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +169 -883
  344. package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +66 -0
  345. package/lib/implementations/napari-js/napari-volume-scene.d.ts +148 -0
  346. package/lib/implementations/napari-js/napari-volume-slice-planes.d.ts +43 -0
  347. package/lib/implementations/napari-js/napari-volume-z-handle.d.ts +8 -12
  348. package/lib/implementations/napari-js/region-overlay/overlay-projection.d.ts +59 -0
  349. package/lib/implementations/napari-js/region-overlay/region-edit.d.ts +15 -0
  350. package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +54 -0
  351. package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +26 -0
  352. package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +70 -0
  353. package/lib/implementations/napari-js/spatial-tiles/density-layer.d.ts +61 -0
  354. package/lib/implementations/napari-js/spatial-tiles/layer-groups.d.ts +67 -0
  355. package/lib/implementations/napari-js/spatial-tiles/plan-context.d.ts +38 -0
  356. package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +71 -0
  357. package/lib/implementations/napari-js/spatial-tiles/transcript-jobs.d.ts +105 -0
  358. package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +56 -0
  359. package/lib/implementations/osd/display-pipeline.d.ts +38 -9
  360. package/lib/implementations/osd/histogram-sampler.d.ts +22 -12
  361. package/lib/implementations/osd/openseadragon-viewer-options.d.ts +35 -0
  362. package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +78 -354
  363. package/lib/implementations/osd/osd-coordinate-transform.d.ts +2 -1
  364. package/lib/implementations/osd/osd-coords.d.ts +6 -4
  365. package/lib/implementations/osd/osd-export.d.ts +36 -0
  366. package/lib/implementations/osd/osd-lib.d.ts +7 -0
  367. package/lib/implementations/osd/osd-navigator-chrome.d.ts +69 -0
  368. package/lib/implementations/osd/osd-pixel-readback.d.ts +22 -0
  369. package/lib/implementations/osd/osd-region-overlay-draw.d.ts +38 -0
  370. package/lib/implementations/osd/osd-region-overlay.d.ts +46 -51
  371. package/lib/implementations/osd/osd-scale-bar.d.ts +8 -6
  372. package/lib/implementations/osd/osd-tile-source.d.ts +49 -0
  373. package/lib/implementations/osd/osd-viewer-like.d.ts +100 -0
  374. package/lib/implementations/osd/osd-viewer-mount.d.ts +14 -0
  375. package/lib/implementations/osd/osd-viewport.d.ts +77 -0
  376. package/lib/implementations/osd/osd-zoom.d.ts +6 -0
  377. package/lib/implementations/osd/simple-source.d.ts +161 -0
  378. package/lib/implementations/osd/slice-cache.d.ts +12 -3
  379. package/lib/implementations/osd/tile-client.d.ts +11 -14
  380. package/lib/implementations/osd/tile-recolor.d.ts +141 -0
  381. package/lib/implementations/plotly/omics-trace-builders.d.ts +32 -20
  382. package/lib/implementations/plotly/plotly-image-loader.d.ts +49 -0
  383. package/lib/implementations/plotly/plotly-image-recolor.d.ts +75 -0
  384. package/lib/implementations/plotly/plotly-intensity-inset.d.ts +8 -0
  385. package/lib/implementations/plotly/plotly-isosurface-controls.d.ts +38 -0
  386. package/lib/implementations/plotly/plotly-layouts.d.ts +188 -0
  387. package/lib/implementations/plotly/plotly-readback.d.ts +41 -0
  388. package/lib/implementations/plotly/plotly-region-overlay.d.ts +2 -2
  389. package/lib/implementations/plotly/plotly-shape-projection.d.ts +92 -0
  390. package/lib/implementations/plotly/plotly-trace-builders.d.ts +23 -12
  391. package/lib/implementations/plotly/plotly-zoom-controller.d.ts +86 -0
  392. package/lib/implementations/plotly/plotly.service.d.ts +136 -401
  393. package/lib/implementations/region-centroids.d.ts +14 -0
  394. package/lib/implementations/simple-slice-access.service.d.ts +7 -4
  395. package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +42 -18
  396. package/lib/implementations/spatial-data-http/spatial-wire.d.ts +34 -9
  397. package/lib/implementations/tile-server/index.d.ts +5 -0
  398. package/lib/implementations/tile-server/native-histogram.d.ts +25 -0
  399. package/lib/implementations/tile-server/poll-descriptor.d.ts +39 -0
  400. package/lib/implementations/tile-server/tile-protocol.d.ts +83 -0
  401. package/lib/implementations/tile-server/transport.d.ts +62 -0
  402. package/lib/intensity/intensity-profile.d.ts +66 -0
  403. package/lib/intensity/intensity-profile.service.d.ts +108 -0
  404. package/lib/intensity-inset/intensity-inset.component.d.ts +58 -0
  405. package/lib/models/bezier.d.ts +0 -5
  406. package/lib/models/class-preset.d.ts +25 -0
  407. package/lib/models/geometry.d.ts +14 -48
  408. package/lib/models/polygon-edit.d.ts +72 -0
  409. package/lib/models/polygon-factory.d.ts +45 -0
  410. package/lib/models/region-clone.d.ts +20 -0
  411. package/lib/models/region-geojson.d.ts +57 -0
  412. package/lib/models/region.d.ts +59 -4
  413. package/lib/models/shape.d.ts +8 -0
  414. package/lib/plot-mode/contribution-host.d.ts +125 -0
  415. package/lib/plot-mode/plot-type-menu.d.ts +60 -0
  416. package/lib/plot-mode/tool-params-model.d.ts +49 -0
  417. package/lib/plot.utilities.d.ts +19 -30
  418. package/lib/processing/processing-image.d.ts +5 -2
  419. package/lib/provide-visualization.d.ts +19 -2
  420. package/lib/region-editor/class-tree/class-tree.component.d.ts +78 -0
  421. package/lib/region-editor/class-tree/class-tree.d.ts +31 -0
  422. package/lib/region-editor/classes-panel/classes-panel.component.d.ts +86 -0
  423. package/lib/region-editor/file-stem.d.ts +7 -0
  424. package/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.d.ts +45 -0
  425. package/lib/region-editor/mask-export.service.d.ts +54 -0
  426. package/lib/region-editor/mask-raster.d.ts +2 -8
  427. package/lib/region-editor/region-color-dialog/region-color-dialog.component.d.ts +29 -0
  428. package/lib/region-editor/region-editor-help/region-editor-help.component.d.ts +11 -0
  429. package/lib/region-editor/region-editor.component.d.ts +283 -200
  430. package/lib/region-editor/region-metrics.d.ts +34 -0
  431. package/lib/region-editor/region-persistence.service.d.ts +77 -0
  432. package/lib/region-editor/region-table/region-table.component.d.ts +89 -0
  433. package/lib/region-editor/save-mask-dialog/save-mask-dialog.component.d.ts +36 -0
  434. package/lib/region-editor/save-regions-dialog/save-regions-dialog.component.d.ts +37 -0
  435. package/lib/region-ops.service.d.ts +1 -7
  436. package/lib/region-overlay/region-geometry.d.ts +158 -0
  437. package/lib/region-overlay/region-hit-test.d.ts +38 -0
  438. package/lib/region-overlay/region-source-layer.d.ts +96 -0
  439. package/lib/region-overlay/region-style.d.ts +52 -0
  440. package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
  441. package/lib/region-source/http-region-source.d.ts +45 -0
  442. package/lib/region-source/region-source-ops.d.ts +89 -0
  443. package/lib/region-source/region-source-worker.d.ts +7 -0
  444. package/lib/region-source/region-source.d.ts +82 -0
  445. package/lib/region-source/region-tiles.d.ts +289 -0
  446. package/lib/region-source/worker-region-source.d.ts +65 -0
  447. package/lib/render-orchestrator.d.ts +6 -2
  448. package/lib/render-session.d.ts +75 -0
  449. package/lib/routing-visualizer.service.d.ts +248 -59
  450. package/lib/section-pane/section-pane.component.d.ts +47 -0
  451. package/lib/spatial/density-raster.d.ts +6 -0
  452. package/lib/spatial/embedding-compute-coordinator.d.ts +123 -0
  453. package/lib/spatial/embedding-compute.d.ts +21 -2
  454. package/lib/spatial/glyphs.d.ts +16 -0
  455. package/lib/spatial/lod.d.ts +94 -0
  456. package/lib/spatial/spatial-controls.facade.d.ts +64 -0
  457. package/lib/spatial/spatial-density.d.ts +15 -5
  458. package/lib/spatial/spatial-encoding.d.ts +11 -44
  459. package/lib/spatial/spatial-expression.d.ts +40 -22
  460. package/lib/spatial/spatial-framing.d.ts +1 -0
  461. package/lib/spatial/spatial-heatmap.d.ts +2 -0
  462. package/lib/spatial/spatial-hover.d.ts +4 -16
  463. package/lib/spatial/spatial-panel-model.d.ts +135 -0
  464. package/lib/spatial/spatial-selection.d.ts +21 -26
  465. package/lib/spatial/spatial-tile-merge.d.ts +41 -0
  466. package/lib/spatial/spatial-tiles.d.ts +9 -256
  467. package/lib/spatial/stats.d.ts +38 -0
  468. package/lib/spatial/transcript-grouping.d.ts +119 -0
  469. package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +64 -0
  470. package/lib/spatial-controls/spatial-charts/chart-data-model.d.ts +153 -0
  471. package/lib/spatial-controls/spatial-charts/chart-help.d.ts +69 -0
  472. package/lib/spatial-controls/spatial-charts/plotly-chart-host.d.ts +98 -0
  473. package/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.d.ts +26 -0
  474. package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +101 -260
  475. package/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.d.ts +43 -0
  476. package/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.d.ts +27 -0
  477. package/lib/spatial-controls/spatial-controls.component.d.ts +68 -448
  478. package/lib/spatial-controls/spatial-gene-picker.d.ts +86 -0
  479. package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +102 -0
  480. package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +72 -0
  481. package/lib/spatial-controls/spatial-key/spatial-key.component.d.ts +66 -0
  482. package/lib/spatial-controls/spatial-key/spatial-key.model.d.ts +33 -0
  483. package/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.d.ts +64 -0
  484. package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +117 -0
  485. package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +142 -0
  486. package/lib/store/class-color.util.d.ts +39 -2
  487. package/lib/store/class-signatures.d.ts +11 -0
  488. package/lib/store/region-history.d.ts +66 -0
  489. package/lib/store/region-scope-cache.d.ts +65 -0
  490. package/lib/store/region-selection.d.ts +36 -0
  491. package/lib/store/region-source-scope.d.ts +68 -0
  492. package/lib/store/region-store.service.d.ts +312 -116
  493. package/lib/store/visualizer-store.service.d.ts +32 -33
  494. package/lib/toast-outlets.d.ts +4 -3
  495. package/lib/toolbar/brush/brush-tool.service.d.ts +31 -98
  496. package/lib/toolbar/canvas-tools.d.ts +20 -0
  497. package/lib/toolbar/crop/slide-crop.d.ts +10 -4
  498. package/lib/toolbar/plot-type-selector/plot-type-selector.component.d.ts +38 -0
  499. package/lib/toolbar/region-tools/region-tool-buttons.d.ts +21 -0
  500. package/lib/toolbar/region-tools/region-tools.component.d.ts +62 -0
  501. package/lib/toolbar/segmentation/cell-segment-tool.service.d.ts +10 -14
  502. package/lib/toolbar/segmentation/cellpose-segmenter.service.d.ts +12 -2
  503. package/lib/toolbar/segmentation/onnx-sam-session.d.ts +22 -3
  504. package/lib/toolbar/segmentation/pending-calls.d.ts +31 -0
  505. package/lib/toolbar/segmentation/sam-model-registry.d.ts +9 -3
  506. package/lib/toolbar/segmentation/sam-onnx-core.d.ts +18 -5
  507. package/lib/toolbar/segmentation/sam-point-tool.service.d.ts +46 -32
  508. package/lib/toolbar/segmentation/sam-prompt.d.ts +7 -31
  509. package/lib/toolbar/segmentation/sam-session.service.d.ts +74 -0
  510. package/lib/toolbar/segmentation/sam-tool.service.d.ts +23 -30
  511. package/lib/toolbar/segmentation/segmentation-commit.d.ts +8 -0
  512. package/lib/toolbar/segmentation/segmentation-runner.d.ts +52 -0
  513. package/lib/toolbar/segmentation-tools/segmentation-tools.component.d.ts +87 -0
  514. package/lib/toolbar/stack-controls/stack-controls.component.d.ts +51 -0
  515. package/lib/toolbar/tool-kit/async-tool-status.d.ts +21 -0
  516. package/lib/toolbar/tool-kit/canvas-tool-manager.d.ts +36 -0
  517. package/lib/toolbar/tool-kit/canvas-tool.d.ts +86 -0
  518. package/lib/toolbar/tool-kit/frame-pixels.d.ts +45 -0
  519. package/lib/toolbar/tool-kit/mask-stroke-editor.d.ts +125 -0
  520. package/lib/toolbar/tool-kit/matrix-frame.d.ts +40 -0
  521. package/lib/toolbar/tool-kit/tool-overlay.d.ts +60 -0
  522. package/lib/toolbar/tool-kit/undo-gesture.d.ts +17 -0
  523. package/lib/toolbar/tool-slider/tool-slider.component.d.ts +33 -0
  524. package/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.d.ts +24 -0
  525. package/lib/toolbar/toolbar.component.d.ts +55 -84
  526. package/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.d.ts +33 -40
  527. package/lib/toolbar/view-controls/view-controls.component.d.ts +54 -0
  528. package/lib/toolbar/wand/wand-region-grow.d.ts +49 -0
  529. package/lib/toolbar/wand/wand-tool.service.d.ts +39 -124
  530. package/lib/toolbar/wand/wand.service.d.ts +22 -116
  531. package/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.d.ts +17 -37
  532. package/lib/util/mark-for-check.d.ts +11 -0
  533. package/lib/util/supersede.d.ts +53 -0
  534. package/lib/visualization.module.d.ts +18 -39
  535. package/lib/visualizer/floating-drag.directive.d.ts +30 -0
  536. package/lib/visualizer/region-actions.d.ts +54 -0
  537. package/lib/visualizer/region-load.d.ts +46 -0
  538. package/lib/visualizer/spatial-dataset-binder.d.ts +74 -0
  539. package/lib/visualizer/tool-modes.d.ts +49 -0
  540. package/lib/visualizer/viewer-shortcuts.d.ts +71 -0
  541. package/lib/visualizer/visualizer-context-menu.d.ts +55 -0
  542. package/lib/visualizer/volume-sections.d.ts +64 -0
  543. package/lib/visualizer.component.d.ts +232 -447
  544. package/lib/workers/spatial-math-ops.d.ts +65 -0
  545. package/lib/workers/spatial-math-worker.d.ts +7 -0
  546. package/lib/workers/spatial-math.d.ts +74 -0
  547. package/package.json +12 -3
  548. package/src/lib/assets/slice.svg +23 -0
  549. package/src/lib/styles/_viz-icons-rules.scss +73 -0
  550. package/src/lib/styles/viz-icons.scss +14 -0
  551. package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +0 -97
  552. package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +0 -195
  553. package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +0 -92
  554. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs +0 -329
  555. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map +0 -1
  556. package/lib/implementations/napari-js/napari-axes-labels.d.ts +0 -49
  557. package/lib/implementations/napari-js/napari-navigator.d.ts +0 -72
  558. package/lib/implementations/napari-js/napari-scale-bar.d.ts +0 -35
  559. package/src/lib/assets/cell-detection.svg +0 -37
  560. package/src/lib/assets/click.svg +0 -1
  561. package/src/lib/assets/colormap-luts.json +0 -1
  562. package/src/lib/assets/edit-selection-white.svg +0 -47
  563. package/src/lib/assets/icons/colormap-earth.png +0 -0
  564. package/src/lib/assets/icons/colormap-placeholder.png +0 -0
  565. package/src/lib/assets/icons/colormap-pubu.png +0 -0
  566. package/src/lib/assets/interactive-segmentation-cursor.svg +0 -1
  567. package/src/lib/assets/picture-segmentation.svg +0 -43
  568. package/src/lib/assets/test/download-379.svg +0 -1
  569. package/src/lib/assets/test/download-98.svg +0 -1
  570. package/src/lib/assets/test/json-1.svg +0 -1
  571. package/src/lib/assets/test/load-53.svg +0 -1
  572. package/src/lib/assets/test/mask-44.svg +0 -1
  573. package/src/lib/assets/test/mask-download-44.svg +0 -15
  574. package/src/lib/assets/test/mask-save-44.svg +0 -11
  575. package/src/lib/assets/test/overlay-1.svg +0 -1
  576. package/src/lib/assets/test/overlay-4.svg +0 -1
  577. package/src/lib/assets/test/region-26.svg +0 -1
  578. package/src/lib/assets/test/save-56.svg +0 -1
  579. package/src/lib/assets/test/upload-43.svg +0 -1
@@ -0,0 +1,63 @@
1
+ import { traceContours } from 'napari-js/geometry';
2
+ import { makePolygon } from '../models/polygon-factory';
3
+ /**
4
+ * Pure contour tracing: binary mask / label map → polygons with holes, through
5
+ * napari-js's `traceContours`. No DOM, no Angular.
6
+ *
7
+ * Pixel (x, y) of a mask covers `[x, x + 1) × [y, y + 1)` of its frame, and the
8
+ * outlines run along pixel EDGES (vertices on whole pixel corners, straight runs
9
+ * merged into one edge), so `rasterizePolygon` (`geometry/raster`, the pixel-centre
10
+ * rule) gives back exactly the traced pixels: a region the wand or brush adopts
11
+ * again after a zoom, pan or undo comes back unchanged. Each blob's holes are its
12
+ * own interior rings, never a gap that blobs enclose only together. Vertices are
13
+ * translated by the caller's origin and never clamped: a mask may sit partly
14
+ * outside the readback window it was painted in (jit-ui#102).
15
+ */
16
+ /** A traced contour as a closed Polygon, holes as `[[x, y], …]` rings. */
17
+ function toPolygon(c) {
18
+ const ring = (flat) => {
19
+ const xs = [];
20
+ const ys = [];
21
+ for (let i = 0; i < flat.length; i += 2) {
22
+ xs.push(flat[i]);
23
+ ys.push(flat[i + 1]);
24
+ }
25
+ return { xs, ys };
26
+ };
27
+ const outer = ring(c.outer);
28
+ const holes = c.holes.map((h) => {
29
+ const r = ring(h);
30
+ return r.xs.map((x, k) => [x, r.ys[k]]);
31
+ });
32
+ return makePolygon(outer.xs, outer.ys, { holes });
33
+ }
34
+ /**
35
+ * Trace EVERY 4-connected blob in `mask` (sized w*h) whose area is at least
36
+ * `minSize` pixels, returning one Polygon per blob translated via
37
+ * (originX, originY), ordered largest-first (ties in raster order). A blob's
38
+ * interior rings enclosing at least `minHoleSize` pixels become its
39
+ * {@link Polygon.holes}. An erase that cuts a region in two therefore yields
40
+ * both pieces, and a donut keeps its hole.
41
+ *
42
+ * The mask is labelled once and each blob traced inside its own bounding box
43
+ * (RT-16), so the cost is O(w·h + Σ bbox areas).
44
+ */
45
+ export function maskToPolygons(mask, w, h, originX, originY, minSize = 4, minHoleSize = minSize) {
46
+ return traceContours({ data: mask, width: w, height: h }, { minSize, minHoleSize, origin: [originX, originY] }).map(toPolygon);
47
+ }
48
+ /**
49
+ * Trace each instance in an integer label map (0 = background) into polygons —
50
+ * used to turn a cellpose-style segmentation into region outlines. Pieces with
51
+ * area below `minSize` are skipped (and holes below it dropped); a label made of
52
+ * several blobs yields one polygon per blob. Ordered by label, then largest
53
+ * piece first. Coords are translated via originX/originY (not clamped).
54
+ *
55
+ * One labelling pass finds every label's pieces; each is traced inside its own
56
+ * bounding box (RT-16), instead of rescanning the whole map per label.
57
+ */
58
+ export function labelsToPolygons(labels, w, h, originX, originY, minSize = 10) {
59
+ return traceContours({ data: labels, width: w, height: h }, { minSize, minHoleSize: minSize, origin: [originX, originY] })
60
+ .sort((a, b) => a.value - b.value) // stable: largest first within a label
61
+ .map(toPolygon);
62
+ }
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udG91ci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZ2VvbWV0cnkvY29udG91ci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFJbkQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXhEOzs7Ozs7Ozs7Ozs7R0FZRztBQUVILDBFQUEwRTtBQUMxRSxTQUFTLFNBQVMsQ0FBQyxDQUFVO0lBQzNCLE1BQU0sSUFBSSxHQUFHLENBQUMsSUFBYyxFQUFFLEVBQUU7UUFDOUIsTUFBTSxFQUFFLEdBQWEsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sRUFBRSxHQUFhLEVBQUUsQ0FBQztRQUN4QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDeEMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqQixFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QixDQUFDO1FBQ0QsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUNwQixDQUFDLENBQUM7SUFDRixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVCLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7UUFDOUIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQyxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7QUFDcEQsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUM1QixJQUFnQixFQUNoQixDQUFTLEVBQ1QsQ0FBUyxFQUNULE9BQWUsRUFDZixPQUFlLEVBQ2YsT0FBTyxHQUFHLENBQUMsRUFDWCxXQUFXLEdBQUcsT0FBTztJQUVyQixPQUFPLGFBQWEsQ0FDbEIsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUNuQyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQ3JELENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ25CLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQzlCLE1BQW1CLEVBQ25CLENBQVMsRUFDVCxDQUFTLEVBQ1QsT0FBZSxFQUNmLE9BQWUsRUFDZixPQUFPLEdBQUcsRUFBRTtJQUVaLE9BQU8sYUFBYSxDQUNsQixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQ3JDLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQzlEO1NBQ0UsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsdUNBQXVDO1NBQ3pFLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHJhY2VDb250b3VycyB9IGZyb20gJ25hcGFyaS1qcy9nZW9tZXRyeSc7XG5pbXBvcnQgdHlwZSB7IENvbnRvdXIgfSBmcm9tICduYXBhcmktanMvZ2VvbWV0cnknO1xuXG5pbXBvcnQgeyBQb2x5Z29uIH0gZnJvbSAnLi4vbW9kZWxzL3JlZ2lvbic7XG5pbXBvcnQgeyBtYWtlUG9seWdvbiB9IGZyb20gJy4uL21vZGVscy9wb2x5Z29uLWZhY3RvcnknO1xuXG4vKipcbiAqIFB1cmUgY29udG91ciB0cmFjaW5nOiBiaW5hcnkgbWFzayAvIGxhYmVsIG1hcCDihpIgcG9seWdvbnMgd2l0aCBob2xlcywgdGhyb3VnaFxuICogbmFwYXJpLWpzJ3MgYHRyYWNlQ29udG91cnNgLiBObyBET00sIG5vIEFuZ3VsYXIuXG4gKlxuICogUGl4ZWwgKHgsIHkpIG9mIGEgbWFzayBjb3ZlcnMgYFt4LCB4ICsgMSkgw5cgW3ksIHkgKyAxKWAgb2YgaXRzIGZyYW1lLCBhbmQgdGhlXG4gKiBvdXRsaW5lcyBydW4gYWxvbmcgcGl4ZWwgRURHRVMgKHZlcnRpY2VzIG9uIHdob2xlIHBpeGVsIGNvcm5lcnMsIHN0cmFpZ2h0IHJ1bnNcbiAqIG1lcmdlZCBpbnRvIG9uZSBlZGdlKSwgc28gYHJhc3Rlcml6ZVBvbHlnb25gIChgZ2VvbWV0cnkvcmFzdGVyYCwgdGhlIHBpeGVsLWNlbnRyZVxuICogcnVsZSkgZ2l2ZXMgYmFjayBleGFjdGx5IHRoZSB0cmFjZWQgcGl4ZWxzOiBhIHJlZ2lvbiB0aGUgd2FuZCBvciBicnVzaCBhZG9wdHNcbiAqIGFnYWluIGFmdGVyIGEgem9vbSwgcGFuIG9yIHVuZG8gY29tZXMgYmFjayB1bmNoYW5nZWQuIEVhY2ggYmxvYidzIGhvbGVzIGFyZSBpdHNcbiAqIG93biBpbnRlcmlvciByaW5ncywgbmV2ZXIgYSBnYXAgdGhhdCBibG9icyBlbmNsb3NlIG9ubHkgdG9nZXRoZXIuIFZlcnRpY2VzIGFyZVxuICogdHJhbnNsYXRlZCBieSB0aGUgY2FsbGVyJ3Mgb3JpZ2luIGFuZCBuZXZlciBjbGFtcGVkOiBhIG1hc2sgbWF5IHNpdCBwYXJ0bHlcbiAqIG91dHNpZGUgdGhlIHJlYWRiYWNrIHdpbmRvdyBpdCB3YXMgcGFpbnRlZCBpbiAoaml0LXVpIzEwMikuXG4gKi9cblxuLyoqIEEgdHJhY2VkIGNvbnRvdXIgYXMgYSBjbG9zZWQgUG9seWdvbiwgaG9sZXMgYXMgYFtbeCwgeV0sIOKApl1gIHJpbmdzLiAqL1xuZnVuY3Rpb24gdG9Qb2x5Z29uKGM6IENvbnRvdXIpOiBQb2x5Z29uIHtcbiAgY29uc3QgcmluZyA9IChmbGF0OiBudW1iZXJbXSkgPT4ge1xuICAgIGNvbnN0IHhzOiBudW1iZXJbXSA9IFtdO1xuICAgIGNvbnN0IHlzOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmxhdC5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgeHMucHVzaChmbGF0W2ldKTtcbiAgICAgIHlzLnB1c2goZmxhdFtpICsgMV0pO1xuICAgIH1cbiAgICByZXR1cm4geyB4cywgeXMgfTtcbiAgfTtcbiAgY29uc3Qgb3V0ZXIgPSByaW5nKGMub3V0ZXIpO1xuICBjb25zdCBob2xlcyA9IGMuaG9sZXMubWFwKChoKSA9PiB7XG4gICAgY29uc3QgciA9IHJpbmcoaCk7XG4gICAgcmV0dXJuIHIueHMubWFwKCh4LCBrKSA9PiBbeCwgci55c1trXV0pO1xuICB9KTtcbiAgcmV0dXJuIG1ha2VQb2x5Z29uKG91dGVyLnhzLCBvdXRlci55cywgeyBob2xlcyB9KTtcbn1cblxuLyoqXG4gKiBUcmFjZSBFVkVSWSA0LWNvbm5lY3RlZCBibG9iIGluIGBtYXNrYCAoc2l6ZWQgdypoKSB3aG9zZSBhcmVhIGlzIGF0IGxlYXN0XG4gKiBgbWluU2l6ZWAgcGl4ZWxzLCByZXR1cm5pbmcgb25lIFBvbHlnb24gcGVyIGJsb2IgdHJhbnNsYXRlZCB2aWFcbiAqIChvcmlnaW5YLCBvcmlnaW5ZKSwgb3JkZXJlZCBsYXJnZXN0LWZpcnN0ICh0aWVzIGluIHJhc3RlciBvcmRlcikuIEEgYmxvYidzXG4gKiBpbnRlcmlvciByaW5ncyBlbmNsb3NpbmcgYXQgbGVhc3QgYG1pbkhvbGVTaXplYCBwaXhlbHMgYmVjb21lIGl0c1xuICoge0BsaW5rIFBvbHlnb24uaG9sZXN9LiBBbiBlcmFzZSB0aGF0IGN1dHMgYSByZWdpb24gaW4gdHdvIHRoZXJlZm9yZSB5aWVsZHNcbiAqIGJvdGggcGllY2VzLCBhbmQgYSBkb251dCBrZWVwcyBpdHMgaG9sZS5cbiAqXG4gKiBUaGUgbWFzayBpcyBsYWJlbGxlZCBvbmNlIGFuZCBlYWNoIGJsb2IgdHJhY2VkIGluc2lkZSBpdHMgb3duIGJvdW5kaW5nIGJveFxuICogKFJULTE2KSwgc28gdGhlIGNvc3QgaXMgTyh3wrdoICsgzqMgYmJveCBhcmVhcykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXNrVG9Qb2x5Z29ucyhcbiAgbWFzazogVWludDhBcnJheSxcbiAgdzogbnVtYmVyLFxuICBoOiBudW1iZXIsXG4gIG9yaWdpblg6IG51bWJlcixcbiAgb3JpZ2luWTogbnVtYmVyLFxuICBtaW5TaXplID0gNCxcbiAgbWluSG9sZVNpemUgPSBtaW5TaXplLFxuKTogUG9seWdvbltdIHtcbiAgcmV0dXJuIHRyYWNlQ29udG91cnMoXG4gICAgeyBkYXRhOiBtYXNrLCB3aWR0aDogdywgaGVpZ2h0OiBoIH0sXG4gICAgeyBtaW5TaXplLCBtaW5Ib2xlU2l6ZSwgb3JpZ2luOiBbb3JpZ2luWCwgb3JpZ2luWV0gfSxcbiAgKS5tYXAodG9Qb2x5Z29uKTtcbn1cblxuLyoqXG4gKiBUcmFjZSBlYWNoIGluc3RhbmNlIGluIGFuIGludGVnZXIgbGFiZWwgbWFwICgwID0gYmFja2dyb3VuZCkgaW50byBwb2x5Z29ucyDigJRcbiAqIHVzZWQgdG8gdHVybiBhIGNlbGxwb3NlLXN0eWxlIHNlZ21lbnRhdGlvbiBpbnRvIHJlZ2lvbiBvdXRsaW5lcy4gUGllY2VzIHdpdGhcbiAqIGFyZWEgYmVsb3cgYG1pblNpemVgIGFyZSBza2lwcGVkIChhbmQgaG9sZXMgYmVsb3cgaXQgZHJvcHBlZCk7IGEgbGFiZWwgbWFkZSBvZlxuICogc2V2ZXJhbCBibG9icyB5aWVsZHMgb25lIHBvbHlnb24gcGVyIGJsb2IuIE9yZGVyZWQgYnkgbGFiZWwsIHRoZW4gbGFyZ2VzdFxuICogcGllY2UgZmlyc3QuIENvb3JkcyBhcmUgdHJhbnNsYXRlZCB2aWEgb3JpZ2luWC9vcmlnaW5ZIChub3QgY2xhbXBlZCkuXG4gKlxuICogT25lIGxhYmVsbGluZyBwYXNzIGZpbmRzIGV2ZXJ5IGxhYmVsJ3MgcGllY2VzOyBlYWNoIGlzIHRyYWNlZCBpbnNpZGUgaXRzIG93blxuICogYm91bmRpbmcgYm94IChSVC0xNiksIGluc3RlYWQgb2YgcmVzY2FubmluZyB0aGUgd2hvbGUgbWFwIHBlciBsYWJlbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxhYmVsc1RvUG9seWdvbnMoXG4gIGxhYmVsczogVWludDMyQXJyYXksXG4gIHc6IG51bWJlcixcbiAgaDogbnVtYmVyLFxuICBvcmlnaW5YOiBudW1iZXIsXG4gIG9yaWdpblk6IG51bWJlcixcbiAgbWluU2l6ZSA9IDEwLFxuKTogUG9seWdvbltdIHtcbiAgcmV0dXJuIHRyYWNlQ29udG91cnMoXG4gICAgeyBkYXRhOiBsYWJlbHMsIHdpZHRoOiB3LCBoZWlnaHQ6IGggfSxcbiAgICB7IG1pblNpemUsIG1pbkhvbGVTaXplOiBtaW5TaXplLCBvcmlnaW46IFtvcmlnaW5YLCBvcmlnaW5ZXSB9LFxuICApXG4gICAgLnNvcnQoKGEsIGIpID0+IGEudmFsdWUgLSBiLnZhbHVlKSAvLyBzdGFibGU6IGxhcmdlc3QgZmlyc3Qgd2l0aGluIGEgbGFiZWxcbiAgICAubWFwKHRvUG9seWdvbik7XG59XG4iXX0=
@@ -0,0 +1,128 @@
1
+ /** Points per line at most: the longest line is resampled at about one point per `step` px. */
2
+ const MAX_POINTS = 2048;
3
+ /** Points per line when matching lines across slices. */
4
+ const MATCH_POINTS = 32;
5
+ /**
6
+ * The sheet through `slices`' lines, in image pixels (x, y) and slice indices (z: slice k's line at
7
+ * z = k). Every line is resampled at the same number of points, evenly along its length (about one
8
+ * per `step` px of the longest), so a line shared by the strips above and below it is one row of
9
+ * vertices. Lines are matched between neighbouring slices closest first, each at most once, and only
10
+ * when their boxes overlap; a line without a match ends the sheet there. Empty without two slices
11
+ * with lines.
12
+ */
13
+ export function loftLines(slices, step = 1) {
14
+ const stack = slices
15
+ .map((s) => ({ z: s.z, lines: s.lines.filter((l) => l.length >= 4) }))
16
+ .filter((s) => s.lines.length)
17
+ .sort((a, b) => a.z - b.z);
18
+ if (stack.length < 2)
19
+ return { vertices: new Float32Array(0), faces: new Uint32Array(0) };
20
+ let longest = 0;
21
+ for (const s of stack)
22
+ for (const l of s.lines)
23
+ longest = Math.max(longest, lineLength(l));
24
+ const n = Math.min(MAX_POINTS, Math.max(2, Math.ceil(longest / Math.max(step, 1e-6)) + 1));
25
+ // Each line's resampled points, once: rows of n vertices.
26
+ const rows = [];
27
+ const verts = [];
28
+ for (const s of stack) {
29
+ rows.push(s.lines.map((l) => {
30
+ const first = verts.length / 3;
31
+ const pts = resample(l, n);
32
+ for (let i = 0; i < n; i++)
33
+ verts.push(pts[2 * i], pts[2 * i + 1], s.z);
34
+ return { first, probe: resample(l, MATCH_POINTS), box: lineBox(l) };
35
+ }));
36
+ }
37
+ const faces = [];
38
+ for (let k = 0; k + 1 < rows.length; k++) {
39
+ for (const { a, b, reversed } of matchLines(rows[k], rows[k + 1])) {
40
+ const at = (i) => b.first + (reversed ? n - 1 - i : i);
41
+ for (let i = 0; i + 1 < n; i++) {
42
+ const a0 = a.first + i, a1 = a0 + 1, b0 = at(i), b1 = at(i + 1);
43
+ faces.push(a0, b0, a1, a1, b0, b1);
44
+ }
45
+ }
46
+ }
47
+ if (!faces.length)
48
+ return { vertices: new Float32Array(0), faces: new Uint32Array(0) };
49
+ return { vertices: Float32Array.from(verts), faces: Uint32Array.from(faces) };
50
+ }
51
+ /** Pairs of lines of two neighbouring slices: closest first (mean distance, either direction), each once. */
52
+ function matchLines(as, bs) {
53
+ const pairs = [];
54
+ as.forEach((a, i) => bs.forEach((b, j) => {
55
+ if (!boxesOverlap(a.box, b.box))
56
+ return;
57
+ const forward = meanDistance(a.probe, b.probe, false);
58
+ const backward = meanDistance(a.probe, b.probe, true);
59
+ pairs.push({ a: i, b: j, cost: Math.min(forward, backward), reversed: backward < forward });
60
+ }));
61
+ pairs.sort((p, q) => p.cost - q.cost);
62
+ const usedA = new Set();
63
+ const usedB = new Set();
64
+ const out = [];
65
+ for (const p of pairs) {
66
+ if (usedA.has(p.a) || usedB.has(p.b))
67
+ continue;
68
+ usedA.add(p.a);
69
+ usedB.add(p.b);
70
+ out.push({ a: as[p.a], b: bs[p.b], reversed: p.reversed });
71
+ }
72
+ return out;
73
+ }
74
+ function meanDistance(a, b, reversed) {
75
+ const n = a.length >> 1;
76
+ let sum = 0;
77
+ for (let i = 0; i < n; i++) {
78
+ const j = reversed ? n - 1 - i : i;
79
+ sum += Math.hypot(a[2 * i] - b[2 * j], a[2 * i + 1] - b[2 * j + 1]);
80
+ }
81
+ return sum / n;
82
+ }
83
+ /** `n` points evenly spaced along the polyline, both ends kept. */
84
+ function resample(line, n) {
85
+ const m = line.length >> 1;
86
+ const cumulative = new Float64Array(m);
87
+ for (let i = 1; i < m; i++) {
88
+ cumulative[i] =
89
+ cumulative[i - 1] + Math.hypot(line[2 * i] - line[2 * i - 2], line[2 * i + 1] - line[2 * i - 1]);
90
+ }
91
+ const total = cumulative[m - 1];
92
+ const out = new Float64Array(2 * n);
93
+ let seg = 1;
94
+ for (let i = 0; i < n; i++) {
95
+ const d = n === 1 ? 0 : (total * i) / (n - 1);
96
+ while (seg < m - 1 && cumulative[seg] < d)
97
+ seg++;
98
+ const span = cumulative[seg] - cumulative[seg - 1];
99
+ const t = span > 0 ? Math.min(1, Math.max(0, (d - cumulative[seg - 1]) / span)) : 0;
100
+ out[2 * i] = line[2 * seg - 2] + t * (line[2 * seg] - line[2 * seg - 2]);
101
+ out[2 * i + 1] = line[2 * seg - 1] + t * (line[2 * seg + 1] - line[2 * seg - 1]);
102
+ }
103
+ return out;
104
+ }
105
+ function lineLength(line) {
106
+ let len = 0;
107
+ for (let i = 2; i + 1 < line.length; i += 2)
108
+ len += Math.hypot(line[i] - line[i - 2], line[i + 1] - line[i - 1]);
109
+ return len;
110
+ }
111
+ function lineBox(line) {
112
+ const box = [Infinity, Infinity, -Infinity, -Infinity];
113
+ for (let i = 0; i + 1 < line.length; i += 2) {
114
+ box[0] = Math.min(box[0], line[i]);
115
+ box[1] = Math.min(box[1], line[i + 1]);
116
+ box[2] = Math.max(box[2], line[i]);
117
+ box[3] = Math.max(box[3], line[i + 1]);
118
+ }
119
+ return box;
120
+ }
121
+ /** Whether the boxes overlap, each grown by a tenth of its larger side (a flat line has a thin box). */
122
+ function boxesOverlap(a, b) {
123
+ const ga = 0.1 * Math.max(a[2] - a[0], a[3] - a[1]);
124
+ const gb = 0.1 * Math.max(b[2] - b[0], b[3] - b[1]);
125
+ const g = ga + gb;
126
+ return a[0] - g <= b[2] && b[0] - g <= a[2] && a[1] - g <= b[3] && b[1] - g <= a[3];
127
+ }
128
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9mdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZ2VvbWV0cnkvbG9mdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFlQSwrRkFBK0Y7QUFDL0YsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDO0FBQ3hCLHlEQUF5RDtBQUN6RCxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUM7QUFFeEI7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsTUFBNkIsRUFBRSxJQUFJLEdBQUcsQ0FBQztJQUMvRCxNQUFNLEtBQUssR0FBRyxNQUFNO1NBQ2pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDckUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztTQUM3QixJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QixJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFFMUYsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO0lBQ2hCLEtBQUssTUFBTSxDQUFDLElBQUksS0FBSztRQUFFLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUs7WUFB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Q0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBQ0QsT0FBTyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLENBQUM7QUFFRCxtRUFBbUU7QUFDbkUsU0FBUyxRQUFRLENBQUMsSUFBdUIsRUFBRSxDQUFTO0lBQ2xELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO0lBQzNCLE1BQU0sVUFBVSxHQUFHLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMzQixVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ1gsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRyxDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNoQyxNQUFNLEdBQUcsR0FBRyxJQUFJLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDcEMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQ1osS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzNCLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDOUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ2pELE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEYsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuRixDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsSUFBdUI7SUFDekMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQ1osS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDO1FBQUUsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakgsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsU0FBUyxPQUFPLENBQUMsSUFBdUI7SUFDdEMsTUFBTSxHQUFHLEdBQVEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDNUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUM1QyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsd0dBQXdHO0FBQ3hHLFNBQVMsWUFBWSxDQUFDLENBQU0sRUFBRSxDQUFNO0lBQ2xDLE1BQU0sRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BELE1BQU0sRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BELE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDbEIsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0RixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgc2hlZXQgdGhyb3VnaCBvcGVuIHBvbHlsaW5lcyB0cmFjZWQgb24gYSBzdGFjayBvZiBzbGljZXMgKGEgcmV0aW5hbCBsYXllciBib3VuZGFyeSBvbiBlYWNoXG4gKiBCLXNjYW4sIHNheSk6IGVhY2ggbGluZSBqb2luZWQgdG8gaXRzIGNvdW50ZXJwYXJ0IG9uIHRoZSBuZXh0IHNsaWNlIHRoYXQgaGFzIGxpbmVzIGJ5IGEgc3RyaXAgb2ZcbiAqIHRyaWFuZ2xlcy4gU2xpY2VzIHdpdGhvdXQgbGluZXMgaW4gYmV0d2VlbiBhcmUgYnJpZGdlZCBzdHJhaWdodCBhY3Jvc3MuXG4gKlxuICogUHVyZTogdXNhYmxlIGZyb20gd29ya2Vycy5cbiAqL1xuaW1wb3J0IHR5cGUgeyBNZXNoIH0gZnJvbSAnbmFwYXJpLWpzL2dlb21ldHJ5JztcblxuLyoqIEEgY2xhc3MncyBvcGVuIHBvbHlsaW5lcyBvbiBvbmUgc2xpY2U6IGludGVybGVhdmVkIGB4LCB5YCBpbWFnZSBwaXhlbHMuICovXG5leHBvcnQgaW50ZXJmYWNlIFNsaWNlTGluZXMge1xuICB6OiBudW1iZXI7XG4gIGxpbmVzOiByZWFkb25seSBBcnJheUxpa2U8bnVtYmVyPltdO1xufVxuXG4vKiogUG9pbnRzIHBlciBsaW5lIGF0IG1vc3Q6IHRoZSBsb25nZXN0IGxpbmUgaXMgcmVzYW1wbGVkIGF0IGFib3V0IG9uZSBwb2ludCBwZXIgYHN0ZXBgIHB4LiAqL1xuY29uc3QgTUFYX1BPSU5UUyA9IDIwNDg7XG4vKiogUG9pbnRzIHBlciBsaW5lIHdoZW4gbWF0Y2hpbmcgbGluZXMgYWNyb3NzIHNsaWNlcy4gKi9cbmNvbnN0IE1BVENIX1BPSU5UUyA9IDMyO1xuXG4vKipcbiAqIFRoZSBzaGVldCB0aHJvdWdoIGBzbGljZXNgJyBsaW5lcywgaW4gaW1hZ2UgcGl4ZWxzICh4LCB5KSBhbmQgc2xpY2UgaW5kaWNlcyAoejogc2xpY2UgaydzIGxpbmUgYXRcbiAqIHogPSBrKS4gRXZlcnkgbGluZSBpcyByZXNhbXBsZWQgYXQgdGhlIHNhbWUgbnVtYmVyIG9mIHBvaW50cywgZXZlbmx5IGFsb25nIGl0cyBsZW5ndGggKGFib3V0IG9uZVxuICogcGVyIGBzdGVwYCBweCBvZiB0aGUgbG9uZ2VzdCksIHNvIGEgbGluZSBzaGFyZWQgYnkgdGhlIHN0cmlwcyBhYm92ZSBhbmQgYmVsb3cgaXQgaXMgb25lIHJvdyBvZlxuICogdmVydGljZXMuIExpbmVzIGFyZSBtYXRjaGVkIGJldHdlZW4gbmVpZ2hib3VyaW5nIHNsaWNlcyBjbG9zZXN0IGZpcnN0LCBlYWNoIGF0IG1vc3Qgb25jZSwgYW5kIG9ubHlcbiAqIHdoZW4gdGhlaXIgYm94ZXMgb3ZlcmxhcDsgYSBsaW5lIHdpdGhvdXQgYSBtYXRjaCBlbmRzIHRoZSBzaGVldCB0aGVyZS4gRW1wdHkgd2l0aG91dCB0d28gc2xpY2VzXG4gKiB3aXRoIGxpbmVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9mdExpbmVzKHNsaWNlczogcmVhZG9ubHkgU2xpY2VMaW5lc1tdLCBzdGVwID0gMSk6IE1lc2gge1xuICBjb25zdCBzdGFjayA9IHNsaWNlc1xuICAgIC5tYXAoKHMpID0+ICh7IHo6IHMueiwgbGluZXM6IHMubGluZXMuZmlsdGVyKChsKSA9PiBsLmxlbmd0aCA+PSA0KSB9KSlcbiAgICAuZmlsdGVyKChzKSA9PiBzLmxpbmVzLmxlbmd0aClcbiAgICAuc29ydCgoYSwgYikgPT4gYS56IC0gYi56KTtcbiAgaWYgKHN0YWNrLmxlbmd0aCA8IDIpIHJldHVybiB7IHZlcnRpY2VzOiBuZXcgRmxvYXQzMkFycmF5KDApLCBmYWNlczogbmV3IFVpbnQzMkFycmF5KDApIH07XG5cbiAgbGV0IGxvbmdlc3QgPSAwO1xuICBmb3IgKGNvbnN0IHMgb2Ygc3RhY2spIGZvciAoY29uc3QgbCBvZiBzLmxpbmVzKSBsb25nZXN0ID0gTWF0aC5tYXgobG9uZ2VzdCwgbGluZUxlbmd0aChsKSk7XG4gIGNvbnN0IG4gPSBNYXRoLm1pbihNQVhfUE9JTlRTLCBNYXRoLm1heCgyLCBNYXRoLmNlaWwobG9uZ2VzdCAvIE1hdGgubWF4KHN0ZXAsIDFlLTYpKSArIDEpKTtcblxuICAvLyBFYWNoIGxpbmUncyByZXNhbXBsZWQgcG9pbnRzLCBvbmNlOiByb3dzIG9mIG4gdmVydGljZXMuXG4gIGNvbnN0IHJvd3M6IExpbmVbXVtdID0gW107XG4gIGNvbnN0IHZlcnRzOiBudW1iZXJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHMgb2Ygc3RhY2spIHtcbiAgICByb3dzLnB1c2goXG4gICAgICBzLmxpbmVzLm1hcCgobCkgPT4ge1xuICAgICAgICBjb25zdCBmaXJzdCA9IHZlcnRzLmxlbmd0aCAvIDM7XG4gICAgICAgIGNvbnN0IHB0cyA9IHJlc2FtcGxlKGwsIG4pO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykgdmVydHMucHVzaChwdHNbMiAqIGldLCBwdHNbMiAqIGkgKyAxXSwgcy56KTtcbiAgICAgICAgcmV0dXJuIHsgZmlyc3QsIHByb2JlOiByZXNhbXBsZShsLCBNQVRDSF9QT0lOVFMpLCBib3g6IGxpbmVCb3gobCkgfTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBmYWNlczogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChsZXQgayA9IDA7IGsgKyAxIDwgcm93cy5sZW5ndGg7IGsrKykge1xuICAgIGZvciAoY29uc3QgeyBhLCBiLCByZXZlcnNlZCB9IG9mIG1hdGNoTGluZXMocm93c1trXSwgcm93c1trICsgMV0pKSB7XG4gICAgICBjb25zdCBhdCA9IChpOiBudW1iZXIpID0+IGIuZmlyc3QgKyAocmV2ZXJzZWQgPyBuIC0gMSAtIGkgOiBpKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpICsgMSA8IG47IGkrKykge1xuICAgICAgICBjb25zdCBhMCA9IGEuZmlyc3QgKyBpLFxuICAgICAgICAgIGExID0gYTAgKyAxLFxuICAgICAgICAgIGIwID0gYXQoaSksXG4gICAgICAgICAgYjEgPSBhdChpICsgMSk7XG4gICAgICAgIGZhY2VzLnB1c2goYTAsIGIwLCBhMSwgYTEsIGIwLCBiMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICghZmFjZXMubGVuZ3RoKSByZXR1cm4geyB2ZXJ0aWNlczogbmV3IEZsb2F0MzJBcnJheSgwKSwgZmFjZXM6IG5ldyBVaW50MzJBcnJheSgwKSB9O1xuICByZXR1cm4geyB2ZXJ0aWNlczogRmxvYXQzMkFycmF5LmZyb20odmVydHMpLCBmYWNlczogVWludDMyQXJyYXkuZnJvbShmYWNlcykgfTtcbn1cblxudHlwZSBCb3ggPSBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbmludGVyZmFjZSBMaW5lIHtcbiAgZmlyc3Q6IG51bWJlcjtcbiAgcHJvYmU6IEZsb2F0NjRBcnJheTtcbiAgYm94OiBCb3g7XG59XG5cbi8qKiBQYWlycyBvZiBsaW5lcyBvZiB0d28gbmVpZ2hib3VyaW5nIHNsaWNlczogY2xvc2VzdCBmaXJzdCAobWVhbiBkaXN0YW5jZSwgZWl0aGVyIGRpcmVjdGlvbiksIGVhY2ggb25jZS4gKi9cbmZ1bmN0aW9uIG1hdGNoTGluZXMoYXM6IHJlYWRvbmx5IExpbmVbXSwgYnM6IHJlYWRvbmx5IExpbmVbXSk6IEFycmF5PHsgYTogTGluZTsgYjogTGluZTsgcmV2ZXJzZWQ6IGJvb2xlYW4gfT4ge1xuICBjb25zdCBwYWlyczogQXJyYXk8eyBhOiBudW1iZXI7IGI6IG51bWJlcjsgY29zdDogbnVtYmVyOyByZXZlcnNlZDogYm9vbGVhbiB9PiA9IFtdO1xuICBhcy5mb3JFYWNoKChhLCBpKSA9PlxuICAgIGJzLmZvckVhY2goKGIsIGopID0+IHtcbiAgICAgIGlmICghYm94ZXNPdmVybGFwKGEuYm94LCBiLmJveCkpIHJldHVybjtcbiAgICAgIGNvbnN0IGZvcndhcmQgPSBtZWFuRGlzdGFuY2UoYS5wcm9iZSwgYi5wcm9iZSwgZmFsc2UpO1xuICAgICAgY29uc3QgYmFja3dhcmQgPSBtZWFuRGlzdGFuY2UoYS5wcm9iZSwgYi5wcm9iZSwgdHJ1ZSk7XG4gICAgICBwYWlycy5wdXNoKHsgYTogaSwgYjogaiwgY29zdDogTWF0aC5taW4oZm9yd2FyZCwgYmFja3dhcmQpLCByZXZlcnNlZDogYmFja3dhcmQgPCBmb3J3YXJkIH0pO1xuICAgIH0pLFxuICApO1xuICBwYWlycy5zb3J0KChwLCBxKSA9PiBwLmNvc3QgLSBxLmNvc3QpO1xuICBjb25zdCB1c2VkQSA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICBjb25zdCB1c2VkQiA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICBjb25zdCBvdXQ6IEFycmF5PHsgYTogTGluZTsgYjogTGluZTsgcmV2ZXJzZWQ6IGJvb2xlYW4gfT4gPSBbXTtcbiAgZm9yIChjb25zdCBwIG9mIHBhaXJzKSB7XG4gICAgaWYgKHVzZWRBLmhhcyhwLmEpIHx8IHVzZWRCLmhhcyhwLmIpKSBjb250aW51ZTtcbiAgICB1c2VkQS5hZGQocC5hKTtcbiAgICB1c2VkQi5hZGQocC5iKTtcbiAgICBvdXQucHVzaCh7IGE6IGFzW3AuYV0sIGI6IGJzW3AuYl0sIHJldmVyc2VkOiBwLnJldmVyc2VkIH0pO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbmZ1bmN0aW9uIG1lYW5EaXN0YW5jZShhOiBGbG9hdDY0QXJyYXksIGI6IEZsb2F0NjRBcnJheSwgcmV2ZXJzZWQ6IGJvb2xlYW4pOiBudW1iZXIge1xuICBjb25zdCBuID0gYS5sZW5ndGggPj4gMTtcbiAgbGV0IHN1bSA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgY29uc3QgaiA9IHJldmVyc2VkID8gbiAtIDEgLSBpIDogaTtcbiAgICBzdW0gKz0gTWF0aC5oeXBvdChhWzIgKiBpXSAtIGJbMiAqIGpdLCBhWzIgKiBpICsgMV0gLSBiWzIgKiBqICsgMV0pO1xuICB9XG4gIHJldHVybiBzdW0gLyBuO1xufVxuXG4vKiogYG5gIHBvaW50cyBldmVubHkgc3BhY2VkIGFsb25nIHRoZSBwb2x5bGluZSwgYm90aCBlbmRzIGtlcHQuICovXG5mdW5jdGlvbiByZXNhbXBsZShsaW5lOiBBcnJheUxpa2U8bnVtYmVyPiwgbjogbnVtYmVyKTogRmxvYXQ2NEFycmF5IHtcbiAgY29uc3QgbSA9IGxpbmUubGVuZ3RoID4+IDE7XG4gIGNvbnN0IGN1bXVsYXRpdmUgPSBuZXcgRmxvYXQ2NEFycmF5KG0pO1xuICBmb3IgKGxldCBpID0gMTsgaSA8IG07IGkrKykge1xuICAgIGN1bXVsYXRpdmVbaV0gPVxuICAgICAgY3VtdWxhdGl2ZVtpIC0gMV0gKyBNYXRoLmh5cG90KGxpbmVbMiAqIGldIC0gbGluZVsyICogaSAtIDJdLCBsaW5lWzIgKiBpICsgMV0gLSBsaW5lWzIgKiBpIC0gMV0pO1xuICB9XG4gIGNvbnN0IHRvdGFsID0gY3VtdWxhdGl2ZVttIC0gMV07XG4gIGNvbnN0IG91dCA9IG5ldyBGbG9hdDY0QXJyYXkoMiAqIG4pO1xuICBsZXQgc2VnID0gMTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICBjb25zdCBkID0gbiA9PT0gMSA/IDAgOiAodG90YWwgKiBpKSAvIChuIC0gMSk7XG4gICAgd2hpbGUgKHNlZyA8IG0gLSAxICYmIGN1bXVsYXRpdmVbc2VnXSA8IGQpIHNlZysrO1xuICAgIGNvbnN0IHNwYW4gPSBjdW11bGF0aXZlW3NlZ10gLSBjdW11bGF0aXZlW3NlZyAtIDFdO1xuICAgIGNvbnN0IHQgPSBzcGFuID4gMCA/IE1hdGgubWluKDEsIE1hdGgubWF4KDAsIChkIC0gY3VtdWxhdGl2ZVtzZWcgLSAxXSkgLyBzcGFuKSkgOiAwO1xuICAgIG91dFsyICogaV0gPSBsaW5lWzIgKiBzZWcgLSAyXSArIHQgKiAobGluZVsyICogc2VnXSAtIGxpbmVbMiAqIHNlZyAtIDJdKTtcbiAgICBvdXRbMiAqIGkgKyAxXSA9IGxpbmVbMiAqIHNlZyAtIDFdICsgdCAqIChsaW5lWzIgKiBzZWcgKyAxXSAtIGxpbmVbMiAqIHNlZyAtIDFdKTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG5mdW5jdGlvbiBsaW5lTGVuZ3RoKGxpbmU6IEFycmF5TGlrZTxudW1iZXI+KTogbnVtYmVyIHtcbiAgbGV0IGxlbiA9IDA7XG4gIGZvciAobGV0IGkgPSAyOyBpICsgMSA8IGxpbmUubGVuZ3RoOyBpICs9IDIpIGxlbiArPSBNYXRoLmh5cG90KGxpbmVbaV0gLSBsaW5lW2kgLSAyXSwgbGluZVtpICsgMV0gLSBsaW5lW2kgLSAxXSk7XG4gIHJldHVybiBsZW47XG59XG5cbmZ1bmN0aW9uIGxpbmVCb3gobGluZTogQXJyYXlMaWtlPG51bWJlcj4pOiBCb3gge1xuICBjb25zdCBib3g6IEJveCA9IFtJbmZpbml0eSwgSW5maW5pdHksIC1JbmZpbml0eSwgLUluZmluaXR5XTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgKyAxIDwgbGluZS5sZW5ndGg7IGkgKz0gMikge1xuICAgIGJveFswXSA9IE1hdGgubWluKGJveFswXSwgbGluZVtpXSk7XG4gICAgYm94WzFdID0gTWF0aC5taW4oYm94WzFdLCBsaW5lW2kgKyAxXSk7XG4gICAgYm94WzJdID0gTWF0aC5tYXgoYm94WzJdLCBsaW5lW2ldKTtcbiAgICBib3hbM10gPSBNYXRoLm1heChib3hbM10sIGxpbmVbaSArIDFdKTtcbiAgfVxuICByZXR1cm4gYm94O1xufVxuXG4vKiogV2hldGhlciB0aGUgYm94ZXMgb3ZlcmxhcCwgZWFjaCBncm93biBieSBhIHRlbnRoIG9mIGl0cyBsYXJnZXIgc2lkZSAoYSBmbGF0IGxpbmUgaGFzIGEgdGhpbiBib3gpLiAqL1xuZnVuY3Rpb24gYm94ZXNPdmVybGFwKGE6IEJveCwgYjogQm94KTogYm9vbGVhbiB7XG4gIGNvbnN0IGdhID0gMC4xICogTWF0aC5tYXgoYVsyXSAtIGFbMF0sIGFbM10gLSBhWzFdKTtcbiAgY29uc3QgZ2IgPSAwLjEgKiBNYXRoLm1heChiWzJdIC0gYlswXSwgYlszXSAtIGJbMV0pO1xuICBjb25zdCBnID0gZ2EgKyBnYjtcbiAgcmV0dXJuIGFbMF0gLSBnIDw9IGJbMl0gJiYgYlswXSAtIGcgPD0gYVsyXSAmJiBhWzFdIC0gZyA8PSBiWzNdICYmIGJbMV0gLSBnIDw9IGFbM107XG59XG4iXX0=
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Where to put a label inside a polygon: its pole of inaccessibility, the inside point farthest
3
+ * from every edge (Garcia-Castellanos & Lombardo's grid search, as in Mapbox's polylabel). Unlike
4
+ * the centroid it is always inside, also for a U-shaped or ring-shaped region.
5
+ *
6
+ * Pure: usable from workers.
7
+ */
8
+ /**
9
+ * The pole of inaccessibility of `rings`, to within `precision` (default: 1/100 of the shorter
10
+ * side of the exterior's box, at least 0.5). Null for an exterior with fewer than three vertices.
11
+ */
12
+ export function polylabel(rings, precision) {
13
+ const outer = rings[0];
14
+ if (!outer || outer.length < 6)
15
+ return null;
16
+ let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
17
+ for (let i = 0; i + 1 < outer.length; i += 2) {
18
+ if (outer[i] < minX)
19
+ minX = outer[i];
20
+ if (outer[i] > maxX)
21
+ maxX = outer[i];
22
+ if (outer[i + 1] < minY)
23
+ minY = outer[i + 1];
24
+ if (outer[i + 1] > maxY)
25
+ maxY = outer[i + 1];
26
+ }
27
+ const width = maxX - minX;
28
+ const height = maxY - minY;
29
+ const cellSize = Math.min(width, height);
30
+ const eps = precision ?? Math.max(0.5, cellSize / 100);
31
+ if (cellSize <= 0)
32
+ return { x: minX, y: minY, distance: 0 };
33
+ const cell = (x, y, h) => {
34
+ const d = signedDistance(x, y, rings);
35
+ return { x, y, h, d, max: d + h * Math.SQRT2 };
36
+ };
37
+ const queue = new MaxHeap();
38
+ const h = cellSize / 2;
39
+ for (let x = minX; x < maxX; x += cellSize) {
40
+ for (let y = minY; y < maxY; y += cellSize)
41
+ queue.push(cell(x + h, y + h, h));
42
+ }
43
+ // The centroid of the box is a good first guess, the area centroid often a better one.
44
+ let best = cell(minX + width / 2, minY + height / 2, 0);
45
+ const centroid = areaCentroid(outer);
46
+ if (centroid) {
47
+ const c = cell(centroid[0], centroid[1], 0);
48
+ if (c.d > best.d)
49
+ best = c;
50
+ }
51
+ let guard = 0;
52
+ while (queue.size && guard++ < 10_000) {
53
+ const c = queue.pop();
54
+ if (c.d > best.d)
55
+ best = c;
56
+ if (c.max - best.d <= eps)
57
+ continue;
58
+ const q = c.h / 2;
59
+ queue.push(cell(c.x - q, c.y - q, q));
60
+ queue.push(cell(c.x + q, c.y - q, q));
61
+ queue.push(cell(c.x - q, c.y + q, q));
62
+ queue.push(cell(c.x + q, c.y + q, q));
63
+ }
64
+ return { x: best.x, y: best.y, distance: Math.max(0, best.d) };
65
+ }
66
+ /** Distance from (x, y) to the nearest edge of `rings`, positive inside (even-odd), negative outside. */
67
+ export function signedDistance(x, y, rings) {
68
+ let inside = false;
69
+ let min = Infinity;
70
+ for (const r of rings) {
71
+ const n = r.length >> 1;
72
+ for (let i = 0, j = n - 1; i < n; j = i++) {
73
+ const ax = r[2 * i], ay = r[2 * i + 1], bx = r[2 * j], by = r[2 * j + 1];
74
+ if (ay > y !== by > y && x < ((bx - ax) * (y - ay)) / (by - ay) + ax)
75
+ inside = !inside;
76
+ const d = segmentDistanceSq(x, y, ax, ay, bx, by);
77
+ if (d < min)
78
+ min = d;
79
+ }
80
+ }
81
+ return (inside ? 1 : -1) * Math.sqrt(min);
82
+ }
83
+ function segmentDistanceSq(px, py, ax, ay, bx, by) {
84
+ let x = ax, y = ay;
85
+ let dx = bx - x, dy = by - y;
86
+ if (dx !== 0 || dy !== 0) {
87
+ const t = ((px - x) * dx + (py - y) * dy) / (dx * dx + dy * dy);
88
+ if (t > 1) {
89
+ x = bx;
90
+ y = by;
91
+ }
92
+ else if (t > 0) {
93
+ x += dx * t;
94
+ y += dy * t;
95
+ }
96
+ }
97
+ dx = px - x;
98
+ dy = py - y;
99
+ return dx * dx + dy * dy;
100
+ }
101
+ /** The area centroid of one ring, or null for a degenerate one. */
102
+ function areaCentroid(r) {
103
+ const n = r.length >> 1;
104
+ let area = 0, cx = 0, cy = 0;
105
+ for (let i = 0, j = n - 1; i < n; j = i++) {
106
+ const f = r[2 * i] * r[2 * j + 1] - r[2 * j] * r[2 * i + 1];
107
+ cx += (r[2 * i] + r[2 * j]) * f;
108
+ cy += (r[2 * i + 1] + r[2 * j + 1]) * f;
109
+ area += f * 3;
110
+ }
111
+ return area === 0 ? null : [cx / area, cy / area];
112
+ }
113
+ /** A binary max-heap of cells by `max`. */
114
+ class MaxHeap {
115
+ constructor() {
116
+ this.items = [];
117
+ }
118
+ get size() {
119
+ return this.items.length;
120
+ }
121
+ push(c) {
122
+ const a = this.items;
123
+ a.push(c);
124
+ let i = a.length - 1;
125
+ while (i > 0) {
126
+ const p = (i - 1) >> 1;
127
+ if (a[p].max >= a[i].max)
128
+ break;
129
+ [a[p], a[i]] = [a[i], a[p]];
130
+ i = p;
131
+ }
132
+ }
133
+ pop() {
134
+ const a = this.items;
135
+ const top = a[0];
136
+ const last = a.pop();
137
+ if (a.length && last) {
138
+ a[0] = last;
139
+ let i = 0;
140
+ for (;;) {
141
+ const l = 2 * i + 1, r = l + 1;
142
+ let m = i;
143
+ if (l < a.length && a[l].max > a[m].max)
144
+ m = l;
145
+ if (r < a.length && a[r].max > a[m].max)
146
+ m = r;
147
+ if (m === i)
148
+ break;
149
+ [a[m], a[i]] = [a[i], a[m]];
150
+ i = m;
151
+ }
152
+ }
153
+ return top;
154
+ }
155
+ }
156
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9seWxhYmVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9nZW9tZXRyeS9wb2x5bGFiZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBd0JIOzs7R0FHRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsS0FBZ0IsRUFBRSxTQUFrQjtJQUM1RCxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkIsSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUM1QyxJQUFJLElBQUksR0FBRyxRQUFRLEVBQ2pCLElBQUksR0FBRyxRQUFRLEVBQ2YsSUFBSSxHQUFHLENBQUMsUUFBUSxFQUNoQixJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUM7SUFDbkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUM3QyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJO1lBQUUsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJO1lBQUUsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQyxJQUFJLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSTtZQUFFLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzdDLElBQUksS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJO1lBQUUsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7SUFDMUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztJQUMzQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN6QyxNQUFNLEdBQUcsR0FBRyxTQUFTLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZELElBQUksUUFBUSxJQUFJLENBQUM7UUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUU1RCxNQUFNLElBQUksR0FBRyxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsQ0FBUyxFQUFRLEVBQUU7UUFDckQsTUFBTSxDQUFDLEdBQUcsY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdEMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDakQsQ0FBQyxDQUFDO0lBQ0YsTUFBTSxLQUFLLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUM1QixNQUFNLENBQUMsR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZCLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQzNDLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxJQUFJLFFBQVE7WUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBQ0QsdUZBQXVGO0lBQ3ZGLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4RCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckMsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUNiLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztZQUFFLElBQUksR0FBRyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUNELElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNkLE9BQU8sS0FBSyxDQUFDLElBQUksSUFBSSxLQUFLLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQztRQUN0QyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFVLENBQUM7UUFDOUIsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxHQUFHO1lBQUUsU0FBUztRQUNwQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQixLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFDRCxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pFLENBQUM7QUFFRCx5R0FBeUc7QUFDekcsTUFBTSxVQUFVLGNBQWMsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLEtBQWdCO0lBQ25FLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztJQUNuQixJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUM7SUFDbkIsS0FBSyxNQUFNLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN0QixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUN4QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQ2pCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFDakIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRTtnQkFBRSxNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUM7WUFDdkYsTUFBTSxDQUFDLEdBQUcsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsR0FBRyxHQUFHO2dCQUFFLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDdkIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM1QyxDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVU7SUFDL0YsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUNSLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDVCxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUNiLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6QixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ1YsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNQLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDVCxDQUFDO2FBQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDakIsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDWixDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBQ0QsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDWixFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNaLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzNCLENBQUM7QUFFRCxtRUFBbUU7QUFDbkUsU0FBUyxZQUFZLENBQUMsQ0FBb0I7SUFDeEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7SUFDeEIsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUNWLEVBQUUsR0FBRyxDQUFDLEVBQ04sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNULEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDMUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzVELEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNoQixDQUFDO0lBQ0QsT0FBTyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDcEQsQ0FBQztBQUVELDJDQUEyQztBQUMzQyxNQUFNLE9BQU87SUFBYjtRQUNtQixVQUFLLEdBQVcsRUFBRSxDQUFDO0lBc0N0QyxDQUFDO0lBcENDLElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDM0IsQ0FBQztJQUVELElBQUksQ0FBQyxDQUFPO1FBQ1YsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNyQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDckIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDYixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkIsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHO2dCQUFFLE1BQU07WUFDaEMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNSLENBQUM7SUFDSCxDQUFDO0lBRUQsR0FBRztRQUNELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDckIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pCLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksSUFBSSxFQUFFLENBQUM7WUFDckIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztZQUNaLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNWLFNBQVMsQ0FBQztnQkFDUixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFDakIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ1osSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNWLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRztvQkFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMvQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUc7b0JBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDL0MsSUFBSSxDQUFDLEtBQUssQ0FBQztvQkFBRSxNQUFNO2dCQUNuQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNSLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFdoZXJlIHRvIHB1dCBhIGxhYmVsIGluc2lkZSBhIHBvbHlnb246IGl0cyBwb2xlIG9mIGluYWNjZXNzaWJpbGl0eSwgdGhlIGluc2lkZSBwb2ludCBmYXJ0aGVzdFxuICogZnJvbSBldmVyeSBlZGdlIChHYXJjaWEtQ2FzdGVsbGFub3MgJiBMb21iYXJkbydzIGdyaWQgc2VhcmNoLCBhcyBpbiBNYXBib3gncyBwb2x5bGFiZWwpLiBVbmxpa2VcbiAqIHRoZSBjZW50cm9pZCBpdCBpcyBhbHdheXMgaW5zaWRlLCBhbHNvIGZvciBhIFUtc2hhcGVkIG9yIHJpbmctc2hhcGVkIHJlZ2lvbi5cbiAqXG4gKiBQdXJlOiB1c2FibGUgZnJvbSB3b3JrZXJzLlxuICovXG5cbi8qKiBBIHBvbHlnb24gYXMgaW50ZXJsZWF2ZWQgYHgsIHlgIHJpbmdzOiB0aGUgZXh0ZXJpb3IgZmlyc3QsIHRoZW4gaXRzIGhvbGVzLiAqL1xuZXhwb3J0IHR5cGUgRmxhdFJpbmdzID0gcmVhZG9ubHkgQXJyYXlMaWtlPG51bWJlcj5bXTtcblxuLyoqIFRoZSBwb2xlIG9mIGluYWNjZXNzaWJpbGl0eSBgW3gsIHldYCBhbmQgaXRzIGRpc3RhbmNlIHRvIHRoZSBuZWFyZXN0IGVkZ2UuICovXG5leHBvcnQgaW50ZXJmYWNlIExhYmVsUG9pbnQge1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbiAgLyoqIERpc3RhbmNlIGZyb20gdGhlIHBvaW50IHRvIHRoZSBuZWFyZXN0IGVkZ2U6IGhvdyBtdWNoIHJvb20gYSBsYWJlbCBoYXMgYXJvdW5kIGl0LiAqL1xuICBkaXN0YW5jZTogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgQ2VsbCB7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xuICAvKiogSGFsZiB0aGUgY2VsbCdzIGVkZ2UuICovXG4gIGg6IG51bWJlcjtcbiAgLyoqIFNpZ25lZCBkaXN0YW5jZSBmcm9tIHRoZSBjZW50cmUgdG8gdGhlIHBvbHlnb24gKHBvc2l0aXZlIGluc2lkZSkuICovXG4gIGQ6IG51bWJlcjtcbiAgLyoqIFRoZSBiZXN0IGRpc3RhbmNlIGFueSBwb2ludCBvZiB0aGUgY2VsbCBjYW4gcmVhY2guICovXG4gIG1heDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoZSBwb2xlIG9mIGluYWNjZXNzaWJpbGl0eSBvZiBgcmluZ3NgLCB0byB3aXRoaW4gYHByZWNpc2lvbmAgKGRlZmF1bHQ6IDEvMTAwIG9mIHRoZSBzaG9ydGVyXG4gKiBzaWRlIG9mIHRoZSBleHRlcmlvcidzIGJveCwgYXQgbGVhc3QgMC41KS4gTnVsbCBmb3IgYW4gZXh0ZXJpb3Igd2l0aCBmZXdlciB0aGFuIHRocmVlIHZlcnRpY2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcG9seWxhYmVsKHJpbmdzOiBGbGF0UmluZ3MsIHByZWNpc2lvbj86IG51bWJlcik6IExhYmVsUG9pbnQgfCBudWxsIHtcbiAgY29uc3Qgb3V0ZXIgPSByaW5nc1swXTtcbiAgaWYgKCFvdXRlciB8fCBvdXRlci5sZW5ndGggPCA2KSByZXR1cm4gbnVsbDtcbiAgbGV0IG1pblggPSBJbmZpbml0eSxcbiAgICBtaW5ZID0gSW5maW5pdHksXG4gICAgbWF4WCA9IC1JbmZpbml0eSxcbiAgICBtYXhZID0gLUluZmluaXR5O1xuICBmb3IgKGxldCBpID0gMDsgaSArIDEgPCBvdXRlci5sZW5ndGg7IGkgKz0gMikge1xuICAgIGlmIChvdXRlcltpXSA8IG1pblgpIG1pblggPSBvdXRlcltpXTtcbiAgICBpZiAob3V0ZXJbaV0gPiBtYXhYKSBtYXhYID0gb3V0ZXJbaV07XG4gICAgaWYgKG91dGVyW2kgKyAxXSA8IG1pblkpIG1pblkgPSBvdXRlcltpICsgMV07XG4gICAgaWYgKG91dGVyW2kgKyAxXSA+IG1heFkpIG1heFkgPSBvdXRlcltpICsgMV07XG4gIH1cbiAgY29uc3Qgd2lkdGggPSBtYXhYIC0gbWluWDtcbiAgY29uc3QgaGVpZ2h0ID0gbWF4WSAtIG1pblk7XG4gIGNvbnN0IGNlbGxTaXplID0gTWF0aC5taW4od2lkdGgsIGhlaWdodCk7XG4gIGNvbnN0IGVwcyA9IHByZWNpc2lvbiA/PyBNYXRoLm1heCgwLjUsIGNlbGxTaXplIC8gMTAwKTtcbiAgaWYgKGNlbGxTaXplIDw9IDApIHJldHVybiB7IHg6IG1pblgsIHk6IG1pblksIGRpc3RhbmNlOiAwIH07XG5cbiAgY29uc3QgY2VsbCA9ICh4OiBudW1iZXIsIHk6IG51bWJlciwgaDogbnVtYmVyKTogQ2VsbCA9PiB7XG4gICAgY29uc3QgZCA9IHNpZ25lZERpc3RhbmNlKHgsIHksIHJpbmdzKTtcbiAgICByZXR1cm4geyB4LCB5LCBoLCBkLCBtYXg6IGQgKyBoICogTWF0aC5TUVJUMiB9O1xuICB9O1xuICBjb25zdCBxdWV1ZSA9IG5ldyBNYXhIZWFwKCk7XG4gIGNvbnN0IGggPSBjZWxsU2l6ZSAvIDI7XG4gIGZvciAobGV0IHggPSBtaW5YOyB4IDwgbWF4WDsgeCArPSBjZWxsU2l6ZSkge1xuICAgIGZvciAobGV0IHkgPSBtaW5ZOyB5IDwgbWF4WTsgeSArPSBjZWxsU2l6ZSkgcXVldWUucHVzaChjZWxsKHggKyBoLCB5ICsgaCwgaCkpO1xuICB9XG4gIC8vIFRoZSBjZW50cm9pZCBvZiB0aGUgYm94IGlzIGEgZ29vZCBmaXJzdCBndWVzcywgdGhlIGFyZWEgY2VudHJvaWQgb2Z0ZW4gYSBiZXR0ZXIgb25lLlxuICBsZXQgYmVzdCA9IGNlbGwobWluWCArIHdpZHRoIC8gMiwgbWluWSArIGhlaWdodCAvIDIsIDApO1xuICBjb25zdCBjZW50cm9pZCA9IGFyZWFDZW50cm9pZChvdXRlcik7XG4gIGlmIChjZW50cm9pZCkge1xuICAgIGNvbnN0IGMgPSBjZWxsKGNlbnRyb2lkWzBdLCBjZW50cm9pZFsxXSwgMCk7XG4gICAgaWYgKGMuZCA+IGJlc3QuZCkgYmVzdCA9IGM7XG4gIH1cbiAgbGV0IGd1YXJkID0gMDtcbiAgd2hpbGUgKHF1ZXVlLnNpemUgJiYgZ3VhcmQrKyA8IDEwXzAwMCkge1xuICAgIGNvbnN0IGMgPSBxdWV1ZS5wb3AoKSBhcyBDZWxsO1xuICAgIGlmIChjLmQgPiBiZXN0LmQpIGJlc3QgPSBjO1xuICAgIGlmIChjLm1heCAtIGJlc3QuZCA8PSBlcHMpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHEgPSBjLmggLyAyO1xuICAgIHF1ZXVlLnB1c2goY2VsbChjLnggLSBxLCBjLnkgLSBxLCBxKSk7XG4gICAgcXVldWUucHVzaChjZWxsKGMueCArIHEsIGMueSAtIHEsIHEpKTtcbiAgICBxdWV1ZS5wdXNoKGNlbGwoYy54IC0gcSwgYy55ICsgcSwgcSkpO1xuICAgIHF1ZXVlLnB1c2goY2VsbChjLnggKyBxLCBjLnkgKyBxLCBxKSk7XG4gIH1cbiAgcmV0dXJuIHsgeDogYmVzdC54LCB5OiBiZXN0LnksIGRpc3RhbmNlOiBNYXRoLm1heCgwLCBiZXN0LmQpIH07XG59XG5cbi8qKiBEaXN0YW5jZSBmcm9tICh4LCB5KSB0byB0aGUgbmVhcmVzdCBlZGdlIG9mIGByaW5nc2AsIHBvc2l0aXZlIGluc2lkZSAoZXZlbi1vZGQpLCBuZWdhdGl2ZSBvdXRzaWRlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25lZERpc3RhbmNlKHg6IG51bWJlciwgeTogbnVtYmVyLCByaW5nczogRmxhdFJpbmdzKTogbnVtYmVyIHtcbiAgbGV0IGluc2lkZSA9IGZhbHNlO1xuICBsZXQgbWluID0gSW5maW5pdHk7XG4gIGZvciAoY29uc3QgciBvZiByaW5ncykge1xuICAgIGNvbnN0IG4gPSByLmxlbmd0aCA+PiAxO1xuICAgIGZvciAobGV0IGkgPSAwLCBqID0gbiAtIDE7IGkgPCBuOyBqID0gaSsrKSB7XG4gICAgICBjb25zdCBheCA9IHJbMiAqIGldLFxuICAgICAgICBheSA9IHJbMiAqIGkgKyAxXSxcbiAgICAgICAgYnggPSByWzIgKiBqXSxcbiAgICAgICAgYnkgPSByWzIgKiBqICsgMV07XG4gICAgICBpZiAoYXkgPiB5ICE9PSBieSA+IHkgJiYgeCA8ICgoYnggLSBheCkgKiAoeSAtIGF5KSkgLyAoYnkgLSBheSkgKyBheCkgaW5zaWRlID0gIWluc2lkZTtcbiAgICAgIGNvbnN0IGQgPSBzZWdtZW50RGlzdGFuY2VTcSh4LCB5LCBheCwgYXksIGJ4LCBieSk7XG4gICAgICBpZiAoZCA8IG1pbikgbWluID0gZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIChpbnNpZGUgPyAxIDogLTEpICogTWF0aC5zcXJ0KG1pbik7XG59XG5cbmZ1bmN0aW9uIHNlZ21lbnREaXN0YW5jZVNxKHB4OiBudW1iZXIsIHB5OiBudW1iZXIsIGF4OiBudW1iZXIsIGF5OiBudW1iZXIsIGJ4OiBudW1iZXIsIGJ5OiBudW1iZXIpOiBudW1iZXIge1xuICBsZXQgeCA9IGF4LFxuICAgIHkgPSBheTtcbiAgbGV0IGR4ID0gYnggLSB4LFxuICAgIGR5ID0gYnkgLSB5O1xuICBpZiAoZHggIT09IDAgfHwgZHkgIT09IDApIHtcbiAgICBjb25zdCB0ID0gKChweCAtIHgpICogZHggKyAocHkgLSB5KSAqIGR5KSAvIChkeCAqIGR4ICsgZHkgKiBkeSk7XG4gICAgaWYgKHQgPiAxKSB7XG4gICAgICB4ID0gYng7XG4gICAgICB5ID0gYnk7XG4gICAgfSBlbHNlIGlmICh0ID4gMCkge1xuICAgICAgeCArPSBkeCAqIHQ7XG4gICAgICB5ICs9IGR5ICogdDtcbiAgICB9XG4gIH1cbiAgZHggPSBweCAtIHg7XG4gIGR5ID0gcHkgLSB5O1xuICByZXR1cm4gZHggKiBkeCArIGR5ICogZHk7XG59XG5cbi8qKiBUaGUgYXJlYSBjZW50cm9pZCBvZiBvbmUgcmluZywgb3IgbnVsbCBmb3IgYSBkZWdlbmVyYXRlIG9uZS4gKi9cbmZ1bmN0aW9uIGFyZWFDZW50cm9pZChyOiBBcnJheUxpa2U8bnVtYmVyPik6IFtudW1iZXIsIG51bWJlcl0gfCBudWxsIHtcbiAgY29uc3QgbiA9IHIubGVuZ3RoID4+IDE7XG4gIGxldCBhcmVhID0gMCxcbiAgICBjeCA9IDAsXG4gICAgY3kgPSAwO1xuICBmb3IgKGxldCBpID0gMCwgaiA9IG4gLSAxOyBpIDwgbjsgaiA9IGkrKykge1xuICAgIGNvbnN0IGYgPSByWzIgKiBpXSAqIHJbMiAqIGogKyAxXSAtIHJbMiAqIGpdICogclsyICogaSArIDFdO1xuICAgIGN4ICs9IChyWzIgKiBpXSArIHJbMiAqIGpdKSAqIGY7XG4gICAgY3kgKz0gKHJbMiAqIGkgKyAxXSArIHJbMiAqIGogKyAxXSkgKiBmO1xuICAgIGFyZWEgKz0gZiAqIDM7XG4gIH1cbiAgcmV0dXJuIGFyZWEgPT09IDAgPyBudWxsIDogW2N4IC8gYXJlYSwgY3kgLyBhcmVhXTtcbn1cblxuLyoqIEEgYmluYXJ5IG1heC1oZWFwIG9mIGNlbGxzIGJ5IGBtYXhgLiAqL1xuY2xhc3MgTWF4SGVhcCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaXRlbXM6IENlbGxbXSA9IFtdO1xuXG4gIGdldCBzaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXMubGVuZ3RoO1xuICB9XG5cbiAgcHVzaChjOiBDZWxsKTogdm9pZCB7XG4gICAgY29uc3QgYSA9IHRoaXMuaXRlbXM7XG4gICAgYS5wdXNoKGMpO1xuICAgIGxldCBpID0gYS5sZW5ndGggLSAxO1xuICAgIHdoaWxlIChpID4gMCkge1xuICAgICAgY29uc3QgcCA9IChpIC0gMSkgPj4gMTtcbiAgICAgIGlmIChhW3BdLm1heCA+PSBhW2ldLm1heCkgYnJlYWs7XG4gICAgICBbYVtwXSwgYVtpXV0gPSBbYVtpXSwgYVtwXV07XG4gICAgICBpID0gcDtcbiAgICB9XG4gIH1cblxuICBwb3AoKTogQ2VsbCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgYSA9IHRoaXMuaXRlbXM7XG4gICAgY29uc3QgdG9wID0gYVswXTtcbiAgICBjb25zdCBsYXN0ID0gYS5wb3AoKTtcbiAgICBpZiAoYS5sZW5ndGggJiYgbGFzdCkge1xuICAgICAgYVswXSA9IGxhc3Q7XG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIGNvbnN0IGwgPSAyICogaSArIDEsXG4gICAgICAgICAgciA9IGwgKyAxO1xuICAgICAgICBsZXQgbSA9IGk7XG4gICAgICAgIGlmIChsIDwgYS5sZW5ndGggJiYgYVtsXS5tYXggPiBhW21dLm1heCkgbSA9IGw7XG4gICAgICAgIGlmIChyIDwgYS5sZW5ndGggJiYgYVtyXS5tYXggPiBhW21dLm1heCkgbSA9IHI7XG4gICAgICAgIGlmIChtID09PSBpKSBicmVhaztcbiAgICAgICAgW2FbbV0sIGFbaV1dID0gW2FbaV0sIGFbbV1dO1xuICAgICAgICBpID0gbTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvcDtcbiAgfVxufVxuIl19
@@ -0,0 +1,98 @@
1
+ import { rasterizePolygon as rasterizeRing } from 'napari-js/geometry';
2
+ /**
3
+ * The largest bbox (in pixels) {@link rasterizePolygon} allocates before it
4
+ * falls back to clipping at the window. Also the cap the wand/brush use to
5
+ * decide whether a region can be edited at the current zoom.
6
+ */
7
+ export const MAX_RASTER_PIXELS = 4096 * 4096;
8
+ /** `[x0, y0, x1, y1, …]` from parallel arrays, the ring layout napari-js takes. */
9
+ function flatRing(xs, ys) {
10
+ const out = new Array(xs.length * 2);
11
+ for (let i = 0; i < xs.length; i++) {
12
+ out[i * 2] = xs[i];
13
+ out[i * 2 + 1] = ys[i];
14
+ }
15
+ return out;
16
+ }
17
+ /**
18
+ * Rasterize a closed polygon (minus its holes) into a bbox-relative mask, e.g.
19
+ * as the starting point for a wand/brush stroke accumulator.
20
+ *
21
+ * Pixel (px, py) covers `[px, px + 1) × [py, py + 1)` and is set when its centre
22
+ * is inside — the rule under which the pixel-edge outlines `geometry/contour`
23
+ * traces come back as exactly the pixels they were traced from.
24
+ *
25
+ * Returns the bbox origin plus the filled mask, or null if the polygon is
26
+ * degenerate (covers no pixel centre). The polygon's full extent is kept even
27
+ * where it is negative or exceeds `imageWidth`×`imageHeight` (jit-ui#102); only
28
+ * a bbox larger than {@link MAX_RASTER_PIXELS} is clipped to that window (rare:
29
+ * a region enormous at the current zoom; accepts the clip).
30
+ */
31
+ export function rasterizePolygon(xpoints, ypoints, imageWidth, imageHeight, holes) {
32
+ if (xpoints.length < 3)
33
+ return null;
34
+ const outer = flatRing(xpoints, ypoints);
35
+ const inner = holes?.map((ring) => flatRing(ring.map((p) => p[0]), ring.map((p) => p[1])));
36
+ const bounds = { x: 0, y: 0, width: imageWidth, height: imageHeight };
37
+ let m;
38
+ try {
39
+ m = rasterizeRing(outer, inner, { bounds, maxPixels: MAX_RASTER_PIXELS });
40
+ }
41
+ catch (err) {
42
+ // Still over the cap once clipped to the window (a large export mask): allocate the clip.
43
+ if (!(err instanceof RangeError))
44
+ throw err;
45
+ m = rasterizeRing(outer, inner, { bounds, clip: true, maxPixels: Infinity });
46
+ }
47
+ return m && { bx: m.x, by: m.y, bw: m.width, bh: m.height, mask: m.data };
48
+ }
49
+ /** Returns true if the two bbox-relative masks share at least one set pixel. */
50
+ export function masksOverlap(a, b) {
51
+ const ix0 = Math.max(a.bx, b.bx);
52
+ const iy0 = Math.max(a.by, b.by);
53
+ const ix1 = Math.min(a.bx + a.bw, b.bx + b.bw);
54
+ const iy1 = Math.min(a.by + a.bh, b.by + b.bh);
55
+ if (ix0 >= ix1 || iy0 >= iy1)
56
+ return false;
57
+ for (let y = iy0; y < iy1; y++) {
58
+ const ar = (y - a.by) * a.bw;
59
+ const br = (y - b.by) * b.bw;
60
+ for (let x = ix0; x < ix1; x++) {
61
+ if (a.mask[ar + (x - a.bx)] && b.mask[br + (x - b.bx)])
62
+ return true;
63
+ }
64
+ }
65
+ return false;
66
+ }
67
+ /**
68
+ * Allocate a fresh accumulator covering both masks and OR them in. The
69
+ * resulting mask's bbox is the smallest rectangle containing both inputs.
70
+ */
71
+ export function unionMasks(a, b) {
72
+ const ux0 = Math.min(a.bx, b.bx);
73
+ const uy0 = Math.min(a.by, b.by);
74
+ const ux1 = Math.max(a.bx + a.bw, b.bx + b.bw);
75
+ const uy1 = Math.max(a.by + a.bh, b.by + b.bh);
76
+ const ubw = ux1 - ux0;
77
+ const ubh = uy1 - uy0;
78
+ const umask = new Uint8Array(ubw * ubh);
79
+ const dax = a.bx - ux0;
80
+ const day = a.by - uy0;
81
+ for (let row = 0; row < a.bh; row++) {
82
+ const src = row * a.bw;
83
+ const dst = (row + day) * ubw + dax;
84
+ umask.set(a.mask.subarray(src, src + a.bw), dst);
85
+ }
86
+ const dbx = b.bx - ux0;
87
+ const dby = b.by - uy0;
88
+ for (let row = 0; row < b.bh; row++) {
89
+ const srcRow = row * b.bw;
90
+ const dstRow = (row + dby) * ubw;
91
+ for (let col = 0; col < b.bw; col++) {
92
+ if (b.mask[srcRow + col])
93
+ umask[dstRow + (dbx + col)] = 1;
94
+ }
95
+ }
96
+ return { bx: ux0, by: uy0, bw: ubw, bh: ubh, mask: umask };
97
+ }
98
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFzdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9nZW9tZXRyeS9yYXN0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixJQUFJLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBa0J2RTs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUU3QyxtRkFBbUY7QUFDbkYsU0FBUyxRQUFRLENBQUMsRUFBcUIsRUFBRSxFQUFxQjtJQUM1RCxNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBUyxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzdDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDbkMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkIsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUM5QixPQUFpQixFQUNqQixPQUFpQixFQUNqQixVQUFrQixFQUNsQixXQUFtQixFQUNuQixLQUFvQjtJQUVwQixJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3BDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDekMsTUFBTSxLQUFLLEdBQUcsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQ2hDLFFBQVEsQ0FDTixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDckIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3RCLENBQ0YsQ0FBQztJQUNGLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxDQUFDO0lBQ3RFLElBQUksQ0FBbUMsQ0FBQztJQUN4QyxJQUFJLENBQUM7UUFDSCxDQUFDLEdBQUcsYUFBYSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLDBGQUEwRjtRQUMxRixJQUFJLENBQUMsQ0FBQyxHQUFHLFlBQVksVUFBVSxDQUFDO1lBQUUsTUFBTSxHQUFHLENBQUM7UUFDNUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUNELE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUM1RSxDQUFDO0FBRUQsZ0ZBQWdGO0FBQ2hGLE1BQU0sVUFBVSxZQUFZLENBQUMsQ0FBVyxFQUFFLENBQVc7SUFDbkQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNqQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQy9DLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQy9DLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzNDLEtBQUssSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMvQixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM3QixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM3QixLQUFLLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQUUsT0FBTyxJQUFJLENBQUM7UUFDdEUsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUFDLENBQVcsRUFBRSxDQUFXO0lBQ2pELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDakMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNqQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMvQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMvQyxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQ3RCLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDdEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBRXhDLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO0lBQ3ZCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO0lBQ3ZCLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7UUFDcEMsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdkIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNwQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFDRCxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztJQUN2QixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztJQUN2QixLQUFLLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzFCLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNqQyxLQUFLLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO2dCQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUQsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDN0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJhc3Rlcml6ZVBvbHlnb24gYXMgcmFzdGVyaXplUmluZyB9IGZyb20gJ25hcGFyaS1qcy9nZW9tZXRyeSc7XG5cbi8qKlxuICogUHVyZSBiaW5hcnktbWFzayBoZWxwZXJzOiBwb2x5Z29uIHJhc3Rlcml6YXRpb24gKG5hcGFyaS1qcydzIGByYXN0ZXJpemVQb2x5Z29uYClcbiAqIGFuZCBiYm94LXJlbGF0aXZlIG1hc2sgc2V0IG9wZXJhdGlvbnMuIE5vIERPTSwgbm8gQW5ndWxhciDigJQgdGhlIG1hc2stZXhwb3J0XG4gKiB3b3JrZXIgaW1wb3J0cyB0aGlzLlxuICovXG5cbi8qKiBBIGJib3gtcmVsYXRpdmUgYmluYXJ5IG1hc2sgKDEgPSBmaWxsZWQsIDAgPSBlbXB0eSkgd2hvc2UgcGl4ZWwgKDAsMCkgc2l0c1xuICogIGF0IChieCwgYnkpIGluIHRoZSBmcmFtZSBpdCB3YXMgcmFzdGVyaXplZCBpbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQkJveE1hc2sge1xuICBieDogbnVtYmVyO1xuICBieTogbnVtYmVyO1xuICBidzogbnVtYmVyO1xuICBiaDogbnVtYmVyO1xuICBtYXNrOiBVaW50OEFycmF5O1xufVxuXG4vKipcbiAqIFRoZSBsYXJnZXN0IGJib3ggKGluIHBpeGVscykge0BsaW5rIHJhc3Rlcml6ZVBvbHlnb259IGFsbG9jYXRlcyBiZWZvcmUgaXRcbiAqIGZhbGxzIGJhY2sgdG8gY2xpcHBpbmcgYXQgdGhlIHdpbmRvdy4gQWxzbyB0aGUgY2FwIHRoZSB3YW5kL2JydXNoIHVzZSB0b1xuICogZGVjaWRlIHdoZXRoZXIgYSByZWdpb24gY2FuIGJlIGVkaXRlZCBhdCB0aGUgY3VycmVudCB6b29tLlxuICovXG5leHBvcnQgY29uc3QgTUFYX1JBU1RFUl9QSVhFTFMgPSA0MDk2ICogNDA5NjtcblxuLyoqIGBbeDAsIHkwLCB4MSwgeTEsIOKApl1gIGZyb20gcGFyYWxsZWwgYXJyYXlzLCB0aGUgcmluZyBsYXlvdXQgbmFwYXJpLWpzIHRha2VzLiAqL1xuZnVuY3Rpb24gZmxhdFJpbmcoeHM6IEFycmF5TGlrZTxudW1iZXI+LCB5czogQXJyYXlMaWtlPG51bWJlcj4pOiBudW1iZXJbXSB7XG4gIGNvbnN0IG91dCA9IG5ldyBBcnJheTxudW1iZXI+KHhzLmxlbmd0aCAqIDIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgb3V0W2kgKiAyXSA9IHhzW2ldO1xuICAgIG91dFtpICogMiArIDFdID0geXNbaV07XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBSYXN0ZXJpemUgYSBjbG9zZWQgcG9seWdvbiAobWludXMgaXRzIGhvbGVzKSBpbnRvIGEgYmJveC1yZWxhdGl2ZSBtYXNrLCBlLmcuXG4gKiBhcyB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGEgd2FuZC9icnVzaCBzdHJva2UgYWNjdW11bGF0b3IuXG4gKlxuICogUGl4ZWwgKHB4LCBweSkgY292ZXJzIGBbcHgsIHB4ICsgMSkgw5cgW3B5LCBweSArIDEpYCBhbmQgaXMgc2V0IHdoZW4gaXRzIGNlbnRyZVxuICogaXMgaW5zaWRlIOKAlCB0aGUgcnVsZSB1bmRlciB3aGljaCB0aGUgcGl4ZWwtZWRnZSBvdXRsaW5lcyBgZ2VvbWV0cnkvY29udG91cmBcbiAqIHRyYWNlcyBjb21lIGJhY2sgYXMgZXhhY3RseSB0aGUgcGl4ZWxzIHRoZXkgd2VyZSB0cmFjZWQgZnJvbS5cbiAqXG4gKiBSZXR1cm5zIHRoZSBiYm94IG9yaWdpbiBwbHVzIHRoZSBmaWxsZWQgbWFzaywgb3IgbnVsbCBpZiB0aGUgcG9seWdvbiBpc1xuICogZGVnZW5lcmF0ZSAoY292ZXJzIG5vIHBpeGVsIGNlbnRyZSkuIFRoZSBwb2x5Z29uJ3MgZnVsbCBleHRlbnQgaXMga2VwdCBldmVuXG4gKiB3aGVyZSBpdCBpcyBuZWdhdGl2ZSBvciBleGNlZWRzIGBpbWFnZVdpZHRoYMOXYGltYWdlSGVpZ2h0YCAoaml0LXVpIzEwMik7IG9ubHlcbiAqIGEgYmJveCBsYXJnZXIgdGhhbiB7QGxpbmsgTUFYX1JBU1RFUl9QSVhFTFN9IGlzIGNsaXBwZWQgdG8gdGhhdCB3aW5kb3cgKHJhcmU6XG4gKiBhIHJlZ2lvbiBlbm9ybW91cyBhdCB0aGUgY3VycmVudCB6b29tOyBhY2NlcHRzIHRoZSBjbGlwKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhc3Rlcml6ZVBvbHlnb24oXG4gIHhwb2ludHM6IG51bWJlcltdLFxuICB5cG9pbnRzOiBudW1iZXJbXSxcbiAgaW1hZ2VXaWR0aDogbnVtYmVyLFxuICBpbWFnZUhlaWdodDogbnVtYmVyLFxuICBob2xlcz86IG51bWJlcltdW11bXSxcbik6IEJCb3hNYXNrIHwgbnVsbCB7XG4gIGlmICh4cG9pbnRzLmxlbmd0aCA8IDMpIHJldHVybiBudWxsO1xuICBjb25zdCBvdXRlciA9IGZsYXRSaW5nKHhwb2ludHMsIHlwb2ludHMpO1xuICBjb25zdCBpbm5lciA9IGhvbGVzPy5tYXAoKHJpbmcpID0+XG4gICAgZmxhdFJpbmcoXG4gICAgICByaW5nLm1hcCgocCkgPT4gcFswXSksXG4gICAgICByaW5nLm1hcCgocCkgPT4gcFsxXSksXG4gICAgKSxcbiAgKTtcbiAgY29uc3QgYm91bmRzID0geyB4OiAwLCB5OiAwLCB3aWR0aDogaW1hZ2VXaWR0aCwgaGVpZ2h0OiBpbWFnZUhlaWdodCB9O1xuICBsZXQgbTogUmV0dXJuVHlwZTx0eXBlb2YgcmFzdGVyaXplUmluZz47XG4gIHRyeSB7XG4gICAgbSA9IHJhc3Rlcml6ZVJpbmcob3V0ZXIsIGlubmVyLCB7IGJvdW5kcywgbWF4UGl4ZWxzOiBNQVhfUkFTVEVSX1BJWEVMUyB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gU3RpbGwgb3ZlciB0aGUgY2FwIG9uY2UgY2xpcHBlZCB0byB0aGUgd2luZG93IChhIGxhcmdlIGV4cG9ydCBtYXNrKTogYWxsb2NhdGUgdGhlIGNsaXAuXG4gICAgaWYgKCEoZXJyIGluc3RhbmNlb2YgUmFuZ2VFcnJvcikpIHRocm93IGVycjtcbiAgICBtID0gcmFzdGVyaXplUmluZyhvdXRlciwgaW5uZXIsIHsgYm91bmRzLCBjbGlwOiB0cnVlLCBtYXhQaXhlbHM6IEluZmluaXR5IH0pO1xuICB9XG4gIHJldHVybiBtICYmIHsgYng6IG0ueCwgYnk6IG0ueSwgYnc6IG0ud2lkdGgsIGJoOiBtLmhlaWdodCwgbWFzazogbS5kYXRhIH07XG59XG5cbi8qKiBSZXR1cm5zIHRydWUgaWYgdGhlIHR3byBiYm94LXJlbGF0aXZlIG1hc2tzIHNoYXJlIGF0IGxlYXN0IG9uZSBzZXQgcGl4ZWwuICovXG5leHBvcnQgZnVuY3Rpb24gbWFza3NPdmVybGFwKGE6IEJCb3hNYXNrLCBiOiBCQm94TWFzayk6IGJvb2xlYW4ge1xuICBjb25zdCBpeDAgPSBNYXRoLm1heChhLmJ4LCBiLmJ4KTtcbiAgY29uc3QgaXkwID0gTWF0aC5tYXgoYS5ieSwgYi5ieSk7XG4gIGNvbnN0IGl4MSA9IE1hdGgubWluKGEuYnggKyBhLmJ3LCBiLmJ4ICsgYi5idyk7XG4gIGNvbnN0IGl5MSA9IE1hdGgubWluKGEuYnkgKyBhLmJoLCBiLmJ5ICsgYi5iaCk7XG4gIGlmIChpeDAgPj0gaXgxIHx8IGl5MCA+PSBpeTEpIHJldHVybiBmYWxzZTtcbiAgZm9yIChsZXQgeSA9IGl5MDsgeSA8IGl5MTsgeSsrKSB7XG4gICAgY29uc3QgYXIgPSAoeSAtIGEuYnkpICogYS5idztcbiAgICBjb25zdCBiciA9ICh5IC0gYi5ieSkgKiBiLmJ3O1xuICAgIGZvciAobGV0IHggPSBpeDA7IHggPCBpeDE7IHgrKykge1xuICAgICAgaWYgKGEubWFza1thciArICh4IC0gYS5ieCldICYmIGIubWFza1ticiArICh4IC0gYi5ieCldKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIEFsbG9jYXRlIGEgZnJlc2ggYWNjdW11bGF0b3IgY292ZXJpbmcgYm90aCBtYXNrcyBhbmQgT1IgdGhlbSBpbi4gVGhlXG4gKiByZXN1bHRpbmcgbWFzaydzIGJib3ggaXMgdGhlIHNtYWxsZXN0IHJlY3RhbmdsZSBjb250YWluaW5nIGJvdGggaW5wdXRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5pb25NYXNrcyhhOiBCQm94TWFzaywgYjogQkJveE1hc2spOiBCQm94TWFzayB7XG4gIGNvbnN0IHV4MCA9IE1hdGgubWluKGEuYngsIGIuYngpO1xuICBjb25zdCB1eTAgPSBNYXRoLm1pbihhLmJ5LCBiLmJ5KTtcbiAgY29uc3QgdXgxID0gTWF0aC5tYXgoYS5ieCArIGEuYncsIGIuYnggKyBiLmJ3KTtcbiAgY29uc3QgdXkxID0gTWF0aC5tYXgoYS5ieSArIGEuYmgsIGIuYnkgKyBiLmJoKTtcbiAgY29uc3QgdWJ3ID0gdXgxIC0gdXgwO1xuICBjb25zdCB1YmggPSB1eTEgLSB1eTA7XG4gIGNvbnN0IHVtYXNrID0gbmV3IFVpbnQ4QXJyYXkodWJ3ICogdWJoKTtcblxuICBjb25zdCBkYXggPSBhLmJ4IC0gdXgwO1xuICBjb25zdCBkYXkgPSBhLmJ5IC0gdXkwO1xuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBhLmJoOyByb3crKykge1xuICAgIGNvbnN0IHNyYyA9IHJvdyAqIGEuYnc7XG4gICAgY29uc3QgZHN0ID0gKHJvdyArIGRheSkgKiB1YncgKyBkYXg7XG4gICAgdW1hc2suc2V0KGEubWFzay5zdWJhcnJheShzcmMsIHNyYyArIGEuYncpLCBkc3QpO1xuICB9XG4gIGNvbnN0IGRieCA9IGIuYnggLSB1eDA7XG4gIGNvbnN0IGRieSA9IGIuYnkgLSB1eTA7XG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGIuYmg7IHJvdysrKSB7XG4gICAgY29uc3Qgc3JjUm93ID0gcm93ICogYi5idztcbiAgICBjb25zdCBkc3RSb3cgPSAocm93ICsgZGJ5KSAqIHVidztcbiAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCBiLmJ3OyBjb2wrKykge1xuICAgICAgaWYgKGIubWFza1tzcmNSb3cgKyBjb2xdKSB1bWFza1tkc3RSb3cgKyAoZGJ4ICsgY29sKV0gPSAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyBieDogdXgwLCBieTogdXkwLCBidzogdWJ3LCBiaDogdWJoLCBtYXNrOiB1bWFzayB9O1xufVxuIl19